藍 坤,張 躍
(清華大學深圳研究生院 嵌入式系統與技術實驗室,廣東 深圳518055)
在醫療監護系統中,心電監護處于十分重要的地位,據世界衛生組織統計,截至2011年,平均每年有接近1700萬的人死于心血管疾病,約占全球死亡人數的29%。其中,80%以上發生在低收入和中等收入國家,到2030年,幾乎有2360萬人將死于心血管病[1]。由于醫院監護條件、患者經濟條件和個人時間的制約,對這部分人群的監護覆蓋面不足,無法在患者病危時及時施救,無法及時跟蹤亞健康人群的生理參數作到有效預防心血管疾病的發生。針對這種需求,清華大學深圳研究生院嵌入式系統與技術實驗室研發了遠程無線多生理參數實時監測與分析網絡平臺[2],通過3G無線網絡、Internet、移動監護終端、服務器實時分析軟件完成遠程無線多生理參數的監測和分析。
當前移動互聯網技術的發展以及智能手機等移動終端的普及,使得移動終端在醫療監護系統中扮演者越來越重要的角色。目前主流的智能終端操作系統包括Android,IOS,Windows Phone,相對于IOS的封閉性和 Windows Phone昂貴的價格,Android平臺的免費和開放得到眾多手機開發商的支持[3]。當前基于智能手機平臺進行醫療監護的應用較少,主要應用于醫生移動辦公和遠程信息查詢,本文的目標是設計和實現一個基于Android平臺的心電監護軟件系統,充分利用智能手機等移動終端,結合醫療監控的相關傳感器模塊、串口、藍牙、USB、3G無線網絡等,完成心電數據的實時采集、分析和網絡傳輸,降低監護成本,提高心電監護的便捷性。
Android平臺心電監護軟件系統是本實驗室研發的遠程無線監護系統的重要組成部分,主要由心電數據采集單元、數據網絡傳輸單元、智能終端數據分析單元等組成,通過藍牙、串口連接心電采集設備獲取實時心電采集數據,在Android智能手機上存儲心電數據,對心電數據進行實時分析,及時將分析結果、心電波形顯示給用戶查看,并將心電數據通過無線網絡實時傳輸到監護中心,軟件系統結構如圖1所示。

圖1 心電監護軟件系統結構
實時心電數據的采集包括采集模塊和智能手機兩個硬件組成部分,如圖2所示,涉及兩個過程:①通過心電信號采集模塊,使用導聯線連接人體獲取心電信號,采樣頻率為500Hz,心電信號通過硬件濾波放大,并通過A/D轉換器得到數字信號;②在采集模塊內部對心電信號進行軟件濾波,將去除高頻干擾、肌電干擾、工頻干擾、基線漂移后的心電信號發送至Android智能移動終端供運行于智能移動終端的心電監護軟件處理。

圖2 心電數據采集
2.1.1 心電數據采集與接收
數據采集所采用的采集模塊是基于本實驗室遠程心電實時監護終端[4]實現,通過串口和藍牙與Android智能手機完成通信。
為了從采集模塊完整的接收心電數據,心電信號采集模塊與智能手機之間采用數據包的形式來完成數據通信。每完成一次采樣,采集模塊將12導聯的心電數據按照指定的格式打包后發送至智能手機,心電數據包的格式如圖3所示。
心電數據包各位的意義見表1。

圖3 心電數據包格式

表1 心電數據包項
Android平臺的心電監護軟件在接收到心電數據后,將數據保存在一個緩沖隊列中,使用緩沖隊列的目的是為了后續的數據處理做準備。針對心電數據采樣率高 (500Hz),數據量大的特點,需要一個較大的隊列來保存心電數據。Android的進程內存限制使得當應用程序在Dalvik虛擬機進程內存空間內使用較多內存來存儲數據隊列時,會導致應用程序響應緩慢。解決辦法是使用Android NDK,向系統申請一個6M的存儲空間作為心電數據緩沖隊列,隊列中每個數據包保存著50ms的數據。對緩沖隊列的操作如圖4所示。

