伍習(xí)東 豐 韋 陳 凱
(安徽理工大學(xué)機(jī)械工程學(xué)院,安徽 淮南232001)
傳統(tǒng)的醫(yī)療技術(shù)服務(wù)中,在對(duì)人體生理指標(biāo)進(jìn)行監(jiān)測(cè)的環(huán)節(jié)中,常常存在著這樣一種情形:醫(yī)療工作人員在對(duì)人體的生理指標(biāo)值進(jìn)行記錄時(shí),往往是通過護(hù)士在病人的床前進(jìn)行手動(dòng)記錄。這種記錄方法具有繁瑣、低效的缺點(diǎn),當(dāng)在短時(shí)間內(nèi)需要對(duì)大量病人進(jìn)行生命特征狀態(tài)監(jiān)測(cè)時(shí),完成對(duì)人體生理指標(biāo)值的監(jiān)測(cè)、記錄將成為一件極具工作量的任務(wù)。而伴隨著計(jì)算機(jī)科學(xué)技術(shù)和電子科學(xué)技術(shù)的不斷發(fā)展,基于嵌入式的醫(yī)療監(jiān)測(cè)技術(shù)得到了良好的發(fā)展。在該項(xiàng)技術(shù)下,醫(yī)療設(shè)備通過分析病人的身體數(shù)據(jù),可以實(shí)現(xiàn)構(gòu)建一個(gè)更加高效和便利的智能醫(yī)療服務(wù)體系[1],提高醫(yī)療技術(shù)服務(wù)的效率。許多嵌入式系統(tǒng)板載有以太網(wǎng)接口,在硬件層上可實(shí)現(xiàn)接入到Internet,通過在嵌入式linux 系統(tǒng)中移植Web 服務(wù)器,可在軟件層上實(shí)現(xiàn)Web 服務(wù)器的構(gòu)建。通過軟硬件層的支持,實(shí)現(xiàn)PC 端與嵌入式實(shí)物端的數(shù)據(jù)交互。通過瀏覽器的Web 頁(yè)面發(fā)出HTTP 服務(wù)請(qǐng)求,嵌入式系統(tǒng)在接收到請(qǐng)求報(bào)文后作出應(yīng)答,向?yàn)g覽器端發(fā)出響應(yīng)報(bào)文,從而在Web 頁(yè)面上顯示出人體的各項(xiàng)生理指標(biāo)值。通過在醫(yī)院或診所中接入Interner,即可實(shí)現(xiàn)醫(yī)生或護(hù)士非臨床監(jiān)測(cè)病人的各項(xiàng)生理指標(biāo)值,幫助醫(yī)護(hù)人員更好地了解病人的生命體征狀態(tài)。
在本監(jiān)測(cè)系統(tǒng)中的Web 服務(wù)器不同于常規(guī)互聯(lián)網(wǎng)平臺(tái)的服務(wù)器,作為一種嵌入式Web 服務(wù)器,應(yīng)當(dāng)滿足可移植、穩(wěn)定性良好、代碼占用空間較小、響應(yīng)速度快等特點(diǎn)。目前在嵌入式產(chǎn)品開發(fā)中比較流行的Web 服務(wù)器主要包括GoA-head,BOA 以及thttpd 等[2],其中BOA 服務(wù)器具有占有系統(tǒng)資源少,在局域網(wǎng)通信服務(wù)中實(shí)時(shí)性高、響應(yīng)時(shí)間短等優(yōu)點(diǎn)。故本系統(tǒng)軟件設(shè)計(jì)選用BOA 服務(wù)器作為系統(tǒng)的Web 服務(wù)器。
在進(jìn)行服務(wù)器移植時(shí)需要修改BOA 服務(wù)器源碼中的Makefile 文件,為確保BOA 服務(wù)器在具體的嵌入式環(huán)境中能夠成功運(yùn)行,文件中的編譯變量要修改為符合嵌入式環(huán)境的變量名。以使用arm-linux-gcc 交叉編譯器的情形為例,要修改的變量值見表1。

表1 Makefile 文件修改對(duì)照
移植BOA 服務(wù)器時(shí)出現(xiàn)錯(cuò)誤的原因大部分為boa.conf 配置文件配置錯(cuò)誤,表2 列出來關(guān)于此配置文件中重要參數(shù)的說明以及常用值。

