基于Node.js的BLE可穿戴医疗设备管理中间件研究与实现

2019-06-17 09:28张亚兵王俊红
计算机应用与软件 2019年6期
关键词:体温计中间件监测数据

陈 刚 闫 航 张亚兵 王俊红

1(郑州大学互联网医疗与健康服务协同创新中心 河南 郑州 450052)2(郑州大学护理学院 河南 郑州 450001)

0 引 言

可穿戴医疗设备是可以直接穿在身上或作为配件穿戴并能传输监测数据的一种计算设备[1]。各类可穿戴医疗设备在医院病房中发挥着关键的作用。首先,可穿戴医疗设备是护士对病人进行日常健康监测的重要工具;其次,在健康方面对特定的生命体征需要进行24 h监护[2]。由于采取有线通信方式的传统可穿戴医疗设备在治疗过程中导线会限制患者的活动,越来越多的可穿戴医疗设备开始采用无线的通信方式。低功耗蓝牙是蓝牙4.0开始在其标准的基础上针对低功耗应用进行优化后的标准,凭借快速连接与超低功耗的显著特点,已经广泛应用于医疗保健、可穿戴设备等领域[3]。

近年来绝大多数BLE可穿戴医疗设备由智能手机管理。甘广辉等[4]提出了一种基于低功耗蓝牙的家用胎儿监护系统,实现了对胎心率、宫缩压和胎动生理信号的采集与传输,并通过手机对数据进行显示和存储以实现胎儿的实时监护。张金玲等[5]设计了一种基于蓝牙低功耗协议的手机无线心电和血氧健康监护系统,通过手机客户端程序实现人体心电和血氧参数的实时监控。而通用平台Windows或Linux上的开发应用较少,谢佳柏等[6]设计了一款基于BLE与WebSocket的数据网关,实现了低功耗蓝牙网络对手机、平板和笔记本电脑的兼容性,但是该数据网关采用的是51内核,处理能力较弱,仅支持同时连接3个简单的传感器节点。在医院病房下的健康监测场景中,多设备并发使用、健康数据处理、患者管理等操作需要强大的计算能力与通用平台编程需求。此外,由于各个厂家的设备开发标准体系不互通,智能手机中的一个APP只能连接同厂家的可穿戴医疗设备,难以跨厂家、跨平台管理多种设备[7]。

鉴于此,本文提出了基于Node.js的BLE可穿戴医疗设备管理系统。由于Node.js具备跨平台的特点,本系统可以灵活部署于Windows和Linux系统上。通过该中间件系统可以集中进行多种可穿戴医疗设备的管理,同时系统对应用程序提供调用接口,从而应用程序无需安装专用的BLE软件。本系统实时性强,响应速度快,支持并发操作,能够以一种更加高效的方式进行BLE可穿戴医疗设备的管理。

1 相关技术

1.1 Node.js环境

Node.js是一个基于V8引擎的JavaScript运行环境,采用轻量和高效的事件驱动、非阻塞I/O模型,常用于构建快速、可扩展的网络应用程序[8]。它由Ryan Dahl于2009年设计并提出,用异步I/O和事件驱动取代多线程,不仅大幅度提升了性能,还减少了多线程开发的复杂性。Node.js不但采用Chrome V8作为引擎,还使用了高效的libev和libeio库支持事件驱动和异步I/O,并在此基础上抽象出了层libuv,实现了高性能的运行机制。

Node.js基于事件触发的方式能够快速接收可穿戴医疗设备发来的监测数据,相比于其他平台有着显著的优势,并且能够适用于高并发的运作方式,所以本文所设计的中间件系统选择Node作为运行支撑环境。

1.2 BLE协议简介

BLE即蓝牙低功耗技术,是一种低成本、短距离、超低功耗的无线传输技术[3]。如图1所示为BLE协议栈,BLE应用的开发所要关注的是通用访问配置(GAP)子协议与通用属性配置(GATT)子协议。

图1 BLE协议栈

GAP协议负责控制设备连接和广播。通常将设备分为中心设备(Central)与外围设备(Peripheral),中心设备负责扫描并连接其他外围设备,外围设备则将自身的设备信息对外广播[9]。本设计方案中,可穿戴医疗设备作为外围设备,而部署中间件系统的计算机则作为中心设备。

