文獻(xiàn)標(biāo)識(shí)碼: B
文章編號(hào): 0258-7998(2011)08-0039-04
隨著醫(yī)院規(guī)模的逐漸擴(kuò)大,醫(yī)院的建筑結(jié)構(gòu)越來越復(fù)雜,。本文介紹的患者就醫(yī)導(dǎo)引系統(tǒng),,以嵌入式SQL和有源RFID技術(shù)為基礎(chǔ),能夠在患者就醫(yī)的整個(gè)過程中提供就醫(yī)路線的導(dǎo)引,,使患者就醫(yī)的體驗(yàn)更人性化,,同時(shí)可以提高醫(yī)生工作效率和各科室的協(xié)作化程度。現(xiàn)階段綜合性醫(yī)院普遍使用的分診叫號(hào)系統(tǒng)[1-2]只能對(duì)科室內(nèi)部的就診患者進(jìn)行分流,。
智能導(dǎo)醫(yī)系統(tǒng)由導(dǎo)醫(yī)終端(圖1中終端控制核心,、RFID閱讀器和LCD顯示器三部分),、局域網(wǎng),、服務(wù)器三部分組成。導(dǎo)醫(yī)終端配置若干個(gè),,分別安放于醫(yī)院走廊,、過道、電梯,、樓梯間等位置,。整個(gè)系統(tǒng)的示意圖如圖1所示。
構(gòu)建導(dǎo)醫(yī)系統(tǒng)的關(guān)鍵在于導(dǎo)醫(yī)終端的搭建和服務(wù)器上數(shù)據(jù)庫的建立,,而系統(tǒng)的網(wǎng)絡(luò)則可以依靠醫(yī)院原有的有線或無線局域網(wǎng),。就醫(yī)導(dǎo)引系統(tǒng)(以下簡(jiǎn)稱導(dǎo)醫(yī)系統(tǒng))的基本工作原理如下:
病人掛號(hào)時(shí)領(lǐng)取一張有源射頻卡(閱讀距離大于1 m),該卡周期性發(fā)射病人ID號(hào),。掛號(hào)的過程中,,將病人ID號(hào)與所要就診的科室等信息在數(shù)據(jù)庫中進(jìn)行關(guān)聯(lián)。當(dāng)病人行進(jìn)到導(dǎo)醫(yī)終端附近時(shí),,連接在導(dǎo)醫(yī)終端的射頻卡閱讀器將接收到病人ID號(hào),。導(dǎo)醫(yī)終端依據(jù)接收到的ID號(hào)發(fā)起數(shù)據(jù)庫檢索,檢索出病人掛號(hào)時(shí)建立的數(shù)據(jù)庫表項(xiàng),,如就診科室等相關(guān)信息,。最后,綜合檢索到的信息將就醫(yī)導(dǎo)引信息顯示在LCD屏幕上,。
1 硬件平臺(tái)構(gòu)建
導(dǎo)醫(yī)系統(tǒng)終端硬件平臺(tái)包括四個(gè)主要部分:終端控制核心,、RFID閱讀器、LCD顯示模塊和電源,。其硬件框圖如圖2所示,。
終端控制核心采用廣州友善之臂的mini6410開發(fā)板,,處理器內(nèi)核為ARM11。該處理器性能強(qiáng)勁,,能處理較低分辨率的視頻,。如果每個(gè)導(dǎo)醫(yī)系統(tǒng)終端控制核心都用PC機(jī)實(shí)現(xiàn),雖然能夠換取更高的性能,,但意味著每個(gè)終端的制作成本將大大增加,。這將導(dǎo)致醫(yī)院的運(yùn)作成本和患者就醫(yī)成本增加。
導(dǎo)醫(yī)終端采用臺(tái)式PC用的普通17英寸LCD作為顯示器,,屏幕較大,,用戶體驗(yàn)良好。由于終端的控制核心只有并行的LCD數(shù)據(jù)線,,所以需要LCD轉(zhuǎn)VGA模塊將視頻信號(hào)轉(zhuǎn)成VGA接口模式,。這個(gè)模塊采用的是友善之臂提供的方案。
RFID閱讀器模塊和病人攜帶的RFID標(biāo)簽是自行設(shè)計(jì)的一套有源RFID系統(tǒng),,閱讀距離1 m~5 m可調(diào),。有源RFID閱讀器與導(dǎo)醫(yī)系統(tǒng)終端控制核心采用UART串口連接。
另外,,直流電源采用普通的5 V開關(guān)電源,。USB接口可以在單獨(dú)調(diào)試每個(gè)導(dǎo)醫(yī)終端上的程序時(shí),外接USB鍵盤或鼠標(biāo),。RJ45是外接網(wǎng)線的物理接口,,每個(gè)終端通過這個(gè)接口獲取患者的完整信息。目前市面上也有很多USB接口的無線網(wǎng)卡,,也可以無線局域網(wǎng)的形式將導(dǎo)醫(yī)終端連接到局域網(wǎng),。如果采用USB無線網(wǎng)卡的方式,則需要通過USB Hub來擴(kuò)充核心控制板上的USB接口,,并移植相應(yīng)的驅(qū)動(dòng),。
2 軟件平臺(tái)構(gòu)建
導(dǎo)醫(yī)終端的硬件平臺(tái)建立后需要構(gòu)建運(yùn)行于其上的軟件平臺(tái),作為上層應(yīng)用程序運(yùn)行的基礎(chǔ),。由于導(dǎo)醫(yī)終端采用ARM-Linux嵌入式系統(tǒng)設(shè)計(jì),,除了OEM廠商提供的軟件包外,很多其他要用到的庫都需要自己修改或移植[3-4],。
2.1 數(shù)據(jù)庫訪問
應(yīng)用程序訪問數(shù)據(jù)庫的方式如圖3所示,。在ARM硬件平臺(tái)、Linux操作系統(tǒng)下也不例外,。
本文介紹的導(dǎo)醫(yī)系統(tǒng)的數(shù)據(jù)庫是用Microsoft SQL Server建立的,。SQL Server(及SyBase)使用TDS(Tabular_
Data_Stream)作為其數(shù)據(jù)庫現(xiàn)客戶端傳輸?shù)膮f(xié)議,它對(duì)應(yīng)于圖中的ODBC驅(qū)動(dòng),。Linux下有此協(xié)議的免費(fèi)版——freetds,,將其移植到ARMLinux平臺(tái)作為訪問SQL Server的ODBC驅(qū)動(dòng),。ODBC可以移植unixODBC和QT自帶的ODBC庫。
2.2 ODBC庫及其驅(qū)動(dòng)移植
系統(tǒng)中帶有相應(yīng)的ODBC驅(qū)動(dòng)和ODBC庫文件,,是以O(shè)DBC方式在嵌入式系統(tǒng)中訪問SQL數(shù)據(jù)庫的必需條件,。這些庫和驅(qū)動(dòng)可以通過下載相應(yīng)軟件包,經(jīng)過交叉編譯并拷貝到ARM-Linux平臺(tái)相應(yīng)目錄來實(shí)現(xiàn)移植,。而在交叉編譯之前必須對(duì)其進(jìn)行重新配置,,否則無法生成合適的庫或驅(qū)動(dòng)。
2.2.1 unixODBC-2.2.12的交叉編譯(arm體系)
配置選項(xiàng)如下:(--prefix選項(xiàng)指定把編譯好的包釋放到什么地方)
./configure --host=arm-linux --prefix=/usr/local/arm/unixODBC-arm-iconv-2.2.12 --disable-gui --enable-iconv --enable-static
然后make & make install,。
另外還要編譯一個(gè)x86體系的unixODBC-2.2.12,,因?yàn)榻徊婢幾gfreetds-0.82時(shí)要用到。
2.2.2 unixODBC-2.2.12的x86體系編譯
配置選項(xiàng)如下:(與上面不同的是去掉了--host=arm-linux 選項(xiàng))
./configure --prefix=/usr/local/arm/unixODBC-x86-2.2.12 --disable-gui --disable-iconv --enable-static
然后make & make install,。
2.2.3 交叉編譯freetds-0.82
配置選項(xiàng)如下:
./configure --prefix=/usr/local/arm/freetds --with-tdsver=8.0 --disable-libiconv --host=arm-linux --with-unixodbc=/usr/local/arm/unixODBC-x86-2.2.12 --with-gnu-ld --enable-shared --enable-static --enable-msdblib --enable-dbmfix
將arm體系unixODBC目錄下的庫lib文件夾拷貝到x86體系unixODBC目錄下,,替換x86下的庫,然后make & make install,。
2.2.4 QT ODBC庫的移植
如果需要在QT下直接通過ODBC方式訪問SQL Server,,則開發(fā)板中還必需含有QODBC,這需要在交叉編譯QT4的庫時(shí)候加上配置選項(xiàng)-qt-sql-odbc 或者如下配置:
./configure -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -iconv -qt-sql-odbc -I/usr/local/arm/unixODBC-x86-2.2.12/include -L/usr/local/arm/unixODBC-x86-2.2.12/lib
然后make & make install,,再將新編譯得到的lib目錄下的 *Sql*文件拷貝到開發(fā)板下,,替換原來的文件,。如果配置時(shí)添加的是 -plugin-sql-odbc 選項(xiàng),,需要將plgins/Sqldrivers/目錄下的所有文件拷貝到開發(fā)板相同目錄下。
2.3 SQL Server數(shù)據(jù)庫構(gòu)建[5]
導(dǎo)醫(yī)系統(tǒng)終端接收到病人ID號(hào)后將檢索數(shù)據(jù)庫,。這個(gè)數(shù)據(jù)庫的構(gòu)建直接關(guān)系到給出的導(dǎo)醫(yī)信息是否正確,。試驗(yàn)階段采用如圖4的數(shù)據(jù)庫結(jié)構(gòu)。該數(shù)據(jù)庫一共由5個(gè)表組成:(1)Patient表,。記錄病人姓名,,將要前往就診的科室等信息;(2)Department表,。記錄醫(yī)院科室名稱及所在物理位置等信息,;(3)Terminal表。記錄終端機(jī)IP地址及所在物理位置等信息,;(4)Position表,。表示綜合終端機(jī)與科室相對(duì)位置關(guān)系,它的表項(xiàng)直接關(guān)系到導(dǎo)醫(yī)終端給出的方向指引是否正確,;(5)Information表,。綜合上述所有表給出導(dǎo)醫(yī)所需的信息:病人姓名、將要去往的就診科室和相對(duì)方向(將要去往就診的科室的方向),。應(yīng)用程序只要依據(jù)病人ID檢索到information表即可獲取就醫(yī)導(dǎo)引所需的完整信息,。
SQL Server數(shù)據(jù)庫在試驗(yàn)階段能夠比較完整地實(shí)現(xiàn)系統(tǒng)功能,,實(shí)際使用時(shí)需要依據(jù)每個(gè)醫(yī)院的實(shí)際情況進(jìn)行調(diào)整。導(dǎo)醫(yī)系統(tǒng)應(yīng)用于實(shí)際醫(yī)院時(shí)可能需要另外構(gòu)建一個(gè)數(shù)據(jù)庫服務(wù)器,,并與醫(yī)院現(xiàn)有的HIS系統(tǒng)進(jìn)行連接,,以共享一套病人掛號(hào)科室等其他信息。
3 應(yīng)用程序
導(dǎo)醫(yī)終端上的應(yīng)用程序采用QT4編程實(shí)現(xiàn)[6],。QT是一個(gè)基于C++的圖形用戶界面庫,。它的跨平臺(tái)特性比較好,編輯好的程序代碼幾乎不需做修改就可以編譯出運(yùn)行于其他平臺(tái)的可執(zhí)行程序,。應(yīng)用程序的核心是檢測(cè)串口接收緩沖區(qū),,當(dāng)串口接收緩沖區(qū)存在有效的病人ID號(hào),即依據(jù)該ID號(hào)發(fā)起一次數(shù)據(jù)庫連接與檢索,。不同于普通PC環(huán)境,,在ARMLinux平臺(tái)下,需要解決三個(gè)核心問題:ARM-Linux下串口通信,、漢字字符集兼容和SQL Server數(shù)據(jù)庫連接等,。
3.1 ARM-Linux下串口通信
QT下沒有提供串口通信的控件,但是提供了第三方的串口通信類qextserialport,。本系統(tǒng)即是采用該類完成了ARM-Linux下的串口通信,。該類繼承自QIODevice類,可分為Win_QextSerialPort和Posix_QextSerialPort,,分別支持Windows和Linux兩種環(huán)境下的編譯,。在Linux下需要添加 #define _TTY_POSIX_宏定義,以確保選擇正確的條件編譯,。通過以下代碼即可打開串口ttySAC3,,并設(shè)置波特率為9 600 Kb/s,無流控制和奇偶校驗(yàn),, 8位數(shù)據(jù)位,,1位停止位。
port=new Posix_QextSerialPort("/dev/ttySAC3",
QextSerialBase::EventDriven);
port->setBaudRate(BAUD9600);
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);
3.2 字符集的轉(zhuǎn)換
Linux系統(tǒng)下漢字一般采用Unicode編碼,,而Windows系統(tǒng)下漢字一般采用GBK編碼,。如果將檢索的結(jié)果做了不正確的轉(zhuǎn)化,則顯示的漢字將出現(xiàn)亂碼,。這個(gè)問題可從以下兩個(gè)方面來解決:
(1)移植freetds和unixODBC時(shí),,要將配置選項(xiàng)iconv設(shè)置為disable。具體來說,,unixODBC的配置選項(xiàng)中一定要有--disable-iconv,,freetds的配置選項(xiàng)中一定要有--disable-libiconv。這樣做可以避免ODBC和ODBC驅(qū)動(dòng)進(jìn)行字符集的自動(dòng)轉(zhuǎn)換,從而避免出現(xiàn)無法預(yù)見的字符集不兼容問題,。
(2)QT為世界上多數(shù)語系提供廣泛支持,。在編寫QT程序時(shí)一定要在主程序中添加相關(guān)代碼,定義好程序的字符編碼類型,。如果希望應(yīng)用程序用UTF8編碼,,可以添加如下代碼:
QTextCodec::setCodecForLocale(QTextCodec::codecForName
("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName
("UTF8"));
QTextCodec::setCodecForTr (QTextCodec::codecForName
("UTF8"));
3.3 數(shù)據(jù)庫的連接與檢索
為了實(shí)現(xiàn)數(shù)據(jù)庫的連接,需對(duì)freetds和unixODBC進(jìn)行必要的配置,。這可以通過修改freetds.conf文件,、odbc.ini和odbcinst.ini文件來實(shí)現(xiàn),這些文件分別在各自的安裝目錄下,。有了unixODBC和freetds的支持,,通過QT的ODBC庫QODBC就可以訪問Windows XP下的SQL Server數(shù)據(jù)庫了。
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("dbHospital");
db.setUserName(QString("BME"));
db.setPassword(QString("123456"));
db.setConnectOptions("SQL_ATTR_ODBC_VERSION=
SQL_OV_ODBC3");
由于QODBC會(huì)自動(dòng)調(diào)用unixODBC和freetds的配置文件,,所以不用調(diào)用setHostName()函數(shù)單獨(dú)設(shè)置數(shù)據(jù)主機(jī)名,。實(shí)現(xiàn)了數(shù)據(jù)庫的連接,數(shù)據(jù)庫的檢索就相對(duì)簡(jiǎn)單了,。QSqlQuery提供了一套檢索數(shù)據(jù)庫的簡(jiǎn)單方式,。
4 實(shí)驗(yàn)與討論
經(jīng)實(shí)驗(yàn)驗(yàn)證,該導(dǎo)醫(yī)系統(tǒng)能夠正確接收有源RFID標(biāo)簽發(fā)射的病人ID號(hào),,并以此發(fā)起數(shù)據(jù)庫檢索,,檢索得到病人就醫(yī)的相關(guān)信息后在終端上顯示導(dǎo)引信息。
該導(dǎo)醫(yī)系統(tǒng)不僅可以完成就醫(yī)導(dǎo)引的任務(wù),,還可以擴(kuò)展其他功能,。例如,可以修改終端程序,,使系統(tǒng)空閑時(shí)插播藥品廣告,,這可以進(jìn)一步減小系統(tǒng)成本,。
另外,,可以修改導(dǎo)醫(yī)系統(tǒng)終端上的應(yīng)用程序,使RFID閱讀器實(shí)現(xiàn)遠(yuǎn)程控制,。例如遠(yuǎn)程控制閱讀器的開啟和關(guān)閉,、增益設(shè)置等。實(shí)現(xiàn)方式是在導(dǎo)醫(yī)終端的后臺(tái)運(yùn)行一個(gè)服務(wù)程序,。該程序一直監(jiān)聽一個(gè)socket端口,,當(dāng)收到有效的RFID控制指令時(shí),將該控制指令寫入到UART發(fā)送緩沖區(qū),。RFID閱讀器上的程序收到命令后將執(zhí)行相關(guān)操作,。
該智能導(dǎo)醫(yī)系統(tǒng)整合了有源RFID技術(shù)、嵌入式系統(tǒng)和數(shù)據(jù)庫等軟硬件技術(shù),能夠?yàn)榛颊咛峁┯押玫木歪t(yī)導(dǎo)引信息,,也可以間接為醫(yī)院提供信息發(fā)布平臺(tái),,有較好的實(shí)用價(jià)值。整個(gè)系統(tǒng)還處于試驗(yàn),、設(shè)計(jì)階段,,應(yīng)用于實(shí)際還需要較長(zhǎng)時(shí)間的完善與驗(yàn)證。后續(xù)的工作將集中于功能的整合,、完善和儲(chǔ)存導(dǎo)醫(yī)信息數(shù)據(jù)庫建設(shè),。
參考文獻(xiàn)
[1] 張忠安,齊俊傳.門診排隊(duì)叫號(hào)系統(tǒng)設(shè)計(jì)[J].醫(yī)療衛(wèi)生裝備,,2006(10).
[2] 李俊,,高錄濤.掛號(hào)分診的方法及技巧探討[J].中國誤診學(xué)雜志,2009(20).
[3] Bi Chunyue.Research and application of SQLite embedded database technology[J].WSEAS Transactions on Computers,,2009,,8(1):83-92.
[4] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2009.
[5] 孫明麗.SQL Server 2005數(shù)據(jù)庫系統(tǒng)開發(fā)完全手冊(cè)(第一版)[M].北京:人民郵電出版社,,2007.
[6] BLANCHETTE J,,SUMMERFIELD M.C++ GUI programming with QT4(second edition)[M].BeiJing:Publishing House of Electronics Industry,2008.