表2 BOA 服務(wù)器配置文件說明
移植BOA 服務(wù)器的過程主要包括以下幾個(gè)步驟:步驟1:在PC 中安裝UBUNTU 系統(tǒng),系統(tǒng)中安裝適用于嵌入式系統(tǒng)中處理器類別的交叉編譯工具。步驟2:在網(wǎng)上下載并解壓BOA 服務(wù)器源碼,修改源碼文件、相關(guān)配置文件以及Makefile 文件。步驟3:在linux 終端中執(zhí)行make 命令編譯BOA 服務(wù)器源碼,生成BOA 服務(wù)器的可執(zhí)行程序文件。步驟4:在嵌入式系統(tǒng)目標(biāo)機(jī)中建立相關(guān)工作目錄,通過NFS 或TFTP 服務(wù)將可執(zhí)行文件以及BOA 服務(wù)器的配置文件boa.conf 拷貝到系統(tǒng)的工作目錄下。步驟5:運(yùn)行啟動(dòng)BOA 服務(wù)器。在執(zhí)行make 編譯命令得到了可執(zhí)行文件boa 后,還可以對(duì)文件進(jìn)行瘦身處理。在終端下通過執(zhí)行arm-linux-strip boa 命令后,可執(zhí)行文件的占用空間將縮小至約為原來的三分之一,很好地實(shí)現(xiàn)了精簡(jiǎn)BOA 服務(wù)器的占用空間。BOA 服務(wù)器移植成功過后,需要編寫CGI(Common Gateway Interface,公用網(wǎng)關(guān)接口)程序,CGI 程序是一種使Web瀏覽器與客戶端完成數(shù)據(jù)交互的工具,需要在BOA 服務(wù)器上運(yùn)行[3]。將CGI 程序經(jīng)交叉編譯工具編譯后即可得到CGI 程序可執(zhí)行文件。拷貝CGI 文件到BOA 服務(wù)器的工作目錄下,在啟動(dòng)BOA 服務(wù)器后,就能在嵌入式系統(tǒng)上對(duì)HTTP 請(qǐng)求作出應(yīng)答,實(shí)現(xiàn)在Web 頁(yè)面上顯示嵌入式外圍硬件設(shè)備監(jiān)測(cè)到的各項(xiàng)生理指標(biāo)值(圖1)。