圖4 心電數據接收流程
操作步驟包括:
(1)對從采集模塊取回的數據,保存于一個50ms數據大小的連續存儲空間;
(2)連續存儲空間數據滿后,將數據復制到緩沖隊列的尾部,等待收取新的數據;
(3)在隊列頭部,使用一個觀察器,將隊列頭部數據塊復制到前端處理的3個線程做進一步處理。
2.1.2 無鎖緩沖隊列的設計
在后續的數據處理中,采用多線程技術來對數據進行存儲、分析、顯示、網絡傳送等,并且為了提高數據從采集接收到分發的快速完成,有必要將入隊操作和出隊操作放入不同的線程中,因此該緩沖隊列必須是線程安全的。對并發數據結構進行操作時,常用的方法為使用互斥的讀寫鎖,即使用一個互斥鎖來保證緩沖隊列在同一時刻只有一個線程操作。使用互斥鎖來管理同步實現簡單,但是存在較大的效率問題:等待互斥鎖消耗許多寶貴的時間,而每次讀寫操作都需要進行鎖的獲取和釋放。因此,出于對效率和性能的考慮,本文設計使用一個無鎖隊列,降低隊列數據讀寫的等待時間,提高心電數據采集的實時性能。無鎖隊列的實現一般包括CAS,MCAS,WSTM,OSTM等[5]。
在本文設計的心電監護軟件系統中,實時心電數據接收隊列只有一個數據生產者和一個數據消費者,參考CAS技術的實現原理,本文實現的心電數據接收隊列如圖5所示。隊列使用鏈表實現,Head指向隊列頭部節點,Tail指向隊列尾部節點。為了區分等待生產者線程生產數據的節點和等待消費者線程消費數據的節點,在隊列數據結構中保持Divider指向這樣的節點:從該節點到Tail節點之間的節點為等待消費的節點,該節點前以及Tail節點后的節點為等待生產的節點。Head節點只有生產者訪問,而Divider和Tail則為生產者和消費者共享訪問,對這兩個指針設定為原子操作變量。另一方面,為了減少頻繁的內存申請和釋放,隊列使用固定節點數目的循環鏈表,在初始化時即申請完成整個隊列所需的存儲空間。生產者向隊列尾部插入數據的操作:

消費者從隊列頭部取出數據的操作:

在生產者線程中,每次數據入隊后,都會更新隊頭指針位置,保證Head和Divider之間的節點沒有未出隊的節點存在;在消費者線程中,每次取回的數據為Divider下一個節點的數據,這樣保證了即使此時生產者插入節點也不影響消費者獲取當前的隊頭元素。利用Divider來分開生產者和消費者操作的節點,以此來保證隊列操作的線程安全。
2.1.3 心電數據的讀取驅動
本文設計的軟件針對兩種心電數據采集模塊連接方式:專用心電手機的串口通信和普通智能手機的藍牙通信。在Android SDK中,并沒有提供可以直接操作串口的API,因此我們需要使用Android NDK,調用Linux串口驅動完成串口的配置、打開和關閉,然后通過JNI來向上層Framework開發操作接口,最后通過Java API的文件描述符類FileDescriptor來操作串口設備文件。藍牙通信則可直接使用Android SDK的藍牙API,藍牙通信實現流程為打開本機藍牙,搜索周圍設備并與心電數據采集模塊的設備藍牙進行配對,配對成功后雙方使用RFCOMM建立連接和數據通信[6],API中針對每個步驟的操作都有十分詳盡的接口供開發者調用。移動監護軟件根據用戶設置,在不同采集模式下啟用不同的數據讀取驅動來讀取數據并存儲到緩沖隊列。
2.1.4 心電數據的數據庫存儲
在Android智能手機上,使用SQLite3數據庫來存儲心電數據。從心電采集模塊接收到數據后,及時的將數據分發到數據庫存儲線程進行存儲,存儲的方式為按照緩沖隊列的數據塊大小 (50ms)存儲,并保證在數據庫中可查詢某一次連續測量得到的全部數據集已經數據是否已經送達遠程監護中心服務器。根據需求,數據庫的設計包含兩張表:records和ecgs,records表和ecgs表是一對一的關系,在records表中存儲一個心電數據塊的元信息,ecgs表存儲的是實際各導聯心電數據,兩表的數據項如表2所示。
移動心電監護軟件中,數據庫管理模塊提供數據庫查詢、創建、更新和刪除功能。由于在移動設備上的存儲空間有限,長時間連續采集的心電數據量非常大,因此只保存最近48小時的數據供本地查看,其它時間段的數據則在本地需要查看時再從監護中心服務器下載。每次數據庫管理模塊啟動后,在后臺執行如下操作來清理歷史數據:根據set_timestamp查詢48小時以前的數據集合數據塊,執行刪除。實時數據的存儲在移動監護軟件接收到數據后同步執行更新操作。數據庫管理模塊的另一個重要功能是,從數據庫中取出send列為0的數據塊,這部分數據為用戶在離線狀態下測得的數據,在不進行實時采集的時段,將這部分數據發送回監護中心服務器。