GATT协议是负责双方数据传输的通用规范,把各种属性表示为服务(Service)的集合,每个服务都有一个 128 bit 的 UUID 作为这个服务的标识。为了提高传输效率,蓝牙联盟也定义了较短的16 bit的UUID来使用。服务由若干个特征值(Characteristic)组成,每一个特征值也有唯一的 UUID 作为标识符。特征值由一个value和零个或多个对value的描述组成,相关的监测数据即存储于特征值中[9]。

1.3 WebSocket通信技术

WebSocket是基于TCP协议实现Web浏览器和服务器之间的实时双向通信技术[10]。它支持持久连接,客户端与服务器进行一次合法的握手建立WebSocket连接后,服务器便可以主动地向客户端发送数据[11]。本文采用WebSocket技术实现中间件系统与应用层之间的双向数据传输,在此基础上进一步封装管理可穿戴医疗设备的通信接口。

2 中间件架构设计

2.1 体系拓扑结构

本文提出的体系拓扑结构如图2所示,该体系由BLE可穿戴医疗设备、设备管理中间件和调用方组成。可穿戴医疗设备管理中间件是核心组成部分,一方面它通过BLE协议接入各类可穿戴医疗设备如血压计、体温计和心率计等,实现对可穿戴设备的统一管理与数据处理,同时协调设备资源的调度以实现多设备并发运行。另一方面,中间件通过WebSocket通信方式响应调用方应用程序的操作请求,调用方通过中间件封装的控制指令完成对可穿戴医疗设备的操作以及健康监测数据的实时传输。中间件能够同时响应多个Socket客户端的请求,进一步适应了对可穿戴设备的并发操作,而调用方只需实现Socket客户端访问中间件即可,能够兼容各主流平台如Windows、Android以及MacOS等。

图2 体系结构拓扑

2.2 软件架构

本文设计的中间件系统软件架构如图3所示。Node环境下的程序保持单进程单线程执行,系统由设备驱动层、任务调度层、服务接口层组成。设备驱动层主要是BLE开发程序,通过BLE协议栈实现对低功耗可穿戴医疗设备的基本操作,包括设备扫描、连接、控制以及获取监测数据。任务调度层由用户指令解析程序、多设备并发调度程序和监测数据处理程序组成。其中,用户指令解析程序处理客户端发来的操作指令,进而执行相应的操作方式。设备并发调度程序负责调度设备资源与客户端请求,用以实现高效的设备并发操作。监测数据处理程序对设备驱动层获取的原始监测数据进行规范化处理,将数据转换为直观可读的健康数据。服务接口层主要是WebSocket服务器程序,用来提供中间件与调用者交互的接口,实现两者的双向数据传输。WebSocket服务器程序一方面接收调用者发来的消息并进行json解析,将解析后的数据传递给任务调度层;另一方面将任务调度层发来的健康数据与连接状态封装为json格式并发送给调用者。此外,系统还包含一个全局的进程守护程序,负责解决Node可能出现的异常进而防止崩溃,监视全局异常的发生,包括回调函数发生的异常,保证中间件系统的可靠运行。

图3 中间件软件架构

3 系统实现

本系统以生活中典型的BLE血压计、BLE心率计和BLE体温计作为BLE可穿戴医疗设备进行系统的实现与演示。血压计、心率计、体温计是三种不同类型的可穿戴医疗设备,也是进行疾病预防与诊断的重要设备。血压计与非接触式体温计由专业厂家生产,而心率计为实验室自制,以上设备都实现了BLE4.0协议,具有极低的运行和待机功耗。

3.1 系统的环境准备

系统基于Node平台采用JS语言编写,可以将Node环境部署于Windows或Linux系统上从而实现跨平台的可穿戴医疗设备接入。首先,部署系统的平台需要通过外接蓝牙适配器来实现BLE功能,中间件系统在BLE开发中就充当了中心设备的角色。

近年来随着Node.js的广泛应用,Node社区也涌现了很多优秀的资源。第三方库noble是基于Node环境封装的低功耗蓝牙库,它基于GAP协议与GATT协议对BLE蓝牙的基础功能进行了封装,并结合C++与python语言进行了低功耗蓝牙底层协议的开发。ws库是Node环境中流行的用以实现WebSocket协议的开发包,它具有快速、易用和稳定的特点,并且同时实现了服务器与客户端。因此本文基于noble库进一步丰富低功耗医疗类型设备的开发工作,实现对可穿戴医疗设备的扫描、连接、特征值发现等BLE开发基本操作,引入ws库实现WebSocket传输协议,示意代码如下:

