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

表1 Makefile 文件修改對照
移植BOA 服務器時出現錯誤的原因大部分為boa.conf 配置文件配置錯誤,表2 列出來關于此配置文件中重要參數的說明以及常用值。

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

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

圖2 測試界面
本次監測系統響應速度快,適用范圍廣,可用于醫院的各個科室,為醫療監測項目設計提供了良好的參考方案。
本項目主要介紹了在嵌入式環境下搭建Web 服務器的方法,設計了醫療監測系統界面,實現了BOA 服務器在linux 系統下的編譯運行,結合CGI 程序實現了BOA 服務器與Web 瀏覽器的數據交互,對設計基于嵌入式技術的醫療產品具有一定的參考價值。