圖5 無鎖隊列結構

表2 心電數據表設計
Android平臺心電監護軟件作為與采集設備直接相連的數據接收前端,完成數據采集后,需要實時和完整的將心電數據發送到監護中心服務器。在理想的網絡環境中,通過使用TCP協議,數據發送的實時性和完整性可以很容易得到保證,但在移動網絡中,由于無線信號衰落、誤碼率高等原因造成頻繁丟包,觸發不必要的擁塞控制,導致TCP協議性能下降[7]。針對TCP在無線網絡性能優化相關研究工作實現多在擁塞控制算法優化上,實際心電監護設備都多種多樣,為了保證心電監護軟件的移植和擴展。我們選擇在應用層上設計一種心電數據傳輸機制來保證數據完整性;同時,心電數據的實時傳輸需求是一種TCP長連接的應用,如何準確確認連接狀態也是設計中需要考慮的問題。
2.2.1 心電數據傳輸機制
心電數據在網絡中以報文形式傳輸,Android端的心電監護軟件與監護中心服務器建立連接后,將心電數據按照指定格式打包,采用TCP/IP的傳輸層與網絡層協議,通過Socket套接字發送到服務器指定端口。雖然使用的是可靠傳輸協議,但在網絡擁塞、隨機丟包、Android客戶端斷線等情況時,部分數據包被丟棄。為了應對這種情況,我們選擇在應用層實現一個類似TCP協議的 “發送-確認-請求重傳-補發”機制:Android端為每個數據包添加包頭信息,加入序列號信息;監護中心對成功收到的數據包,發送給Android端一個接收確認數據包;監護中心服務器收到數據包后,檢查當前數據包序列號是否與上一數據包連續,不連續則認為有丟包出現,立即向Android端監護軟件發送請求重傳數據包;Android端接收到服務器數據包,進行包分析,取出心電數據包序號,若是確認數據包,則刪除發送緩沖區對應的數據包,若是請求數據包,則重傳相應的心電數據包。雙方通信數據包描述見圖6。

圖6 通信數據包
圖6中的注冊包是用于Android端心電監護軟件開始一次心電采集時,向監護中心服務器發起連接請求注冊,注冊包中包含的 “開始時間”字段對應上文數據庫表records中的set_timestamp,使用該字段注冊后,服務器接收到的心電數據包采樣時間可以從包序號計算得出,每次發送心電數據就不再需要發送采樣時間。發送數據包類型包括注冊包,實時心電數據包,重傳心電數據包,服務器根據不同的數據包類型進行解析。接收數據包類型包括確認數據包和重傳請求包。
2.2.2 連接狀態保持
心電數據傳輸采用異步雙工的Server/Client通信方式,需要Android前端與監護中心服務器端保持長連接狀態,在網絡狀況不佳時,網絡連接超時、斷線等時有發生,導致數據發送阻塞,發送緩沖區滿后數據丟失的問題。我們需要設置一個超時閾值,當監護軟件在閾值時間內接收不到數據,則可認為連接出現異常,啟動斷線重連功能,并將超時期間沒能收到反饋的數據包加入重傳列表等待重傳。此外,利用KeepAlive原理來實現一個具有定時查看連接狀態,探測網絡狀況的網絡觀察器,并根據觀察器的網絡連接信息來適當調整數據包發送速度。
2.2.3 網絡模塊實現