圖1 HTTP 請(qǐng)求及響應(yīng)架構(gòu)
外部CGI 程序與BOA 服務(wù)器進(jìn)行通信、傳遞有關(guān)參數(shù)和處理結(jié)果是通過環(huán)境變量、命令行參數(shù)和標(biāo)準(zhǔn)輸入來進(jìn)行的。服務(wù)器提供了客戶端(瀏覽器)與CGI 程序之間的信息交換的通道。CGI 的標(biāo)準(zhǔn)輸入是服務(wù)器的標(biāo)準(zhǔn)輸出,而CGI 的標(biāo)準(zhǔn)輸出是服務(wù)器的標(biāo)準(zhǔn)輸入。
CGIC 是一種基于C 語(yǔ)言標(biāo)準(zhǔn)庫(kù)文件設(shè)計(jì)的被廣泛使用的免費(fèi)開源代碼,并支持Linux、Unix、和Windows 等多種操作系統(tǒng),它能夠?qū)W(wǎng)頁(yè)閱讀器發(fā)來有缺陷的數(shù)據(jù)做對(duì)應(yīng)數(shù)據(jù)解析,并可以自動(dòng)校正,實(shí)現(xiàn)更為高效地完成CGI 程序設(shè)計(jì)任務(wù)[4]。在網(wǎng)上下載到CGIC 源碼壓縮包文件后,將其拷貝至UBUNTU 系統(tǒng)下,解壓后可見其中附帶著庫(kù)文件設(shè)計(jì)者所給出的cgitest.c文件,在進(jìn)行基于CGIC 庫(kù)文件的CGI 程序開發(fā)時(shí),可充分研究作者所給出的使用范例。在設(shè)計(jì)基于CGIC 庫(kù)的CGI 程序設(shè)計(jì)時(shí),工程目錄中應(yīng)當(dāng)包含cgic.c 以及cgic.h 這兩個(gè)文件,同時(shí)在Makefile 文件內(nèi)指定的依賴文件中,需要將這兩個(gè)文件添加進(jìn)去。與進(jìn)行普通CGI 程序設(shè)計(jì)不同的是,此時(shí)的CGI 程序不是在main()函數(shù)中完成編寫的,而是在cgiMain()函數(shù)中編寫的。在cgic.c 源文件的main()函數(shù)中會(huì)自動(dòng)完成對(duì)cgiMain()函數(shù)的調(diào)用。在編寫對(duì)應(yīng)的CGI 源程序文件中還應(yīng)當(dāng)包含cgic.h 這一頭文件。
當(dāng)有數(shù)據(jù)從客戶端瀏覽器傳到Web 服務(wù)器后,web 服務(wù)器會(huì)根據(jù)傳送的類型(基本有二類:GET/POST),將接收到的數(shù)據(jù)傳入QUERY_STRING 或其他變量中,CGI 程序可以通過標(biāo)準(zhǔn)輸入,在程序中接收web 服務(wù)器接收的數(shù)據(jù)。當(dāng)要向?yàn)g覽器發(fā)送信息時(shí),只要向Web 服務(wù)器發(fā)送特定的文件頭信息,即可通過標(biāo)準(zhǔn)輸出將信息發(fā)往Web 服務(wù)器,Web 服務(wù)器處理完由CGI 程序發(fā)來的信息后就會(huì)將信息發(fā)送給瀏覽器。瀏覽器端對(duì)數(shù)據(jù)進(jìn)行解析,即完成Web 頁(yè)面的顯示。
用GET 方式接收到的數(shù)據(jù)保存在Web 服務(wù)器的QUERY_STRING 變量里,而通過POST 方式接收到的數(shù)據(jù)是保存在Web 服務(wù)器中的變量里。兩種數(shù)據(jù)接收方式的區(qū)別是:以GET 方式接收的數(shù)據(jù)是有長(zhǎng)度限制,而用POST 方式接收的數(shù)據(jù)是沒有長(zhǎng)度限制的;以GET 方式發(fā)送數(shù)據(jù),可以通過在瀏覽器中填充URL 數(shù)據(jù)的形式來發(fā)送,但POST 方式發(fā)送的數(shù)據(jù)必須要通過form 形式才能發(fā)送。CGIC 庫(kù)主要函數(shù)說明:cgiFormResultType cgiFormString ( char *name, char *result, int max)用于從輸入域中copy 字符串。將域名max-1 字節(jié)中的字符拷貝到緩沖區(qū)result。若域不存在,則拷貝一個(gè)空串到result 緩沖區(qū)。在此函數(shù)中所有的新行由換行符代表。void cgiHeaderContentType(char *mimeType)用于告知瀏覽器返回的是什么類型的文檔。該函數(shù)需要在向?yàn)g覽器輸出之前被調(diào)用,否則將出錯(cuò)或?yàn)g覽器不能識(shí)別。用于處理選擇框的函數(shù):cgiFormResultType cgiFormSelectSingle ( char *name, char**choicesText, int choicesTotal, int *result, int defaultV) 函數(shù)把選擇的名字拷貝到choicesText,把選擇的個(gè)數(shù)拷貝到choicesTotal,把當(dāng)前的選擇拷貝到result。cgiFormResultType cgiFormSelectMultiple ( char *name, char **choicesText, int choicesTotal, int *result, int *invalid) 函數(shù)與cgiFormSelectSingle類似,指向整型數(shù)組的result 代表了選擇的項(xiàng)。 若復(fù)選框被選中,則cgiFormResultType cgiFormCheckboxSingle( char *name)函數(shù)返回cgiFormSuccess,否則返回cgiFormNotFound。
數(shù)字輸入函數(shù):cgiFormDoubleBounded ( char *name, double*result, double min, double max, double defaultV) 若輸入域中的浮點(diǎn)數(shù)在界限內(nèi)則取出并放入result 中。
在基于互聯(lián)網(wǎng)技術(shù)下的Web 開發(fā)設(shè)計(jì)中,一般都會(huì)將Web頁(yè)面的顯示設(shè)計(jì)和在后臺(tái)進(jìn)行數(shù)據(jù)處理的服務(wù)器程序設(shè)計(jì)進(jìn)行分離。Web 界面的顯示設(shè)計(jì)一般在美工和前端程序員的共同努力下完成,在本次系統(tǒng)設(shè)計(jì)中,無需追求過于炫麗的顯示界面,只需要使系統(tǒng)的內(nèi)容顯示具有清晰簡(jiǎn)潔的特點(diǎn)即可。HTML(Hyper Text Markup Language)是一種具有標(biāo)識(shí)性的超文本標(biāo)記語(yǔ)言,它使用標(biāo)記標(biāo)簽來描述網(wǎng)頁(yè)。標(biāo)簽一般是成對(duì)出現(xiàn)的由尖括號(hào)包圍的關(guān)鍵詞,結(jié)束標(biāo)簽比開始標(biāo)簽多一個(gè)/符號(hào)。以html 文件中十分重要的表單標(biāo)簽為例:。當(dāng)瀏覽器向服務(wù)器發(fā)出POST 請(qǐng)求時(shí),表單標(biāo)簽內(nèi)包含的元素名及元素值就會(huì)傳送到服務(wù)器端。
在HTML 中表單是一個(gè)包含表單元素(比如:文本域、下拉列表、單選框、復(fù)選框等)的區(qū)域。通常分為兩個(gè)部分:HTML 表單格式和處理數(shù)據(jù)的腳本,處理程序由標(biāo)簽的ACTION 屬性指定,每個(gè)輸入?yún)^(qū)都有一個(gè)NAME 屬性用來稱呼表單元素,當(dāng)表單數(shù)據(jù)被遞交給ACTION 中定義的處理程序時(shí),NAME 和其輸入內(nèi)容被以數(shù)字或字符的形式保存在環(huán)境變量中,腳本程序再通過讀取環(huán)境變量的方式獲得用戶輸入,根據(jù)編程語(yǔ)言的不同獲取環(huán)境變量的方式也不同,C 語(yǔ)言中可以通過stdlib 庫(kù)函數(shù)getenv()來獲得環(huán)境變量。
表單從瀏覽器發(fā)給服務(wù)器有兩種方法(即METHOD 屬性):GET 和POST。 GET 方法將數(shù)據(jù)打包放在環(huán)境變量QUERY_STRING 中作為URL 整體的一部分傳遞給服務(wù)器。POST 做很多類似GET 的事情,但是它是分離地傳遞數(shù)據(jù)給腳本的,程序要通過標(biāo)準(zhǔn)輸入獲得數(shù)據(jù)時(shí),POST 方式不會(huì)改變數(shù)據(jù),也就是說同樣的數(shù)據(jù)可以多次提交而不必重新輸入。需要注意的是當(dāng)數(shù)據(jù)量超過1024 個(gè)字節(jié)時(shí)只能使用POST 來傳遞,由于GET 將數(shù)據(jù)直接放到URL 中,數(shù)據(jù)的傳輸也就變得很不安全。
在CGI 程序中通過將要顯示的文本數(shù)據(jù)經(jīng)組合設(shè)計(jì)后編寫為HTML 文本傳送給BOA 服務(wù)器,BOA 服務(wù)器再將響應(yīng)報(bào)文傳送到瀏覽器端,就實(shí)現(xiàn)了在Web 瀏覽器上顯示系統(tǒng)界面及對(duì)系統(tǒng)各項(xiàng)監(jiān)測(cè)值的顯示和提示。
系統(tǒng)設(shè)計(jì)有用戶登錄界面和醫(yī)療監(jiān)測(cè)系統(tǒng)主界面,在系統(tǒng)輸入正確的登陸賬號(hào)及密碼后,即可成功進(jìn)入監(jiān)測(cè)界面,界面設(shè)計(jì)有監(jiān)測(cè)人體的五項(xiàng)生理指標(biāo),分別為血壓、體溫、心率、呼吸率以及血氧飽和度。當(dāng)系統(tǒng)監(jiān)測(cè)的各項(xiàng)指標(biāo)值處于非危險(xiǎn)區(qū)間時(shí),系統(tǒng)不對(duì)各項(xiàng)指標(biāo)值作提示;當(dāng)各項(xiàng)指標(biāo)值處于危險(xiǎn)區(qū)間內(nèi)時(shí),在對(duì)應(yīng)的指標(biāo)后面會(huì)有對(duì)應(yīng)的紅色警告文字提示。
本設(shè)計(jì)在UBUNTU 16 和Microsoft Edge 瀏覽器上進(jìn)行測(cè)試,實(shí)現(xiàn)了用戶登錄、監(jiān)測(cè)界面顯示以及對(duì)監(jiān)測(cè)指標(biāo)值的判斷處理。BOA 服務(wù)器搭建完成以后,將CGI 程序放到BOA 服務(wù)器的工作目錄下,然后在linux 終端中輸入./boa 命令啟動(dòng)BOA 服務(wù)器。在瀏覽器中輸入U(xiǎn)RL 地址:http://192.168.1.103/login.html,實(shí)現(xiàn)跳轉(zhuǎn)到登錄界面,在輸入正確的登錄名稱和登錄密碼后跳轉(zhuǎn)到監(jiān)測(cè)系統(tǒng)主界面。通過在CGI 程序中模擬各項(xiàng)指標(biāo)值為危險(xiǎn)值后,系統(tǒng)將在各項(xiàng)指標(biāo)值后顯示警告信息(圖2)。

圖2 測(cè)試界面
本次監(jiān)測(cè)系統(tǒng)響應(yīng)速度快,適用范圍廣,可用于醫(yī)院的各個(gè)科室,為醫(yī)療監(jiān)測(cè)項(xiàng)目設(shè)計(jì)提供了良好的參考方案。
本項(xiàng)目主要介紹了在嵌入式環(huán)境下搭建Web 服務(wù)器的方法,設(shè)計(jì)了醫(yī)療監(jiān)測(cè)系統(tǒng)界面,實(shí)現(xiàn)了BOA 服務(wù)器在linux 系統(tǒng)下的編譯運(yùn)行,結(jié)合CGI 程序?qū)崿F(xiàn)了BOA 服務(wù)器與Web 瀏覽器的數(shù)據(jù)交互,對(duì)設(shè)計(jì)基于嵌入式技術(shù)的醫(yī)療產(chǎn)品具有一定的參考價(jià)值。