藍(lán) 坤,張 躍
(清華大學(xué)深圳研究生院 嵌入式系統(tǒng)與技術(shù)實(shí)驗(yàn)室,廣東 深圳518055)
在醫(yī)療監(jiān)護(hù)系統(tǒng)中,心電監(jiān)護(hù)處于十分重要的地位,據(jù)世界衛(wèi)生組織統(tǒng)計(jì),截至2011年,平均每年有接近1700萬(wàn)的人死于心血管疾病,約占全球死亡人數(shù)的29%。其中,80%以上發(fā)生在低收入和中等收入國(guó)家,到2030年,幾乎有2360萬(wàn)人將死于心血管?。?]。由于醫(yī)院監(jiān)護(hù)條件、患者經(jīng)濟(jì)條件和個(gè)人時(shí)間的制約,對(duì)這部分人群的監(jiān)護(hù)覆蓋面不足,無(wú)法在患者病危時(shí)及時(shí)施救,無(wú)法及時(shí)跟蹤亞健康人群的生理參數(shù)作到有效預(yù)防心血管疾病的發(fā)生。針對(duì)這種需求,清華大學(xué)深圳研究生院嵌入式系統(tǒng)與技術(shù)實(shí)驗(yàn)室研發(fā)了遠(yuǎn)程無(wú)線多生理參數(shù)實(shí)時(shí)監(jiān)測(cè)與分析網(wǎng)絡(luò)平臺(tái)[2],通過(guò)3G無(wú)線網(wǎng)絡(luò)、Internet、移動(dòng)監(jiān)護(hù)終端、服務(wù)器實(shí)時(shí)分析軟件完成遠(yuǎn)程無(wú)線多生理參數(shù)的監(jiān)測(cè)和分析。
當(dāng)前移動(dòng)互聯(lián)網(wǎng)技術(shù)的發(fā)展以及智能手機(jī)等移動(dòng)終端的普及,使得移動(dòng)終端在醫(yī)療監(jiān)護(hù)系統(tǒng)中扮演者越來(lái)越重要的角色。目前主流的智能終端操作系統(tǒng)包括Android,IOS,Windows Phone,相對(duì)于IOS的封閉性和 Windows Phone昂貴的價(jià)格,Android平臺(tái)的免費(fèi)和開(kāi)放得到眾多手機(jī)開(kāi)發(fā)商的支持[3]。當(dāng)前基于智能手機(jī)平臺(tái)進(jìn)行醫(yī)療監(jiān)護(hù)的應(yīng)用較少,主要應(yīng)用于醫(yī)生移動(dòng)辦公和遠(yuǎn)程信息查詢(xún),本文的目標(biāo)是設(shè)計(jì)和實(shí)現(xiàn)一個(gè)基于Android平臺(tái)的心電監(jiān)護(hù)軟件系統(tǒng),充分利用智能手機(jī)等移動(dòng)終端,結(jié)合醫(yī)療監(jiān)控的相關(guān)傳感器模塊、串口、藍(lán)牙、USB、3G無(wú)線網(wǎng)絡(luò)等,完成心電數(shù)據(jù)的實(shí)時(shí)采集、分析和網(wǎng)絡(luò)傳輸,降低監(jiān)護(hù)成本,提高心電監(jiān)護(hù)的便捷性。
Android平臺(tái)心電監(jiān)護(hù)軟件系統(tǒng)是本實(shí)驗(yàn)室研發(fā)的遠(yuǎn)程無(wú)線監(jiān)護(hù)系統(tǒng)的重要組成部分,主要由心電數(shù)據(jù)采集單元、數(shù)據(jù)網(wǎng)絡(luò)傳輸單元、智能終端數(shù)據(jù)分析單元等組成,通過(guò)藍(lán)牙、串口連接心電采集設(shè)備獲取實(shí)時(shí)心電采集數(shù)據(jù),在Android智能手機(jī)上存儲(chǔ)心電數(shù)據(jù),對(duì)心電數(shù)據(jù)進(jìn)行實(shí)時(shí)分析,及時(shí)將分析結(jié)果、心電波形顯示給用戶查看,并將心電數(shù)據(jù)通過(guò)無(wú)線網(wǎng)絡(luò)實(shí)時(shí)傳輸?shù)奖O(jiān)護(hù)中心,軟件系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 心電監(jiān)護(hù)軟件系統(tǒng)結(jié)構(gòu)
實(shí)時(shí)心電數(shù)據(jù)的采集包括采集模塊和智能手機(jī)兩個(gè)硬件組成部分,如圖2所示,涉及兩個(gè)過(guò)程:①通過(guò)心電信號(hào)采集模塊,使用導(dǎo)聯(lián)線連接人體獲取心電信號(hào),采樣頻率為500Hz,心電信號(hào)通過(guò)硬件濾波放大,并通過(guò)A/D轉(zhuǎn)換器得到數(shù)字信號(hào);②在采集模塊內(nèi)部對(duì)心電信號(hào)進(jìn)行軟件濾波,將去除高頻干擾、肌電干擾、工頻干擾、基線漂移后的心電信號(hào)發(fā)送至Android智能移動(dòng)終端供運(yùn)行于智能移動(dòng)終端的心電監(jiān)護(hù)軟件處理。
圖2 心電數(shù)據(jù)采集
2.1.1 心電數(shù)據(jù)采集與接收
數(shù)據(jù)采集所采用的采集模塊是基于本實(shí)驗(yàn)室遠(yuǎn)程心電實(shí)時(shí)監(jiān)護(hù)終端[4]實(shí)現(xiàn),通過(guò)串口和藍(lán)牙與Android智能手機(jī)完成通信。
為了從采集模塊完整的接收心電數(shù)據(jù),心電信號(hào)采集模塊與智能手機(jī)之間采用數(shù)據(jù)包的形式來(lái)完成數(shù)據(jù)通信。每完成一次采樣,采集模塊將12導(dǎo)聯(lián)的心電數(shù)據(jù)按照指定的格式打包后發(fā)送至智能手機(jī),心電數(shù)據(jù)包的格式如圖3所示。
心電數(shù)據(jù)包各位的意義見(jiàn)表1。
圖3 心電數(shù)據(jù)包格式
表1 心電數(shù)據(jù)包項(xiàng)
Android平臺(tái)的心電監(jiān)護(hù)軟件在接收到心電數(shù)據(jù)后,將數(shù)據(jù)保存在一個(gè)緩沖隊(duì)列中,使用緩沖隊(duì)列的目的是為了后續(xù)的數(shù)據(jù)處理做準(zhǔn)備。針對(duì)心電數(shù)據(jù)采樣率高 (500Hz),數(shù)據(jù)量大的特點(diǎn),需要一個(gè)較大的隊(duì)列來(lái)保存心電數(shù)據(jù)。Android的進(jìn)程內(nèi)存限制使得當(dāng)應(yīng)用程序在Dalvik虛擬機(jī)進(jìn)程內(nèi)存空間內(nèi)使用較多內(nèi)存來(lái)存儲(chǔ)數(shù)據(jù)隊(duì)列時(shí),會(huì)導(dǎo)致應(yīng)用程序響應(yīng)緩慢。解決辦法是使用Android NDK,向系統(tǒng)申請(qǐng)一個(gè)6M的存儲(chǔ)空間作為心電數(shù)據(jù)緩沖隊(duì)列,隊(duì)列中每個(gè)數(shù)據(jù)包保存著50ms的數(shù)據(jù)。對(duì)緩沖隊(duì)列的操作如圖4所示。
圖4 心電數(shù)據(jù)接收流程
操作步驟包括:
(1)對(duì)從采集模塊取回的數(shù)據(jù),保存于一個(gè)50ms數(shù)據(jù)大小的連續(xù)存儲(chǔ)空間;
(2)連續(xù)存儲(chǔ)空間數(shù)據(jù)滿后,將數(shù)據(jù)復(fù)制到緩沖隊(duì)列的尾部,等待收取新的數(shù)據(jù);
(3)在隊(duì)列頭部,使用一個(gè)觀察器,將隊(duì)列頭部數(shù)據(jù)塊復(fù)制到前端處理的3個(gè)線程做進(jìn)一步處理。
2.1.2 無(wú)鎖緩沖隊(duì)列的設(shè)計(jì)
在后續(xù)的數(shù)據(jù)處理中,采用多線程技術(shù)來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)、分析、顯示、網(wǎng)絡(luò)傳送等,并且為了提高數(shù)據(jù)從采集接收到分發(fā)的快速完成,有必要將入隊(duì)操作和出隊(duì)操作放入不同的線程中,因此該緩沖隊(duì)列必須是線程安全的。對(duì)并發(fā)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作時(shí),常用的方法為使用互斥的讀寫(xiě)鎖,即使用一個(gè)互斥鎖來(lái)保證緩沖隊(duì)列在同一時(shí)刻只有一個(gè)線程操作。使用互斥鎖來(lái)管理同步實(shí)現(xiàn)簡(jiǎn)單,但是存在較大的效率問(wèn)題:等待互斥鎖消耗許多寶貴的時(shí)間,而每次讀寫(xiě)操作都需要進(jìn)行鎖的獲取和釋放。因此,出于對(duì)效率和性能的考慮,本文設(shè)計(jì)使用一個(gè)無(wú)鎖隊(duì)列,降低隊(duì)列數(shù)據(jù)讀寫(xiě)的等待時(shí)間,提高心電數(shù)據(jù)采集的實(shí)時(shí)性能。無(wú)鎖隊(duì)列的實(shí)現(xiàn)一般包括CAS,MCAS,WSTM,OSTM等[5]。
在本文設(shè)計(jì)的心電監(jiān)護(hù)軟件系統(tǒng)中,實(shí)時(shí)心電數(shù)據(jù)接收隊(duì)列只有一個(gè)數(shù)據(jù)生產(chǎn)者和一個(gè)數(shù)據(jù)消費(fèi)者,參考CAS技術(shù)的實(shí)現(xiàn)原理,本文實(shí)現(xiàn)的心電數(shù)據(jù)接收隊(duì)列如圖5所示。隊(duì)列使用鏈表實(shí)現(xiàn),Head指向隊(duì)列頭部節(jié)點(diǎn),Tail指向隊(duì)列尾部節(jié)點(diǎn)。為了區(qū)分等待生產(chǎn)者線程生產(chǎn)數(shù)據(jù)的節(jié)點(diǎn)和等待消費(fèi)者線程消費(fèi)數(shù)據(jù)的節(jié)點(diǎn),在隊(duì)列數(shù)據(jù)結(jié)構(gòu)中保持Divider指向這樣的節(jié)點(diǎn):從該節(jié)點(diǎn)到Tail節(jié)點(diǎn)之間的節(jié)點(diǎn)為等待消費(fèi)的節(jié)點(diǎn),該節(jié)點(diǎn)前以及Tail節(jié)點(diǎn)后的節(jié)點(diǎn)為等待生產(chǎn)的節(jié)點(diǎn)。Head節(jié)點(diǎn)只有生產(chǎn)者訪問(wèn),而Divider和Tail則為生產(chǎn)者和消費(fèi)者共享訪問(wèn),對(duì)這兩個(gè)指針設(shè)定為原子操作變量。另一方面,為了減少頻繁的內(nèi)存申請(qǐng)和釋放,隊(duì)列使用固定節(jié)點(diǎn)數(shù)目的循環(huán)鏈表,在初始化時(shí)即申請(qǐng)完成整個(gè)隊(duì)列所需的存儲(chǔ)空間。生產(chǎn)者向隊(duì)列尾部插入數(shù)據(jù)的操作:
消費(fèi)者從隊(duì)列頭部取出數(shù)據(jù)的操作:
在生產(chǎn)者線程中,每次數(shù)據(jù)入隊(duì)后,都會(huì)更新隊(duì)頭指針位置,保證Head和Divider之間的節(jié)點(diǎn)沒(méi)有未出隊(duì)的節(jié)點(diǎn)存在;在消費(fèi)者線程中,每次取回的數(shù)據(jù)為Divider下一個(gè)節(jié)點(diǎn)的數(shù)據(jù),這樣保證了即使此時(shí)生產(chǎn)者插入節(jié)點(diǎn)也不影響消費(fèi)者獲取當(dāng)前的隊(duì)頭元素。利用Divider來(lái)分開(kāi)生產(chǎn)者和消費(fèi)者操作的節(jié)點(diǎn),以此來(lái)保證隊(duì)列操作的線程安全。
2.1.3 心電數(shù)據(jù)的讀取驅(qū)動(dòng)
本文設(shè)計(jì)的軟件針對(duì)兩種心電數(shù)據(jù)采集模塊連接方式:專(zhuān)用心電手機(jī)的串口通信和普通智能手機(jī)的藍(lán)牙通信。在Android SDK中,并沒(méi)有提供可以直接操作串口的API,因此我們需要使用Android NDK,調(diào)用Linux串口驅(qū)動(dòng)完成串口的配置、打開(kāi)和關(guān)閉,然后通過(guò)JNI來(lái)向上層Framework開(kāi)發(fā)操作接口,最后通過(guò)Java API的文件描述符類(lèi)FileDescriptor來(lái)操作串口設(shè)備文件。藍(lán)牙通信則可直接使用Android SDK的藍(lán)牙API,藍(lán)牙通信實(shí)現(xiàn)流程為打開(kāi)本機(jī)藍(lán)牙,搜索周?chē)O(shè)備并與心電數(shù)據(jù)采集模塊的設(shè)備藍(lán)牙進(jìn)行配對(duì),配對(duì)成功后雙方使用RFCOMM建立連接和數(shù)據(jù)通信[6],API中針對(duì)每個(gè)步驟的操作都有十分詳盡的接口供開(kāi)發(fā)者調(diào)用。移動(dòng)監(jiān)護(hù)軟件根據(jù)用戶設(shè)置,在不同采集模式下啟用不同的數(shù)據(jù)讀取驅(qū)動(dòng)來(lái)讀取數(shù)據(jù)并存儲(chǔ)到緩沖隊(duì)列。
2.1.4 心電數(shù)據(jù)的數(shù)據(jù)庫(kù)存儲(chǔ)
在Android智能手機(jī)上,使用SQLite3數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)心電數(shù)據(jù)。從心電采集模塊接收到數(shù)據(jù)后,及時(shí)的將數(shù)據(jù)分發(fā)到數(shù)據(jù)庫(kù)存儲(chǔ)線程進(jìn)行存儲(chǔ),存儲(chǔ)的方式為按照緩沖隊(duì)列的數(shù)據(jù)塊大小 (50ms)存儲(chǔ),并保證在數(shù)據(jù)庫(kù)中可查詢(xún)某一次連續(xù)測(cè)量得到的全部數(shù)據(jù)集已經(jīng)數(shù)據(jù)是否已經(jīng)送達(dá)遠(yuǎn)程監(jiān)護(hù)中心服務(wù)器。根據(jù)需求,數(shù)據(jù)庫(kù)的設(shè)計(jì)包含兩張表:records和ecgs,records表和ecgs表是一對(duì)一的關(guān)系,在records表中存儲(chǔ)一個(gè)心電數(shù)據(jù)塊的元信息,ecgs表存儲(chǔ)的是實(shí)際各導(dǎo)聯(lián)心電數(shù)據(jù),兩表的數(shù)據(jù)項(xiàng)如表2所示。
移動(dòng)心電監(jiān)護(hù)軟件中,數(shù)據(jù)庫(kù)管理模塊提供數(shù)據(jù)庫(kù)查詢(xún)、創(chuàng)建、更新和刪除功能。由于在移動(dòng)設(shè)備上的存儲(chǔ)空間有限,長(zhǎng)時(shí)間連續(xù)采集的心電數(shù)據(jù)量非常大,因此只保存最近48小時(shí)的數(shù)據(jù)供本地查看,其它時(shí)間段的數(shù)據(jù)則在本地需要查看時(shí)再?gòu)谋O(jiān)護(hù)中心服務(wù)器下載。每次數(shù)據(jù)庫(kù)管理模塊啟動(dòng)后,在后臺(tái)執(zhí)行如下操作來(lái)清理歷史數(shù)據(jù):根據(jù)set_timestamp查詢(xún)48小時(shí)以前的數(shù)據(jù)集合數(shù)據(jù)塊,執(zhí)行刪除。實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)在移動(dòng)監(jiān)護(hù)軟件接收到數(shù)據(jù)后同步執(zhí)行更新操作。數(shù)據(jù)庫(kù)管理模塊的另一個(gè)重要功能是,從數(shù)據(jù)庫(kù)中取出send列為0的數(shù)據(jù)塊,這部分?jǐn)?shù)據(jù)為用戶在離線狀態(tài)下測(cè)得的數(shù)據(jù),在不進(jìn)行實(shí)時(shí)采集的時(shí)段,將這部分?jǐn)?shù)據(jù)發(fā)送回監(jiān)護(hù)中心服務(wù)器。
圖5 無(wú)鎖隊(duì)列結(jié)構(gòu)
表2 心電數(shù)據(jù)表設(shè)計(jì)
Android平臺(tái)心電監(jiān)護(hù)軟件作為與采集設(shè)備直接相連的數(shù)據(jù)接收前端,完成數(shù)據(jù)采集后,需要實(shí)時(shí)和完整的將心電數(shù)據(jù)發(fā)送到監(jiān)護(hù)中心服務(wù)器。在理想的網(wǎng)絡(luò)環(huán)境中,通過(guò)使用TCP協(xié)議,數(shù)據(jù)發(fā)送的實(shí)時(shí)性和完整性可以很容易得到保證,但在移動(dòng)網(wǎng)絡(luò)中,由于無(wú)線信號(hào)衰落、誤碼率高等原因造成頻繁丟包,觸發(fā)不必要的擁塞控制,導(dǎo)致TCP協(xié)議性能下降[7]。針對(duì)TCP在無(wú)線網(wǎng)絡(luò)性能優(yōu)化相關(guān)研究工作實(shí)現(xiàn)多在擁塞控制算法優(yōu)化上,實(shí)際心電監(jiān)護(hù)設(shè)備都多種多樣,為了保證心電監(jiān)護(hù)軟件的移植和擴(kuò)展。我們選擇在應(yīng)用層上設(shè)計(jì)一種心電數(shù)據(jù)傳輸機(jī)制來(lái)保證數(shù)據(jù)完整性;同時(shí),心電數(shù)據(jù)的實(shí)時(shí)傳輸需求是一種TCP長(zhǎng)連接的應(yīng)用,如何準(zhǔn)確確認(rèn)連接狀態(tài)也是設(shè)計(jì)中需要考慮的問(wèn)題。
2.2.1 心電數(shù)據(jù)傳輸機(jī)制
心電數(shù)據(jù)在網(wǎng)絡(luò)中以報(bào)文形式傳輸,Android端的心電監(jiān)護(hù)軟件與監(jiān)護(hù)中心服務(wù)器建立連接后,將心電數(shù)據(jù)按照指定格式打包,采用TCP/IP的傳輸層與網(wǎng)絡(luò)層協(xié)議,通過(guò)Socket套接字發(fā)送到服務(wù)器指定端口。雖然使用的是可靠傳輸協(xié)議,但在網(wǎng)絡(luò)擁塞、隨機(jī)丟包、Android客戶端斷線等情況時(shí),部分?jǐn)?shù)據(jù)包被丟棄。為了應(yīng)對(duì)這種情況,我們選擇在應(yīng)用層實(shí)現(xiàn)一個(gè)類(lèi)似TCP協(xié)議的 “發(fā)送-確認(rèn)-請(qǐng)求重傳-補(bǔ)發(fā)”機(jī)制:Android端為每個(gè)數(shù)據(jù)包添加包頭信息,加入序列號(hào)信息;監(jiān)護(hù)中心對(duì)成功收到的數(shù)據(jù)包,發(fā)送給Android端一個(gè)接收確認(rèn)數(shù)據(jù)包;監(jiān)護(hù)中心服務(wù)器收到數(shù)據(jù)包后,檢查當(dāng)前數(shù)據(jù)包序列號(hào)是否與上一數(shù)據(jù)包連續(xù),不連續(xù)則認(rèn)為有丟包出現(xiàn),立即向Android端監(jiān)護(hù)軟件發(fā)送請(qǐng)求重傳數(shù)據(jù)包;Android端接收到服務(wù)器數(shù)據(jù)包,進(jìn)行包分析,取出心電數(shù)據(jù)包序號(hào),若是確認(rèn)數(shù)據(jù)包,則刪除發(fā)送緩沖區(qū)對(duì)應(yīng)的數(shù)據(jù)包,若是請(qǐng)求數(shù)據(jù)包,則重傳相應(yīng)的心電數(shù)據(jù)包。雙方通信數(shù)據(jù)包描述見(jiàn)圖6。
圖6 通信數(shù)據(jù)包
圖6中的注冊(cè)包是用于Android端心電監(jiān)護(hù)軟件開(kāi)始一次心電采集時(shí),向監(jiān)護(hù)中心服務(wù)器發(fā)起連接請(qǐng)求注冊(cè),注冊(cè)包中包含的 “開(kāi)始時(shí)間”字段對(duì)應(yīng)上文數(shù)據(jù)庫(kù)表records中的set_timestamp,使用該字段注冊(cè)后,服務(wù)器接收到的心電數(shù)據(jù)包采樣時(shí)間可以從包序號(hào)計(jì)算得出,每次發(fā)送心電數(shù)據(jù)就不再需要發(fā)送采樣時(shí)間。發(fā)送數(shù)據(jù)包類(lèi)型包括注冊(cè)包,實(shí)時(shí)心電數(shù)據(jù)包,重傳心電數(shù)據(jù)包,服務(wù)器根據(jù)不同的數(shù)據(jù)包類(lèi)型進(jìn)行解析。接收數(shù)據(jù)包類(lèi)型包括確認(rèn)數(shù)據(jù)包和重傳請(qǐng)求包。
2.2.2 連接狀態(tài)保持
心電數(shù)據(jù)傳輸采用異步雙工的Server/Client通信方式,需要Android前端與監(jiān)護(hù)中心服務(wù)器端保持長(zhǎng)連接狀態(tài),在網(wǎng)絡(luò)狀況不佳時(shí),網(wǎng)絡(luò)連接超時(shí)、斷線等時(shí)有發(fā)生,導(dǎo)致數(shù)據(jù)發(fā)送阻塞,發(fā)送緩沖區(qū)滿后數(shù)據(jù)丟失的問(wèn)題。我們需要設(shè)置一個(gè)超時(shí)閾值,當(dāng)監(jiān)護(hù)軟件在閾值時(shí)間內(nèi)接收不到數(shù)據(jù),則可認(rèn)為連接出現(xiàn)異常,啟動(dòng)斷線重連功能,并將超時(shí)期間沒(méi)能收到反饋的數(shù)據(jù)包加入重傳列表等待重傳。此外,利用KeepAlive原理來(lái)實(shí)現(xiàn)一個(gè)具有定時(shí)查看連接狀態(tài),探測(cè)網(wǎng)絡(luò)狀況的網(wǎng)絡(luò)觀察器,并根據(jù)觀察器的網(wǎng)絡(luò)連接信息來(lái)適當(dāng)調(diào)整數(shù)據(jù)包發(fā)送速度。
2.2.3 網(wǎng)絡(luò)模塊實(shí)現(xiàn)
圖7 心電分析流程
利用Android SDK網(wǎng)絡(luò)編程API的標(biāo)準(zhǔn)套接字來(lái)進(jìn)行TCP連接,在心電監(jiān)護(hù)軟件的網(wǎng)絡(luò)模塊使用4個(gè)線程來(lái)管理心電數(shù)據(jù)的傳輸,包括實(shí)時(shí)發(fā)送線程,接收線程,重傳線程,網(wǎng)絡(luò)狀態(tài)管理線程??紤]到重傳時(shí)需要快速檢索到需要重傳的數(shù)據(jù)包,使用隊(duì)列結(jié)構(gòu)無(wú)法滿足需求,我們使用HashMap的并發(fā)版本ConcurrentHashMap來(lái)管理心電數(shù)據(jù)包,使用隊(duì)列來(lái)保存請(qǐng)求重傳數(shù)據(jù)包的序號(hào)。實(shí)時(shí)發(fā)送線程的心電數(shù)據(jù)來(lái)源于實(shí)時(shí)采集模塊,按照上文設(shè)定的格式打包發(fā)送的同時(shí),將數(shù)據(jù)包保存到ConcurrentHash-Map中;接收線程則刪除完成確認(rèn)的數(shù)據(jù)包,將重傳請(qǐng)求序列號(hào)存入重傳隊(duì)列;重傳線程則從重傳隊(duì)列中取出序列號(hào),在ConcurrentHashMap獲取數(shù)據(jù)包進(jìn)行網(wǎng)絡(luò)發(fā)送。網(wǎng)絡(luò)狀態(tài)管理線程則觀察網(wǎng)絡(luò)連接狀態(tài),發(fā)現(xiàn)斷線情況則進(jìn)行重連并及時(shí)發(fā)布系統(tǒng)消息。
Android平臺(tái)心電監(jiān)護(hù)軟件的一個(gè)重要功能是對(duì)采集得到的心電信號(hào)進(jìn)行實(shí)時(shí)QRS波檢測(cè),并以此為基礎(chǔ)計(jì)算實(shí)時(shí)心率,并對(duì)心律失常做到及時(shí)報(bào)警。QRS波的檢測(cè)方法根據(jù)算法原理的不同,可分為濾波方法、小波分析方法、模板匹配方法、形態(tài)學(xué)方法、神經(jīng)網(wǎng)絡(luò)方法等,文獻(xiàn) [8]對(duì)各類(lèi)方法進(jìn)行了對(duì)比分析。針對(duì)智能手機(jī)的存儲(chǔ)和CPU運(yùn)算能力,以及實(shí)時(shí)數(shù)據(jù)分析需要快速完成的需求,綜合比較后,本文選取易于在嵌入式平臺(tái)實(shí)現(xiàn)的濾波器方法來(lái)進(jìn)行QRS波的快速實(shí)時(shí)檢測(cè),心電數(shù)據(jù)分析整體流程如圖7所示。智能手機(jī)上的分析結(jié)果包括QRS波群寬度、RR間歇、心率和心律是否正常。
2.3.1 濾波器方法
濾波器方法檢測(cè)QRS波的一般流程為:先使用一個(gè)帶通濾波器對(duì)原始心電信號(hào)波形濾波,通帶頻率選擇取為5~15Hz,可包含QRS波的主要成分;為了突出頻率響應(yīng)曲線中的QRS斜率對(duì)信號(hào)進(jìn)行微分和平方;然后使用一個(gè)移動(dòng)窗口對(duì)信號(hào)進(jìn)行積分,積分所得的信號(hào)中包含了QRS的斜率信息和波群寬度信息;最后進(jìn)行峰值位置檢測(cè),并根據(jù)QRS波判定規(guī)則,在濾波所得信號(hào)上檢出QRS波。濾波器選取計(jì)算快速的差分濾波,濾波器的參數(shù)選擇基于文獻(xiàn) [9]中的實(shí)時(shí)快速算法實(shí)現(xiàn),并對(duì)嵌入式處理器進(jìn)行優(yōu)化,選取為2的n次方,同時(shí)調(diào)節(jié)移動(dòng)窗口寬度,并在編程實(shí)現(xiàn)上較少內(nèi)存消耗。實(shí)時(shí)檢測(cè)算法包含頻繁的CPU調(diào)用,較少的動(dòng)態(tài)內(nèi)存分配與釋放,在Android平臺(tái)實(shí)現(xiàn)QRS波檢測(cè)算法,使用NDK和C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)可得到更高的運(yùn)行效率[10]。
2.3.2 心律分類(lèi)
完成QRS波檢測(cè)后,可以得到幾個(gè)重要的心電特征參數(shù):RR間歇、QRS寬度、心率。利用這些特征參數(shù),我們可以完成簡(jiǎn)單的心律分類(lèi),在Android智能手機(jī)的實(shí)時(shí)分析中,我們只將心律分為正常,室早和其它類(lèi)型心律失常并對(duì)失常心律及時(shí)報(bào)警,更加復(fù)雜的心律失常判別則放在監(jiān)護(hù)中心完成。比較多種分類(lèi)方法后,我們選擇使用文獻(xiàn) [11]中描述的算法并對(duì)其進(jìn)行簡(jiǎn)化,簡(jiǎn)化之后為:心率小于100且QRS波寬小于100ms為正常心律;QRS波寬大于100ms且心率大于100判定為室性早搏。
心電監(jiān)護(hù)軟件系統(tǒng)充分利用Android與設(shè)備無(wú)關(guān)的通用框架開(kāi)發(fā)平臺(tái),可以運(yùn)行于使用Android操作系統(tǒng)的智能手機(jī)上,通過(guò)藍(lán)牙和串口獲取心電采集模塊的數(shù)據(jù),實(shí)現(xiàn)Android平臺(tái)的心電QRS實(shí)時(shí)檢測(cè)、心率計(jì)算和顯示功能,滿足移動(dòng)心電實(shí)時(shí)分析的要求。在Android平臺(tái)進(jìn)行心律分類(lèi)并顯示效果見(jiàn)圖8。
圖8 Android心電分析結(jié)果
通過(guò)無(wú)線網(wǎng)絡(luò),利用本文設(shè)計(jì)的心電數(shù)據(jù)傳輸機(jī)制,可以完整的將數(shù)據(jù)發(fā)送到監(jiān)護(hù)中心服務(wù)器,圖9是一個(gè)服務(wù)器接收數(shù)據(jù)和請(qǐng)求重傳的日志片段,可以看到,監(jiān)護(hù)中心對(duì)成功接收的數(shù)據(jù)包進(jìn)行應(yīng)答,并對(duì)未收到的數(shù)據(jù)包向Android平臺(tái)心電監(jiān)護(hù)軟件發(fā)送補(bǔ)發(fā)請(qǐng)求,心電監(jiān)護(hù)軟件進(jìn)行了及時(shí)重傳。
圖9 心電傳輸結(jié)果
本文設(shè)計(jì)了一個(gè)基于Android平臺(tái)的心電監(jiān)護(hù)軟件系統(tǒng),并對(duì)系統(tǒng)各個(gè)功能實(shí)現(xiàn)進(jìn)行了詳細(xì)的設(shè)計(jì)和討論,系統(tǒng)利用無(wú)鎖循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)提高心電實(shí)時(shí)存儲(chǔ)效率,提出類(lèi)似TCP協(xié)議的 “發(fā)送-確認(rèn)-請(qǐng)求重傳-補(bǔ)發(fā)”機(jī)制來(lái)確保了心電數(shù)據(jù)傳輸?shù)耐暾?,并針?duì)嵌入式處理器選取了一種計(jì)算快速的QRS波實(shí)時(shí)檢測(cè)算法。與現(xiàn)有移動(dòng)監(jiān)護(hù)儀比較,本文方案利用Android智能手機(jī)等移動(dòng)設(shè)備完成心電監(jiān)護(hù),監(jiān)護(hù)成本低,具有普適的應(yīng)用前景。在今后的工作中,將進(jìn)一步整合血壓、血氧、呼吸等參數(shù),形成多生理參數(shù)的綜合監(jiān)護(hù)軟件系統(tǒng)。
[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).[張和君,張躍,周炳坤.遠(yuǎn)程心電監(jiān)護(hù)軟件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) [J].計(jì)算機(jī)工程與應(yīng)用,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).[成轉(zhuǎn)鵬,張躍.遠(yuǎn)程心電實(shí)時(shí)監(jiān)護(hù)終端的設(shè)計(jì)與實(shí)現(xiàn) [J].計(jì)算機(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).[胡愚,陳元琰.基于丟包事件統(tǒng)計(jì)的TCP-Veno改進(jìn)算法 [J].計(jì)算機(jī)工程與設(shè)計(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).[李延軍,嚴(yán)宏.QRS波群檢測(cè)常用算法的比較 [J].生物醫(yī)學(xué)工程學(xué)進(jìn)展,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). [張龍飛,張躍.一種多導(dǎo)聯(lián)QRS波實(shí) 時(shí) 檢 測(cè) 算 法 [J].計(jì) 算 機(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.