const WebSocket=require(′ws′);

var noble=require(′./lib/noble′);

3.2 可穿戴医疗设备基本操作实现

中间件系统在低功耗设备开发中实现的基础功能依次为外围设备扫描、设备连接、发现服务、发现特征值以及数据写入与读取,相应地就可以完成系统对可穿戴医疗设备的连接、测量控制与数据传输工作。

3.2.1可穿戴医疗设备开发基本流程

本文借助noble库实现低功耗蓝牙的基础功能,可穿戴医疗设备的基本操作开发主要包括以下步骤:

(1) 中间件系统开启蓝牙扫描。通过调用方法noble.startScanning(serviceUUID)扫描相应的BLE设备,参数为所要连接设备主服务的UUID号。

(2) 设备连接。成功扫描到所要连接的BLE可穿戴医疗设备后会触发设备发现的事件,在事件的回调函数中通过返回的peripheral对象执行设备连接操作并停止蓝牙扫描。peripheral即是通过扫描获取到的外围设备对象,示意代码如下所示:

noble.on(′discover′, function(peripheral) {

noble.stopScanning();

//停止扫描

peripheral.connect(function(err) {…})

//连接BLE设备

})

连接成功后才能进行后续的一系列操作,此时可穿戴医疗设备被系统占用,且不可被其他中心设备所连接。

(3) 发现服务。系统要获取的服务是与健康监测数据相关的服务,通过方法peripheral.discoverServices(s erviceUUID)发现服务,参数为所要获取服务的UUID值。

(4) 发现特征值。在发现服务方法的回调函数中通过返回的service对象调用service.discoverCharacteris tics()方法来发现特征值,此方法的回调函数中返回该服务下的所有特征值,然后遍历所有特征值来匹配到健康数据相关的特征值,主要包括write特征值和notify特征值。write特征值用来向可穿戴医疗设备发送数据,而notify特征值则是从可穿戴医疗设备中获取健康监测数据。

(5) 设备控制与数据读取。通过write特征值调用方法characteristic.write()并传入控制指令来控制可穿戴医疗设备,主要包括启动设备、关闭设备的命令。通过notify特征值调用characteristic.subscribe()方法启动BLE设备特征值变化时的notify功能,实现对监测数据的监听。如果可穿戴医疗设备有新的数据变化,notify特征值的回调函数就会触发,系统从回调函数中读取监测数据。

系统从可穿戴医疗设备直接收到的数据为原始的字节流数据,必须要对数据进行解析以及规范化处理。BLE健康数据传输格式一般由起始位、数据位和结束位组成,需要从数据位中获取健康数据[12]。然而,不同厂家、不同类型的设备对健康数据也存在着不同的编码方式,必须针对具体的可穿戴医疗设备采取对应的算法进行健康数据的解析与处理。通常情况下,数据解析与处理的流程如图4所示。

图4 数据处理流程

(6) 断开连接。完成测量之后通过write特征值向可穿戴医疗设备发送关闭设备的指令,之后通过步骤(2)中的peripheral对象执行peripheral.disconnect()方法断开连接,解除设备占用并释放系统资源。

3.2.2可穿戴医疗设备的控制

系统与可穿戴医疗设备建立连接并且匹配好读写相关的特征值后,系统将控制指令写入write特征值对可穿戴医疗设备进行控制,包括开始测量、停止测量、关闭设备等常用的操作。不同的可穿戴医疗设备对应着不同的指令编码,写入的数据应转换为byte类型的数组。

根据可穿戴医疗设备实际控制需求,本文所使用的血压计和心率计的开始测量、关闭设备指令以十六进制表示的编码如表1所示。而系统对体温计只提供监测数据、关闭连接的控制指令,开始测量、关闭设备的操作由设备自身完成。

表1 血压计与心率计控制编码

3.3 多设备并发实现

