近几年来, 心脑血管疾病成为了危及人类健康的主要疾病之一。 心电信号是进行病理诊断的依据, 现有心电监护系统主要包括2 种: (1)记录病人心电数据的Holter 系统; (2)病房的心电监护系统。 前者携带方便, 但不能进行实时诊断; 后者可以用于诊断, 但只能在医院使用。
本文以AIKD812-256 心电图采样模块与智能手机为核心设计一种具有蓝牙通信接口的便携式心电监护系统。 该心电图监护系统将心电图机采集到的心电数据通过蓝牙接口传输至手机, 手机可以实时存储心电数据, 并能根据需要将心电数据通过GPRS/3G 网络传输至医疗中心服务器, 供专业人员诊断。 文章安排如下: 第1 部分给出具有蓝牙接口的心电图机设计方案;第2 部分为手机软件设计方法, 包括蓝牙通信、心电数据存储、心电数据发送至服务器, 并对其实现过程中的关键代码进行分析; 第3 部分为测试情况与小结。
1 心电图机设计方案
1.1 系统简介
心电图是一门较为深奥的学科, 一般情况下, 基层医疗单位医生、心血管患者不可能都是心电图方面的专家。 本文提出的系统以具有优质资源的医疗机构为服务中心, 通过Internet 网络与多个位于乡镇或农村、重点监护病人的心电图机终端互连, 在一定程度上解决"看病难"问题。 本系统主要由如下4 部分组成: 心电图机、安装有专用软件的手机、专家诊断终端、1 个医疗中心服务器, 系统结构框图如图1 所示。
图1 系统结构框图。
其中, 心电图机与手机一一对应, 其数量m 为系统中需要心电监测的用户数; 专家诊断终端数n 是系统中专家为用户进行诊断操作的计算机数。
在该系统中,心电图机采集人体的心电数据, 并通过蓝牙将测得的心电图数据传送至手机, 实时地显示在手机屏幕上,根据用户设置可以将心电数据存储在手机中或通过GPRS/3G 网络传输至医疗中心服务器。
专业人员可以在专家诊断终端上对上传的心电数据进行诊断,并利用电子邮件或短信将诊断完成的消息通知对应用户, 以便用户通过手机软件提取诊断结果。
限于文章篇幅, 本文重点介绍系统中心电图机与手机软件的设计方法。
1.2 AIKD812-256 模块及其应用
本文心电图机设计以AIKD812-256 模块为核心。
该模块是专用于心电信号采样的产品, 采用同步12导联采样, 单5V电源供电。 它有八个差分信号输入通道, 使用精密运算放大器、24 位模数转换器和高速处理器, 整个电路被封装在1.5×1.5×0.381 英寸的模块内, 并在处理器上安装了有效的数字滤波器算法, 使得本产品非常容易在强噪声背景、高输出阻抗环境下获取微小的心电图信号。
该模块以UART 串行方式输入输出数据,3.3V的TTL 电平, 波特率为115200bps, 数据格式为8 位数据位、1 位停止位、非校验。 对心电图采样模块的控制操作采用一定格式的命令帧, 命令帧均由20 字节组成。
如表1 所示, 其中帧头的4 个字节固定为"AIKD"字符串, 校验和为帧前面19 字节的异或结果, 具体的命令和附加字节表示的含义可参考资料[6], 在此只给出本文用到的命令字节, 如表2 所示, 其中开始命令的附加字节为1、2 时, 模块输出数据类型分别为Wilson导联、Frank 导联; 模块收到握手命令后, 会回送15字节的应答帧。
表1 模块的控制帧格式
表2 模块的控制命令字节
模块收到开始命令后, 开始每2ms 输出一个心电数据帧, 每帧16 字节, 当输出为Wilson 体系时, 数据包内包括II、III、V1~V6 导联的数据(分别记为DII、DIII、DV1~DV6), 手机终端接收到数据帧后可以计算出I、avR、avL 和avF 导联的数据(分别记为DI、DavR、DavL、DavF), 计算方法如下:
DI = DII-DIII
DavR = DIII/2-DIII
DavL = DII/2-DIII
DavF = (DII+DIII)/2
1.3 蓝牙接口设计
在模块的硬件连接上, 心电图采样模块的输入端串联10K电阻后可直接连接导联线, 如图2 所示。 图中蓝牙模块采用HC-06, 该模块采用CSR 蓝牙芯片,遵循蓝牙V2.0协议标准, 模块尺寸为3.57×1.52cm,利用串口的TXD、RXD 信号脚与心电图采样模块直接相连, 波特率设置为115200bps。由于心电图采样模块与蓝牙模块尺寸小, 因此整个心电图机体积小巧,便于携带。
图2 心电图机主要电路的连接图
2 手机软件设计
为了实现整个系统目标, 在手机终端中必须安装心电数据存储与收发软件。 该软件具有如下功能: 通过蓝牙实现心电数据接收、心电数据的存储、通过GPRS/3G 向中心服务器发送心电数据。
本文手机终端软件采用J2ME 进行编程, 下面对这些功能实现过程中的关键代码进行分析。
2.1 蓝牙通信
(1) 蓝牙查寻连接
系统设计时将手机作为客户端、蓝牙模块作为服务端, 即利用手机去搜索并连接蓝牙模块。 需要注意的是, 用手机与蓝牙模块连接, 首先得保证手机具有蓝牙功能。
整个蓝牙连接过程包括客户端搜索附近蓝牙设备、在搜索到的指定蓝牙设备上搜索蓝牙服务、连接搜索到的蓝牙服务, 最后实现数据的互通,具体的关键代码如下:
LocalDevicelocalDevice=LocalDevice.getLocalDevice(); // 取得本地蓝牙设备
discoveryAgent = localDevice.getDiscoveryAgent();// 取得蓝牙代理
上面两步通过后, 就可以确定本设备带有蓝牙接口, 并同时启动蓝牙功能。 通过上述步骤后, 利用
discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this);
开始搜索附近蓝牙设备, 搜索到设备后自动调用deviceDiscovered()回调方法, 在deviceDiscovered()方法里添加设备。 本系统中每次只连接一个设备,所以一旦搜到一个设备后就通过discoveryAgent.
cancelInquiry() 方法取消设备搜索, 自动调用inquiryCompleted()回调方法, 在inquiryCompleted()中添加discoveryAgent.searchServices()程序搜索在设备上服务, 每发现一个服务时都会自动调用servicesDiscovered(), 完成全部搜索服务后自动调用serviceSearchCompleted()方法。
在搜索到蓝牙设备, 并在蓝牙设备上搜索到串口服务器后, 通过:
url = sr.getconnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
conn = (StreamConnection) Connector.open(url);
实现蓝牙的连接。
(2) 手机与心电图模块通信。
蓝牙连接成功后利用conn.openDataInputStream()打开输入流、conn.openDataOutputStream()打开输出流,通过read()或write()方法进行数据通信。 在通信过程中主要实现2 个功能: 手机控制心电图模块、手机接收来自心电图模块的数据, 其中手机控制心电图模块主要包括握手信号的发送、开始命令和停止命令的发送。
为了实现手机与心电图机的数据通信连接, 手机首先发送握手信号到蓝牙模块。 根据表2, 可以知道发送握手信号的格式以及发送代码为:
同样, 还可以采用上述方法发送不同控制命令的字节数组到心电图模块, 控制心电图机进行相应的操作, 如开始命令和停止命令, 限于文章篇幅, 在此不作赘述。
手机接收到应答帧后发送开始传输命令帧, 接着开始接收心电图数据。 手机接收心电图数据的关键程序代码结构如下:
2.2 心电数据存储
手机终端一个重要功能就是心电数据的存储。 在J2ME 程序中, RMS(Record Management Store 的缩写)记录库是一个小型的简单数据库管理系统, 可以用来保存应用程序中的数据。
RMS 具体的存储方式由各设备厂商自己实现, 存储的位置也会因为设备厂商的不同而不同。 在RMS 中,每一条数据被称为一条记录, 记录库实际是记录的集合。 本文将一个心电数据作为一个记录存入记录库。
一个记录格式如表3 所示。
表3 心电数据记录格式
其中, 头部信息包含预设的用户信息以及心电数据的保存时间, 校验和为前面80127 个字节的异或和。
从一个记录格式可知, 由于心电图机每2ms 输出16 个字节的数据, 所以一个保存的心电图时间长度为(8126-127+1)×2/16=10000ms, 即10s.
记录中头部信息的时间信息为心电数据保存时手机的系统时间, 可以利用如下代码得到:
Calendar c = Calendar.getInstance();
Date d = c.getTime();
然后从d 中提取年月日以及时分的具体数据, 并与上述接收到的心电数据一起存入记录库中。
对于记录库的操作, 先要打开记录库, 然后对记录库进行操作, 其中包括记录的增加、删除、修改等,最后将记录库关闭。 具体主要通过以下方法实现记录库的操作:
penRecordStore(rsName,true); //打开名为rsName 的记录库
deleteRecordStore(rsName); //删除名为rsName 的记录库
addRecord(b, 0, b.length); //添加数组b 到记录库
getRecord(id); //读取第id 条记录
setRecord(id,b,0,b.length); //将第id 条记录设置成字节数组b
2.3 心电数据发送至服务器
本设计中采用TCPSocket方式与中心服务器进行数据通信, MIDP2.0 中定义了SocketConnection 和ServerSocketConnection 接口用于实现TCP Socket 编程。
由于本系统中手机端作为客户端, 所以只用到了SocketConnection 接口。
为了实现Socket 通信, 必须先建立连接sc=(SocketConnection)Connector.open(url);
其中url 为服务器的地址, 本系统中url=Socket://61.
153.1.12:5000, 即服务器IP 地址为61.153.1.12.
为了防止因服务器未开而导致的长时间连接, 程序中设置了一个定时器, 在经过设定的时间后仍未连接成功, 给出提示, 并终止连接。 如果成功建立连接,则打开输出流和输入流:
dos=new DataOutputStream(sc.openOutputStream());
dis=new DataInputStream(sc.openInputStream());
同时, 为了防止传输过程中出现数据差错, 本设计中单帧心电图数据采用固定长度的格式传输, 具体格式参见表3, 实际传输时在该表的格式前增加一个帧头"A1A2A3". 当中心服务器收到此帧头时, 就认为帧头后续的数据为表3 格式的心电图数据。 一帧数据接收完后对其中校验和进行核查, 如果核查结果正确, 发送"OK"字符串至手机终端; 反之, 发送"ER"字符串, 以便提示手机终端重传心电图数据。
另外, 为了便于中心服务器存储心电数据, 上传至服务器的心电数据包括预设的用户信息以及心电记录的保存时间。 专家诊断完成后, 根据用户信息(如电子邮件或手机号码)通知用户提取诊断结论。