利用BB-Black設(shè)計(jì)的遠(yuǎn)程醫(yī)療監(jiān)測(cè)智能硬件
2.1.2 Boa功能實(shí)現(xiàn)
設(shè)計(jì)中Boa服務(wù)器需實(shí)現(xiàn)接收客戶端請(qǐng)求、分析請(qǐng)求、響應(yīng)請(qǐng)求和向客戶端返回請(qǐng)求結(jié)果等任務(wù)。其工作流程如下圖6所示。
Boa服務(wù)器初始化工作代碼實(shí)現(xiàn):
上述代碼首先創(chuàng)建一個(gè)無(wú)阻塞的流式套接字描述符socktfd,提供面向連接的可靠傳輸。然后利用bind()函數(shù)將指定端口與套接字描述符關(guān)聯(lián),最后利用listen()函數(shù)在指定端口監(jiān)聽,等待Request請(qǐng)求。
當(dāng)監(jiān)聽到連接請(qǐng)求,服務(wù)器調(diào)用get_request()函數(shù)獲取請(qǐng)求信息,利用accept()函數(shù)建立連接,接收請(qǐng)求、分析信息,進(jìn)行HTTP認(rèn)證確認(rèn),處理請(qǐng)求信息,并將結(jié)果發(fā)送、顯示到Web瀏覽器;當(dāng)有CGI請(qǐng)求時(shí),創(chuàng)建CGI處理進(jìn)程,并將處理結(jié)果發(fā)送、顯示到Web瀏覽器。
2.1.3 Boa在ARM上的移植
首先,針對(duì)BB-Black和實(shí)際應(yīng)用場(chǎng)景對(duì)Boa服務(wù)器源代碼作以下修改:(1)根據(jù)監(jiān)護(hù)人數(shù)量指定HTTP請(qǐng)求列表限制參數(shù);將服務(wù)器的輸入輸出緩存空間設(shè)為最大值,以加快生理數(shù)據(jù)傳輸速度;(2)通過(guò)編寫實(shí)現(xiàn)一些簡(jiǎn)單函數(shù),來(lái)精簡(jiǎn)Linux操作系統(tǒng)庫(kù)函數(shù),節(jié)約資源。
其次,利用arm-linux-gcc交叉編譯環(huán)境,配置生成大小為175.8KB的boa可執(zhí)行程序。通過(guò)bin.arm-linux-strip boa指令剝?nèi)ジ綆У木幾g信息,得到僅59.4KB的ARM平臺(tái)可執(zhí)行文件。
最后,通過(guò)修改Web服務(wù)器的配置文件boa.conf:監(jiān)聽端口為80,注釋掉綁定IP地址設(shè)置欄,KeepAliveMax值為 50,KeepAliveTimeout值為10,服務(wù)器名字為www. RemoteMedicalMonitoringSystem.com;以及CGI路徑,訪問(wèn)日志和錯(cuò)誤日志的存放路徑等運(yùn)行參數(shù);將該配置文件和可執(zhí)行文件boa放到BB-Block平臺(tái)的/home/www目錄下;執(zhí)行g(shù)enromfs-f romfs.img-d romdisk命令生成一個(gè)含有Boa服務(wù)器的根文件系統(tǒng),通過(guò)bootloader燒寫到存儲(chǔ)器。完成Boa到ARM平臺(tái)的移植。
2.2 CGI與SQLite數(shù)據(jù)庫(kù)移植
BB-Black開發(fā)板在運(yùn)行CGI和SQLite程序前,需要將相應(yīng)的庫(kù)移植到開發(fā)板。設(shè)計(jì)通過(guò)交叉編譯之后將CGI的libcgic.a和 capture拷貝到BB-black開發(fā)板的/home/www/cgi-bin目錄下,完成移植工作(可通過(guò)網(wǎng)頁(yè)訪問(wèn)該目錄,若在網(wǎng)頁(yè)上顯示cgic test的字樣,則表明cgi庫(kù)移植成功);將SQLite的sqlite3和libsqlite3.so.0.8.6分別下載到BB-black開發(fā)板的/usr/bin和/usr/lib目錄中并通過(guò)ln –s /usr/lib/libsqlite3.so.0.8.6 /usr/lib/libsqlite3.so.0命令,建立軟連接(因?yàn)榭蓤?zhí)行程序sqlite3在運(yùn)行的時(shí)候搜尋libsqlite3.so.0動(dòng)態(tài)庫(kù)),完成移植工作。
2.3 遠(yuǎn)程監(jiān)控功能實(shí)現(xiàn)
2.3.1 HTML設(shè)計(jì)
遠(yuǎn)程醫(yī)療監(jiān)控界面主要有監(jiān)護(hù)人登錄界面和被監(jiān)護(hù)人生理數(shù)據(jù)監(jiān)測(cè)界面。其中脈搏和心跳監(jiān)測(cè)HTML頁(yè)面首行代碼用 action=“pluse_heart_monitor.cgi”將表單指向pluse_heart_monitor.cgi處理程序,method=“get”指定獲取環(huán)境變量的方式為get;程序的最后幾行用type=“submit”或type=“reset”指定點(diǎn)擊這兩個(gè)按鈕時(shí)提交表單;其他生理數(shù)據(jù)監(jiān)測(cè)頁(yè)面與此相似。
2.3.2 CGI和SQLite數(shù)據(jù)庫(kù)互動(dòng)設(shè)計(jì)
CGI與SQLite數(shù)據(jù)的互動(dòng)主要包括CGI程序在SQLite數(shù)據(jù)庫(kù)上建立生理數(shù)據(jù)表,插入生理數(shù)據(jù);CGI按照表單提交內(nèi)容對(duì)數(shù)據(jù)表進(jìn)行增刪改查詢操作;其主要的控制函數(shù)代碼如下:
其中g(shù)etcgidata()實(shí)現(xiàn)GET和POST兩種方式從網(wǎng)頁(yè)獲取字符串函數(shù);若為””“GET”方式,則通過(guò) getenv(“QUERY_STRING”)函數(shù)獲取字符串函數(shù);若為“POST”方式,首先用 atoi(getenv(“CONTENT_LENGTH”))函數(shù)獲取字符串長(zhǎng)度,再利用(char)fgetc(stdin)函數(shù)依次獲取單個(gè)字符。
通過(guò)getcgidata()函數(shù)從網(wǎng)頁(yè)獲取的字符串中各數(shù)據(jù)項(xiàng)由‘’符號(hào)隔開,getstringdata()函數(shù)則是去掉‘’符號(hào),提取有效信息,為select_pluse_spo2()函數(shù)對(duì)SQLite數(shù)據(jù)庫(kù)執(zhí)行查詢操作提供參數(shù)。
select_pluse_spo2()函數(shù)以getstringdata()函數(shù)得到的有效信息為參數(shù),執(zhí)行打開數(shù)據(jù)庫(kù)、查詢數(shù)據(jù)、向網(wǎng)頁(yè)打印數(shù)據(jù)操作。部分功能實(shí)現(xiàn)代碼:
3 參數(shù)發(fā)送和接受功能的設(shè)計(jì)
3.1 數(shù)據(jù)采集模塊功能實(shí)現(xiàn)
生理數(shù)據(jù)采集模塊,由數(shù)據(jù)監(jiān)測(cè)模塊和無(wú)線傳感節(jié)點(diǎn)ZigBee組成。數(shù)據(jù)監(jiān)測(cè)模塊負(fù)責(zé)采集數(shù)據(jù),ZigBee節(jié)點(diǎn)負(fù)責(zé)接收、解析和傳輸數(shù)據(jù);解析過(guò)程根據(jù)監(jiān)測(cè)項(xiàng)目調(diào)用相應(yīng)的子程序(如:測(cè)血氧、脈搏、體溫等);傳輸數(shù)據(jù)時(shí)終端節(jié)點(diǎn)和非終端節(jié)點(diǎn)分別調(diào)用向串口發(fā)送子程序和發(fā)射子程序。具體的實(shí)現(xiàn)程序流程如下圖7所示。
3.2 ARM板上生理數(shù)據(jù)接收功能實(shí)現(xiàn)
在ARM板上首先打開串口,然后配置發(fā)短信所需的串口參數(shù),并初始化接收緩沖區(qū),開始循環(huán)讀串口數(shù)據(jù)包;當(dāng)讀取到數(shù)據(jù),就對(duì)數(shù)據(jù)包進(jìn)行分析,獲取包中隱含的血氧飽和度和脈搏值;并進(jìn)行健康監(jiān)測(cè)(按照健康生理指標(biāo)監(jiān)測(cè)),如果獲取的生理數(shù)據(jù)不正常就會(huì)向監(jiān)護(hù)人手機(jī)發(fā)送短信(包含相應(yīng)的生理數(shù)據(jù)和健康狀況說(shuō)明);最后將生理數(shù)據(jù)包轉(zhuǎn)化為16進(jìn)制數(shù)存入文檔。具體的處理流程如下圖8所示。
評(píng)論