相较于大多数智能手机上的可穿戴医疗设备管理方式,本系统实现了多用户、多设备并发使用的功能。设备并发使用包含两种场景,一是单个用户同时使用多台可穿戴医疗设备,二是多个用户同时使用各自的可穿戴医疗设备。在可穿戴医疗设备基本操作实现的基础上,本文提出了以设备池为中心的调度策略来解决多用户、多设备并发使用问题。结合实际场景考虑,一台可穿戴医疗设备同时只能服务一个用户,当用户选择某台设备时,分配给用户与该设备相关的资源,直到用户使用完毕后才能释放资源,设备调度工作流程如图5所示。

图5 设备调度工作流程图

本研究处理设备多连接的方法是为每一个已连接的客户端生成一个包含四个关键属性的对象,对象包含WebSocket客户端接口、设备对象、设备write特征值和设备notify特征值,实例化代码如下所示:

function user_info(user_ws, peripheral,ble_notify, ble_write){

this.user_ws=user_ws;

this.peripheral=peripheral;

this.ble_notify=ble_notify;

this.ble_write=ble_write;

}

此对象的作用是保存控制可穿戴设备所需要的关键资源,并建立调用者与可穿戴设备的对应关系。多用户同时进行各自的健康监测时,每台可穿戴医疗设备都会从自身的关联对象中进行设备控制、数据处理以及数据传输工作,能够保证用户只与所使用的可穿戴医疗设备进行交互,不同设备之间的操作互不影响。当一个用户同时使用多台可穿戴医疗设备时,则建立多个user_info对象来关联多台设备,用户同时与多台设备进行互不影响的交互,实现多设备联动健康监测。具体方法如下:

(1) 客户端选择可穿戴医疗设备,中间件系统完成设备连接、服务与特征值发现后,调用函数user_info()实例化一个对象实现用户与设备之间的关联。同时将该对象以key-value的形式保存在user{}列表中,key设置为可穿戴医疗设备名称,value为用户关联对象,user{}设备池中保存所有用户关联对象。

(2) 客户端发起测量指令后,在user{}列表中索引对应设备的关联对象,调用关联对象的ble_write特征值启动测量任务。中间件系统通过关联对象的ble_notify特征值监听可穿戴医疗设备发送来的血压或心率等监测数据,同时调用关联对象的WebSocket接口发送给使用此设备的用户。

(3) 测量任务结束后,中间件系统通过关联对象的peripheral属性来执行peripheral.disconnect()函数断开所连接的健康设备,解除设备资源占用。

(4) 最后将user{}列表中对应设备的关联对象清空,该可穿戴医疗设备可重新分配给其他的客户端。

3.4 可穿戴设备管理接口设计

本文基于WebSocket通信技术为调用方提供管理设备的接口,中间件系统在WebSocket通信中作为服务器端,而调用方的应用程序则作为客户端。如图6所示为中间件设备管理流程图,首先使用方法const wss=new WebSocket.Server({port:2800})创建WebSocket服务器并将端口设备为2800。服务器端基于事件驱动完成客户端的请求,主要事件函数包括′connection′、′message′、′close′,分别对应连接建立、收到数据、连接断开的事件回调[13]。

图6 可穿戴医疗设备管理流程图

服务器实时处于监听状态,当有客户端建立连接后触发′connection′事件并返回客户端对象ws。服务器在′message′事件回调中解析用户指令,中间件提供的操作指令接口分别为设备连接、开始测量和关闭设备。其中,设备连接指令用来连接用户所选择的可穿戴医疗设备,并将连接状态发送给用户。开始测量指令则启动可穿戴医疗设备以进行生命体征测量,中间件实时获取监测数据并进一步处理后发送给用户。关闭设备指令是将可穿戴医疗设备关闭并断开与设备之间的蓝牙连接以释放资源,同时将设备连接状态发送给用户。服务器通过ws.send(msg)方法向客户端发送数据,参数msg为发送的内容并封装为JSON格式,msg的内容为设备连接状态和健康监测数据。客户端退出后触发′close′事件,在此回调函数中首先检查用户所关联的设备是否关闭,若存在没有关闭的设备则强制关闭以上设备,最后进行设备资源的释放。

客户端与服务器建立连接之后就可以进行双向通信,双方只需要进行一次请求/响应操作,之后每次通信传输的都为控制指令和健康数据,加快了数据传输的速度,进一步提高数据传输的实时性[14]。

4 中间件系统测试