圖7 心電分析流程
利用Android SDK網絡編程API的標準套接字來進行TCP連接,在心電監護軟件的網絡模塊使用4個線程來管理心電數據的傳輸,包括實時發送線程,接收線程,重傳線程,網絡狀態管理線程。考慮到重傳時需要快速檢索到需要重傳的數據包,使用隊列結構無法滿足需求,我們使用HashMap的并發版本ConcurrentHashMap來管理心電數據包,使用隊列來保存請求重傳數據包的序號。實時發送線程的心電數據來源于實時采集模塊,按照上文設定的格式打包發送的同時,將數據包保存到ConcurrentHash-Map中;接收線程則刪除完成確認的數據包,將重傳請求序列號存入重傳隊列;重傳線程則從重傳隊列中取出序列號,在ConcurrentHashMap獲取數據包進行網絡發送。網絡狀態管理線程則觀察網絡連接狀態,發現斷線情況則進行重連并及時發布系統消息。
Android平臺心電監護軟件的一個重要功能是對采集得到的心電信號進行實時QRS波檢測,并以此為基礎計算實時心率,并對心律失常做到及時報警。QRS波的檢測方法根據算法原理的不同,可分為濾波方法、小波分析方法、模板匹配方法、形態學方法、神經網絡方法等,文獻 [8]對各類方法進行了對比分析。針對智能手機的存儲和CPU運算能力,以及實時數據分析需要快速完成的需求,綜合比較后,本文選取易于在嵌入式平臺實現的濾波器方法來進行QRS波的快速實時檢測,心電數據分析整體流程如圖7所示。智能手機上的分析結果包括QRS波群寬度、RR間歇、心率和心律是否正常。
2.3.1 濾波器方法
濾波器方法檢測QRS波的一般流程為:先使用一個帶通濾波器對原始心電信號波形濾波,通帶頻率選擇取為5~15Hz,可包含QRS波的主要成分;為了突出頻率響應曲線中的QRS斜率對信號進行微分和平方;然后使用一個移動窗口對信號進行積分,積分所得的信號中包含了QRS的斜率信息和波群寬度信息;最后進行峰值位置檢測,并根據QRS波判定規則,在濾波所得信號上檢出QRS波。濾波器選取計算快速的差分濾波,濾波器的參數選擇基于文獻 [9]中的實時快速算法實現,并對嵌入式處理器進行優化,選取為2的n次方,同時調節移動窗口寬度,并在編程實現上較少內存消耗。實時檢測算法包含頻繁的CPU調用,較少的動態內存分配與釋放,在Android平臺實現QRS波檢測算法,使用NDK和C語言開發實現可得到更高的運行效率[10]。
2.3.2 心律分類
完成QRS波檢測后,可以得到幾個重要的心電特征參數:RR間歇、QRS寬度、心率。利用這些特征參數,我們可以完成簡單的心律分類,在Android智能手機的實時分析中,我們只將心律分為正常,室早和其它類型心律失常并對失常心律及時報警,更加復雜的心律失常判別則放在監護中心完成。比較多種分類方法后,我們選擇使用文獻 [11]中描述的算法并對其進行簡化,簡化之后為:心率小于100且QRS波寬小于100ms為正常心律;QRS波寬大于100ms且心率大于100判定為室性早搏。
心電監護軟件系統充分利用Android與設備無關的通用框架開發平臺,可以運行于使用Android操作系統的智能手機上,通過藍牙和串口獲取心電采集模塊的數據,實現Android平臺的心電QRS實時檢測、心率計算和顯示功能,滿足移動心電實時分析的要求。在Android平臺進行心律分類并顯示效果見圖8。

