陳 剛 閆 航 張亞兵 王俊紅
1(鄭州大學互聯網醫療與健康服務協同創新中心 河南 鄭州 450052)2(鄭州大學護理學院 河南 鄭州 450001)
可穿戴醫療設備是可以直接穿在身上或作為配件穿戴并能傳輸監測數據的一種計算設備[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可穿戴醫療設備的管理。
Node.js是一個基于V8引擎的JavaScript運行環境,采用輕量和高效的事件驅動、非阻塞I/O模型,常用于構建快速、可擴展的網絡應用程序[8]。它由Ryan Dahl于2009年設計并提出,用異步I/O和事件驅動取代多線程,不僅大幅度提升了性能,還減少了多線程開發的復雜性。Node.js不但采用Chrome V8作為引擎,還使用了高效的libev和libeio庫支持事件驅動和異步I/O,并在此基礎上抽象出了層libuv,實現了高性能的運行機制。
Node.js基于事件觸發的方式能夠快速接收可穿戴醫療設備發來的監測數據,相比于其他平臺有著顯著的優勢,并且能夠適用于高并發的運作方式,所以本文所設計的中間件系統選擇Node作為運行支撐環境。
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]。
WebSocket是基于TCP協議實現Web瀏覽器和服務器之間的實時雙向通信技術[10]。它支持持久連接,客戶端與服務器進行一次合法的握手建立WebSocket連接后,服務器便可以主動地向客戶端發送數據[11]。本文采用WebSocket技術實現中間件系統與應用層之間的雙向數據傳輸,在此基礎上進一步封裝管理可穿戴醫療設備的通信接口。
本文提出的體系拓撲結構如圖2所示,該體系由BLE可穿戴醫療設備、設備管理中間件和調用方組成。可穿戴醫療設備管理中間件是核心組成部分,一方面它通過BLE協議接入各類可穿戴醫療設備如血壓計、體溫計和心率計等,實現對可穿戴設備的統一管理與數據處理,同時協調設備資源的調度以實現多設備并發運行。另一方面,中間件通過WebSocket通信方式響應調用方應用程序的操作請求,調用方通過中間件封裝的控制指令完成對可穿戴醫療設備的操作以及健康監測數據的實時傳輸。中間件能夠同時響應多個Socket客戶端的請求,進一步適應了對可穿戴設備的并發操作,而調用方只需實現Socket客戶端訪問中間件即可,能夠兼容各主流平臺如Windows、Android以及MacOS等。

圖2 體系結構拓撲
本文設計的中間件系統軟件架構如圖3所示。Node環境下的程序保持單進程單線程執行,系統由設備驅動層、任務調度層、服務接口層組成。設備驅動層主要是BLE開發程序,通過BLE協議棧實現對低功耗可穿戴醫療設備的基本操作,包括設備掃描、連接、控制以及獲取監測數據。任務調度層由用戶指令解析程序、多設備并發調度程序和監測數據處理程序組成。其中,用戶指令解析程序處理客戶端發來的操作指令,進而執行相應的操作方式。設備并發調度程序負責調度設備資源與客戶端請求,用以實現高效的設備并發操作。監測數據處理程序對設備驅動層獲取的原始監測數據進行規范化處理,將數據轉換為直觀可讀的健康數據。服務接口層主要是WebSocket服務器程序,用來提供中間件與調用者交互的接口,實現兩者的雙向數據傳輸。WebSocket服務器程序一方面接收調用者發來的消息并進行json解析,將解析后的數據傳遞給任務調度層;另一方面將任務調度層發來的健康數據與連接狀態封裝為json格式并發送給調用者。此外,系統還包含一個全局的進程守護程序,負責解決Node可能出現的異常進而防止崩潰,監視全局異常的發生,包括回調函數發生的異常,保證中間件系統的可靠運行。

圖3 中間件軟件架構
本系統以生活中典型的BLE血壓計、BLE心率計和BLE體溫計作為BLE可穿戴醫療設備進行系統的實現與演示。血壓計、心率計、體溫計是三種不同類型的可穿戴醫療設備,也是進行疾病預防與診斷的重要設備。血壓計與非接觸式體溫計由專業廠家生產,而心率計為實驗室自制,以上設備都實現了BLE4.0協議,具有極低的運行和待機功耗。
系統基于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.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 血壓計與心率計控制編碼
相較于大多數智能手機上的可穿戴醫療設備管理方式,本系統實現了多用戶、多設備并發使用的功能。設備并發使用包含兩種場景,一是單個用戶同時使用多臺可穿戴醫療設備,二是多個用戶同時使用各自的可穿戴醫療設備。在可穿戴醫療設備基本操作實現的基礎上,本文提出了以設備池為中心的調度策略來解決多用戶、多設備并發使用問題。結合實際場景考慮,一臺可穿戴醫療設備同時只能服務一個用戶,當用戶選擇某臺設備時,分配給用戶與該設備相關的資源,直到用戶使用完畢后才能釋放資源,設備調度工作流程如圖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{}列表中對應設備的關聯對象清空,該可穿戴醫療設備可重新分配給其他的客戶端。
本文基于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]。
本文將中間件系統部署于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 客戶端界面設計
本文通過所設計的客戶端分別連接BLE體溫計、血壓計和心率計設備,中間件系統立即執行外圍設備掃描、設備連接以及特征值發現操作。為便于觀察,采用VS Code編輯器進行輸出結果的顯示,體溫計與血壓計連接操作的中間件系統執行結果如圖9所示,系統掃描設備后返回設備的廣播信息如設備名、設備MAC地址、設備連接狀態等,測試表明中間件系統均能夠快速掃描、連接可穿戴醫療設備,并能夠成功匹配操作設備所需的特征值。

(a) 體溫計 (b) 血壓計圖9 可穿戴醫療設備連接狀態圖
為更好地演示客戶端跨平臺的效果以及多設備并發操作的性能,在Windows10平臺中通過Chrome瀏覽器啟動一個客戶端連接心率計設備,同時在兩臺Android7.1移動終端通過QQ瀏覽器啟動客戶端分別連接體溫計與血壓計設備。三個客戶端在同時段進行各自的健康監測,通過Date()方法獲取當前的時間進行對照。可穿戴醫療設備健康監測的效果如圖10所示。測試表明三個客戶端并發運行下均能夠獨立地操作可穿戴醫療設備,中間件正確執行連接設備、開始測量和關閉設備的指令,解析健康監測數據并實時傳輸到客戶端。

(a) 體溫計監測數據 (b) 血壓計監測數據 (c) 心率計監測數據圖10 并發操作與數據傳輸測試
中間件系統各項測試結果表明,基于Node.js的可穿戴醫療設備管理系統能夠進行便捷有效的設備操控,系統運行穩定,能夠正常完成可穿戴醫療設備連接、控制、數據傳輸等工作。相比于安卓,在通用平臺上進行可穿戴醫療設備的管理有著更強的響應速度和更快的數據處理能力,并能夠實現設備并發的操作,非常適合有著計算需求和并發測量的應用場景。
本文提出并開發了一種適用于通用平臺的可穿戴醫療設備管理中間件,實現了病房場景下多傳感器設備的綜合管理功能,進而擴展了可穿戴醫療設備的應用場景。基于本文工作,后續將會進一步增強對傳感器設備的管理能力,通過定義標準化接口來兼容更多廠家、類型的可穿戴醫療設備,設計兼顧結構化、半結構化數據的數據預處理模塊來支持復雜多樣的傳感器數據類型,并進一步優化支持多傳感器的并發管理任務,為可穿戴醫療設備的管理提供一種靈活易用、更趨智能化的方式。