本文将中间件系统部署于Windows10操作系统,首先从Windows命令行程序中进入系统项目的根目录,执行node healthy_central.js运行中间件程序,中间件系统就会以后台的方式挂起并开始监听2800端口。

本系统以接入的血压计、体温计和心率计来进行演示,设备实物图如图7所示。BLE血压计为专业厂家深圳奥又美公司生产;BLE体温计由深圳智子云守护科技公司生产的新一代非接触式体温计;BLE心率计由团队通过心率传感器、温度传感器、电源和低功耗蓝牙RF芯片制作而成。血压计能够测量实时血压值并得出舒张压、收缩压和平均心率,非接触式体温计能够快速、精准测量体温,心率计能够实时进行心率和室内温度的测量。

图7 设备实物图

目前主流的浏览器如Chrome、Firefox等均已支持WebSocket API,所以本文采用HTML5+JavaScript语言编写了简易的Web界面通过WebSocket客户端来访问系统接口,从而作为调用方来进行便捷的演示。该客户端同时适应了电脑与移动端设备,页面设计如图8所示。客户端通过浏览器访问中间件系统来管理可穿戴医疗设备,主要实现了onopen()、onmessage()、onclose()等回调函数,触发事件分别为连接建立、接收中间件数据、连接关闭,并通过send()函数主动向中间件发送数据。当客户端与中间件建立连接后,用户可发送指令来管理可穿戴医疗设备,客户端页面会实时显示设备连接状态与健康数据。

图8 客户端界面设计

4.1 可穿戴医疗设备连接测试

本文通过所设计的客户端分别连接BLE体温计、血压计和心率计设备,中间件系统立即执行外围设备扫描、设备连接以及特征值发现操作。为便于观察,采用VS Code编辑器进行输出结果的显示,体温计与血压计连接操作的中间件系统执行结果如图9所示,系统扫描设备后返回设备的广播信息如设备名、设备MAC地址、设备连接状态等,测试表明中间件系统均能够快速扫描、连接可穿戴医疗设备,并能够成功匹配操作设备所需的特征值。

(a) 体温计 (b) 血压计图9 可穿戴医疗设备连接状态图

4.2 可穿戴医疗设备并发操作以及数据传输测试

为更好地演示客户端跨平台的效果以及多设备并发操作的性能,在Windows10平台中通过Chrome浏览器启动一个客户端连接心率计设备,同时在两台Android7.1移动终端通过QQ浏览器启动客户端分别连接体温计与血压计设备。三个客户端在同时段进行各自的健康监测,通过Date()方法获取当前的时间进行对照。可穿戴医疗设备健康监测的效果如图10所示。测试表明三个客户端并发运行下均能够独立地操作可穿戴医疗设备,中间件正确执行连接设备、开始测量和关闭设备的指令,解析健康监测数据并实时传输到客户端。

(a) 体温计监测数据 (b) 血压计监测数据 (c) 心率计监测数据图10 并发操作与数据传输测试

中间件系统各项测试结果表明,基于Node.js的可穿戴医疗设备管理系统能够进行便捷有效的设备操控,系统运行稳定,能够正常完成可穿戴医疗设备连接、控制、数据传输等工作。相比于安卓,在通用平台上进行可穿戴医疗设备的管理有着更强的响应速度和更快的数据处理能力,并能够实现设备并发的操作,非常适合有着计算需求和并发测量的应用场景。

5 结 语

本文提出并开发了一种适用于通用平台的可穿戴医疗设备管理中间件,实现了病房场景下多传感器设备的综合管理功能,进而扩展了可穿戴医疗设备的应用场景。基于本文工作,后续将会进一步增强对传感器设备的管理能力,通过定义标准化接口来兼容更多厂家、类型的可穿戴医疗设备,设计兼顾结构化、半结构化数据的数据预处理模块来支持复杂多样的传感器数据类型,并进一步优化支持多传感器的并发管理任务,为可穿戴医疗设备的管理提供一种灵活易用、更趋智能化的方式。

猜你喜欢
体温计中间件监测数据
含汞体温计将全部退市
体温计
我国自主可控中间件发展研究
咬破了体温计怎么办
浅谈环境监测垂直管理的优势
环保验收监测异常数据的分析与处理探讨
以实力证明 用事实说话
云计算环境下中间件的负载均衡机制研究
金蝶 引领中间件2.0新时代
北京经济社会发展月度监测数据(2008年11月)