俞坤游,陳益民,駱德漢,梁耀普
(1.廣東工業(yè)大學(xué) 信息工程學(xué)院,廣東 廣州 510006;2.廣州能迪自動(dòng)化設(shè)備有限公司,廣東 廣州 510000)
近年來(lái),隨著信息技術(shù)的快速發(fā)展,國(guó)內(nèi)越來(lái)越多的醫(yī)院加速實(shí)施基于網(wǎng)絡(luò)化平臺(tái)、HIS系統(tǒng)的整體建設(shè),以提高服務(wù)水平和核心競(jìng)爭(zhēng)力。眾所周知,查房是醫(yī)生護(hù)士每天例行的工作,傳統(tǒng)模式下,護(hù)士、醫(yī)生們通常要帶上一大堆的病例本,并以手寫方式記錄病人的實(shí)時(shí)病情等信息。這樣既不利于提高查房效率,也容易因錄入和識(shí)別而產(chǎn)生誤差[1]。
隨著Android系統(tǒng)的日益普及?;贏ndroid平臺(tái)開發(fā)的各種技術(shù)應(yīng)用也越來(lái)越廣泛。本文描述了基于WebService技術(shù)Android平臺(tái)的查房系統(tǒng)的設(shè)計(jì)與開發(fā),模擬器上實(shí)現(xiàn)了護(hù)士查詢病情基本信息,病情記錄、健康評(píng)測(cè)等功能。
Android系統(tǒng)架構(gòu)一共包含4層,分別是應(yīng)用程序?qū)?、?yīng)用框架層、系統(tǒng)運(yùn)行庫(kù)和Linux內(nèi)核層[2-3]。通常所說(shuō)的應(yīng)用就是在最上層(即應(yīng)用層)進(jìn)行開發(fā)的。Android的應(yīng)用程序開發(fā)需要用到許多工具,包括編譯器、調(diào)試器、模擬器等。因此,搭建一個(gè)良好的開發(fā)環(huán)境是進(jìn)行系統(tǒng)開發(fā)的前提。首先,需要下載 Android SDK、Java JDK、Eclipse、Eclipse ADT插件。其次安裝JDK并配置好 JDK的環(huán)境變量;然后安裝Android SDK和Eclipse ADT插件,打開SDK Manager下載所需要的Android系統(tǒng)平臺(tái)文件;最后配置Eclipse下的Android SDK和JDK的安裝路徑。
WebService的設(shè)計(jì)思想是充分利用Web分布式編程模型的松散耦合性,允許各種平臺(tái)、各種編程語(yǔ)言的應(yīng)用,實(shí)現(xiàn)數(shù)據(jù)交換,并無(wú)縫地整合在一起。即WebService可以用來(lái)消除不同平臺(tái)、不同語(yǔ)言之間的差異,將現(xiàn)有的應(yīng)用程序發(fā)布成開放式服務(wù),從而允許互聯(lián)網(wǎng)上任何地方、任何平臺(tái)、任何語(yǔ)言的應(yīng)用程序訪問(wèn)該服務(wù)[4]。
WebService主要體現(xiàn)在的如下幾個(gè)標(biāo)準(zhǔn)和協(xié)議為:
(1)可擴(kuò)展標(biāo)記語(yǔ)言(XML),WebService采用XML進(jìn)行數(shù)據(jù)傳輸,并建立在XML之上。
(2)即簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP),主要是用于分布式的環(huán)境中交換信息的協(xié)議。SOAP采用XML消息格式,可以使用不同的操作系統(tǒng)、不同的語(yǔ)言之間進(jìn)行通信。WebService就是使用SOAP作為它的標(biāo)準(zhǔn)通信協(xié)議[5]。
(3)WebService描述語(yǔ)言(WSDL),也是基于 XML格式描述的,定義了該WebService的位置、功能及如何通信等。根據(jù)WebService技術(shù)的特點(diǎn),實(shí)現(xiàn)路線圖如圖1所示。
圖1 技術(shù)路線圖
Android系統(tǒng)的應(yīng)用層采用Java語(yǔ)言編寫,其中包括了Java的很多功能。但是由于Android系統(tǒng)沒有相應(yīng)的WebService庫(kù)文件,因此在Android平臺(tái)上需要使用第三方軟件包ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar。該軟件包是一個(gè)開源項(xiàng)目,為Android平臺(tái)提供了一個(gè)輕量級(jí)而高效的SOAP庫(kù)[6]。
使用ksoap2-android開發(fā)應(yīng)用的步驟大致如下:
(1)首先客戶端和服務(wù)器之間要商量好所要連接的地址和接口。根據(jù)服務(wù)器端生成WSDL文檔,找出命名空間和接口函數(shù)以及所需要傳入的參數(shù)。SoapObject object=new SoapObject(nameSpace,method)根據(jù)接口函數(shù)傳入相關(guān)參數(shù) object.addProperty(“param”,value),其中 param是參數(shù)類型,value是參數(shù)值。
(2)使用SoapEnvelope.VER11對(duì)Soap協(xié)議版本初始化描述,確定發(fā)送對(duì)象 envelope.bodyout=object。
(3)實(shí)例化HttpTransportSE類的對(duì)象,調(diào)用transport.call(action,envelope)傳送數(shù)據(jù),其中 action為 WSDL中所要調(diào)用的接口函數(shù)soapaction。
(4)使用SoapObject result=(SoapObject)envelope.getResponse()獲取返回的結(jié)果。
實(shí)現(xiàn)WebService數(shù)據(jù)在網(wǎng)絡(luò)中傳輸所需的數(shù)據(jù)量較大,因此,需要將自定義類轉(zhuǎn)換成Json格式的字符串String,然后再由服務(wù)器端添加一個(gè)第三方Json解析包,解析客戶端傳遞的Json轉(zhuǎn)換string的類型參數(shù),這樣不僅使數(shù)據(jù)量得到優(yōu)化,而且提高了傳輸速率,減少了傳輸時(shí)間。
根據(jù)護(hù)士的需求和軟件的特點(diǎn),系統(tǒng)的功能設(shè)計(jì)如圖2所示。
圖2 系統(tǒng)功能結(jié)構(gòu)
本系統(tǒng)開發(fā)使用了 SQLite[7]數(shù)據(jù)庫(kù),Android系統(tǒng)本身集成了SQLite,提供了一些新的 API來(lái)使用 SQLite數(shù)據(jù)庫(kù),通過(guò)使用這些API便可實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。
本模塊先調(diào)用WifiManager服務(wù),檢查平板電腦,確定打開WiFi,再通過(guò)WebService傳入賬號(hào)和密碼進(jìn)入主界面。同時(shí),需要在AndroidMainfest.xml文件中設(shè)置獲取WiFi權(quán)限和聯(lián)網(wǎng)權(quán)限。
登錄成功之后,系統(tǒng)會(huì)讓主線程中通過(guò)new Thread()開啟一個(gè)線程,通過(guò)WebService加載病人列表,并通過(guò)SoapObject函數(shù)getProperty來(lái)解析數(shù)據(jù)包,詳細(xì)解析需查看SoapObject的API說(shuō)明,解析后的數(shù)據(jù)以與服務(wù)器約定好的自定義類的形式存放在本地?cái)?shù)據(jù)庫(kù)SQLite[8-10]。由于 Android系統(tǒng)的主線程(UI線程)是安全的,線程與線程之間的通信可使用或繼承Hander類的對(duì)象,通過(guò)發(fā)送Message互相通信。當(dāng)系統(tǒng)主線程收到Message時(shí),主線程開始加載顯示從本地?cái)?shù)據(jù)庫(kù)讀取的病人信息,并進(jìn)行按照字母排序、位置排序以及搜素病人的操作。這三部分操作都是通過(guò)對(duì)SQLite數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行排序、搜索操作的。通過(guò)使用和設(shè)置ListView控件及其適配器,將要顯示的數(shù)據(jù)以視圖的方式映射在ListView列表上,從而實(shí)現(xiàn)了數(shù)據(jù)與ListView的綁定。其流程如圖3所示。
圖3 獲取病人信息流程圖
當(dāng)選擇一個(gè)病人之后,系統(tǒng)會(huì)通過(guò)WebService[11]提供的接口傳遞參數(shù)numid(病人證件號(hào))到服務(wù)器,以獲取該病人的信息,默認(rèn)顯示對(duì)應(yīng)病人的基本信息表。如果網(wǎng)絡(luò)沒有連接上,該頁(yè)面會(huì)以Toast通知的形式出現(xiàn)提示,同時(shí)讀取本地的數(shù)據(jù)庫(kù)SQLite加載、顯示之前下載的相對(duì)應(yīng)的病人信息。如果連接成功,獲取到的這些信息存在SoapObject對(duì)象中,通過(guò)getProperty解析獲取該類每一個(gè)屬性,同時(shí),再把該病人的信息寫入本地?cái)?shù)據(jù)庫(kù)SQLite以覆蓋原來(lái)的數(shù)據(jù),然后再將信息設(shè)置到Layout布局文件中,最后用Fragment類將信息顯示出來(lái)。Fragment[11]是 Android3.0以上系統(tǒng)才有的特性,是為了解決不同屏幕分辯率的動(dòng)態(tài)的UI設(shè)計(jì)。為此,需要在Activity中通過(guò) getFragmentManager()獲取 FragmentManager對(duì)象,通過(guò)FragmentManager類方法來(lái)更新UI。如果需要對(duì)修改后的病人信息進(jìn)行保存,系統(tǒng)會(huì)通過(guò)WebService相應(yīng)接口函數(shù),將病人信息用SoapObject對(duì)象的addProperty(“param”,value)方法以參數(shù)的形式提交到服務(wù)器端保存。同時(shí),由于病人信息是服務(wù)器和客戶端約定好的自定義類,傳遞自定義類對(duì)象時(shí),需要自定義類使用Json轉(zhuǎn)化成String類字符串。
選擇病情記錄后,就會(huì)跳轉(zhuǎn)到病情記錄界面,需要開啟另外一個(gè)線程從服務(wù)器獲取信息。系統(tǒng)會(huì)在這時(shí)將病人證號(hào)numid通過(guò)WebService傳遞到服務(wù)器,獲取SoapObject,根據(jù)病情記錄相關(guān)類用getProperty解析SoapObject。病情記錄頁(yè)面上包含病情檢查記錄、實(shí)時(shí)病情記錄記錄以及醫(yī)囑記錄。這些信息都將在網(wǎng)絡(luò)獲取之后,存放在本地SQLite數(shù)據(jù)庫(kù),每獲取一次就會(huì)覆蓋上次SQLite數(shù)據(jù)中相應(yīng)信息,只保留一個(gè)副本。護(hù)士將實(shí)時(shí)檢查的信息存儲(chǔ)到實(shí)時(shí)病情記錄中,通過(guò)WebService接口,將所需要提交的數(shù)據(jù)用addProperty方法發(fā)送至服務(wù)器。傳遞的信息同樣是自定義類,因此必須使用Json類將其轉(zhuǎn)化成字符串。
該模塊主要是通過(guò)病人配合護(hù)士做一系列題目,然后計(jì)算出得分來(lái)評(píng)估病人的健康狀態(tài)。單擊健康評(píng)測(cè),系統(tǒng)會(huì)列出歷史評(píng)測(cè)記錄。評(píng)測(cè)系統(tǒng)會(huì)先通過(guò)get-SharedPreferences[12]調(diào)用 SharedPreferences對(duì)象,寫入選中病人證件號(hào)numid的鍵值對(duì)。SharePreference是Android系統(tǒng)輕量級(jí)存儲(chǔ)器,可以用來(lái)保存和共享值或者參數(shù)。評(píng)測(cè)完成后,系統(tǒng)會(huì)將病人證號(hào)numid、評(píng)測(cè)項(xiàng)目名稱及分?jǐn)?shù),通過(guò)WebService提交到服務(wù)器。同樣病人的評(píng)測(cè)成績(jī)也是自定義類,因此也需要Json化轉(zhuǎn)化成字符串。
在Eclipse開發(fā)環(huán)境中,由遠(yuǎn)程服務(wù)器端模擬完成用于測(cè)試的相關(guān)病人信息,平板的系統(tǒng)為Android4.0,測(cè)試結(jié)果如圖4所示。通過(guò)病人基本信息界面,可以查看相修改關(guān)信息,并將之保存到服務(wù)器。圖5是病情記錄界面,可以查看相關(guān)歷史病情記錄信息。除了上述界面之外,還有健康評(píng)測(cè)、評(píng)測(cè)試卷等界面。
通過(guò)使用第三方類庫(kù)將WebService技術(shù)與Android應(yīng)用程序開發(fā)相結(jié)合,實(shí)現(xiàn)了Android客戶端與遠(yuǎn)程服務(wù)器之間的通信連接,同時(shí)可應(yīng)用于護(hù)士查房系統(tǒng)。該系統(tǒng)具有一定的實(shí)用性,為醫(yī)療鄰域的發(fā)展提供了一個(gè)良好的方案。
圖4 基本信息界面
圖5 病情記錄界面
[1]高山.無(wú)線移動(dòng)查房解決方案[J].中國(guó)數(shù)字醫(yī)學(xué),2007,2(3):53-55.
[2]楊豐盛.Android應(yīng)用開發(fā)揭秘[M].北京:機(jī)械工業(yè)出版社,2010.
[3]倪紅軍,錢昌俊.基于 Android平臺(tái)的自發(fā)短信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2012,38(12):126-129.
[4]李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2010.
[5]肖維民,韋津華.基于WebService的車險(xiǎn)移動(dòng)勘察系統(tǒng)[J].計(jì)算機(jī)應(yīng)用與軟件,2012(6):239-241.
[6]閔現(xiàn)暢,黃理燦.基于Android平臺(tái)的Web服務(wù)技術(shù)研究[J].工業(yè)控制計(jì)算機(jī),2011,24(4):92-94.
[7]劉安站,賈曉輝.基于 Android的私密短信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2012,31(17):51-52.
[8]Android Developers.[EB/OL].[2013-08-07].http://developer.android.com/guide/components/index.html.
[9]佘志龍,陳昱勛,鄭名杰,等.Android SDK開發(fā)范例大全[M].北京:人民郵電出版社,2011.
[10]王家林.大話企業(yè)級(jí)Android開發(fā)[M].北京:電子工業(yè)出版社,2011.
[11]戈改珍,解爭(zhēng)龍,張琨.基于 Android的火車時(shí)刻表查詢系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2012,35(4):41-44.
[12]郭宏志.Android應(yīng)用開發(fā)詳解[M].北京:電子工業(yè)出版社,2010.