圖8 Android心電分析結果
通過無線網絡,利用本文設計的心電數據傳輸機制,可以完整的將數據發送到監護中心服務器,圖9是一個服務器接收數據和請求重傳的日志片段,可以看到,監護中心對成功接收的數據包進行應答,并對未收到的數據包向Android平臺心電監護軟件發送補發請求,心電監護軟件進行了及時重傳。

圖9 心電傳輸結果
本文設計了一個基于Android平臺的心電監護軟件系統,并對系統各個功能實現進行了詳細的設計和討論,系統利用無鎖循環鏈表存儲結構提高心電實時存儲效率,提出類似TCP協議的 “發送-確認-請求重傳-補發”機制來確保了心電數據傳輸的完整性,并針對嵌入式處理器選取了一種計算快速的QRS波實時檢測算法。與現有移動監護儀比較,本文方案利用Android智能手機等移動設備完成心電監護,監護成本低,具有普適的應用前景。在今后的工作中,將進一步整合血壓、血氧、呼吸等參數,形成多生理參數的綜合監護軟件系統。
[1]Shanthi Mendis,Pekka Puska,Bo Norrving.Global atlas on cardiovascular disease prevention and control[R].The World Health Organization in collaboration with the World Heart Federation and the World Stroke Organization,2011:8-13.
[2]ZHANG Hejun,ZHANG Yue,ZHOU Bingkun.Design and implementation of software system for remote electrocardiographic monitoring [J].Computer Engineering and Applications,2006,42 (15):219-224 (in Chinese).[張和君,張躍,周炳坤.遠程心電監護軟件系統的設計與實現 [J].計算機工程與應用,2006,42 (15):219-224.]
[3]Gavalas D,Economou D.Development platforms for mobile applications:Status and trends[J].IEEE Software,2011,28(1):77-86.
[4]CHENG Zhuanpeng,ZHANG Yue.Design and implementation of real-time telecardiology monitor terminal[J].Computer Engineering,2007,33 (11):264-266 (in Chinese).[成轉鵬,張躍.遠程心電實時監護終端的設計與實現 [J].計算機工程,2007,33 (11):264-266.]
[5]Keir Fraser,Tim Harris.Concurrent programming without locks[J].ACM Transactions on Computer Systems,2007,25(2):1-59.
[6]Frank Ableson W.Android in action[M].3rd ed.USA:Manning Publications Co,2011:386-393.
[7]HU Yu,CHEN Yuanyan.Enhanced TCP-Veno algorithm based on packet loss statistic[J].Computer Engineering and Design,2011,32 (9):2980-2983 (in Chinese).[胡愚,陳元琰.基于丟包事件統計的TCP-Veno改進算法 [J].計算機工程與設計,2011,32 (9):2980-2983.]
[8]LI Yanjun,YAN Hong.Comparison of familiar QRS detection approaches[J].Progress in Biomedical Engineering,2008,29 (2):101-107 (in Chinese).[李延軍,嚴宏.QRS波群檢測常用算法的比較 [J].生物醫學工程學進展,2008,29 (2):101-107.]
[9]ZHANG Longfei,ZHANG Yue.Real-time detection algorithm of multi-lead QRS wave [J].Computer Engineering,2011(16):282-284 (in Chinese). [張龍飛,張躍.一種多導聯QRS波實 時 檢 測 算 法 [J].計 算 機 工 程,2011 (16):282-284.]
[10]Cheng Min Lin,Jyh Horng Lin,Chyi Ren Dow,et al.Benchmark dalvik and native code for android system [C]//Second International Conference on Innovations in Bio-inspired Computing and Applications,2011:320-323.
[11]Kristoforus Hermawan.Development of ECG signal interpretation software on android 2.2[C]//2nd International Conference on Instrumentation,Communications,Information Technology,and Biomedical Engineering,2011,259-264.