文獻(xiàn)標(biāo)識碼: B
文章編號: 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é)作化程度?,F(xiàn)階段綜合性醫(yī)院普遍使用的分診叫號系統(tǒng)[1-2]只能對科室內(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)(以下簡稱導(dǎo)醫(yī)系統(tǒng))的基本工作原理如下:
病人掛號時(shí)領(lǐng)取一張有源射頻卡(閱讀距離大于1 m),該卡周期性發(fā)射病人ID號。掛號的過程中,將病人ID號與所要就診的科室等信息在數(shù)據(jù)庫中進(jìn)行關(guān)聯(lián)。當(dāng)病人行進(jìn)到導(dǎo)醫(yī)終端附近時(shí),連接在導(dǎo)醫(yī)終端的射頻卡閱讀器將接收到病人ID號。導(dǎo)醫(yī)終端依據(jù)接收到的ID號發(fā)起數(shù)據(jù)庫檢索,檢索出病人掛號時(shí)建立的數(shù)據(jù)庫表項(xiàng),如就診科室等相關(guān)信息。最后,綜合檢索到的信息將就醫(yī)導(dǎo)引信息顯示在LCD屏幕上。
1 硬件平臺構(gòu)建
導(dǎo)醫(yī)系統(tǒng)終端硬件平臺包括四個(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ī)終端采用臺式PC用的普通17英寸LCD作為顯示器,屏幕較大,用戶體驗(yàn)良好。由于終端的控制核心只有并行的LCD數(shù)據(jù)線,所以需要LCD轉(zhuǎn)VGA模塊將視頻信號轉(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 軟件平臺構(gòu)建
導(dǎo)醫(yī)終端的硬件平臺建立后需要構(gòu)建運(yùn)行于其上的軟件平臺,作為上層應(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硬件平臺、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é)議,它對應(yīng)于圖中的ODBC驅(qū)動(dòng)。Linux下有此協(xié)議的免費(fèi)版——freetds,將其移植到ARMLinux平臺作為訪問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平臺相應(yīng)目錄來實(shí)現(xiàn)移植。而在交叉編譯之前必須對其進(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號后將檢索數(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ī)與科室相對位置關(guān)系,它的表項(xiàng)直接關(guān)系到導(dǎo)醫(yī)終端給出的方向指引是否正確;(5)Information表。綜合上述所有表給出導(dǎo)醫(yī)所需的信息:病人姓名、將要去往的就診科室和相對方向(將要去往就診的科室的方向)。應(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)行連接,以共享一套病人掛號科室等其他信息。
3 應(yīng)用程序
導(dǎo)醫(yī)終端上的應(yīng)用程序采用QT4編程實(shí)現(xiàn)[6]。QT是一個(gè)基于C++的圖形用戶界面庫。它的跨平臺特性比較好,編輯好的程序代碼幾乎不需做修改就可以編譯出運(yùn)行于其他平臺的可執(zhí)行程序。應(yīng)用程序的核心是檢測串口接收緩沖區(qū),當(dāng)串口接收緩沖區(qū)存在有效的病人ID號,即依據(jù)該ID號發(fā)起一次數(shù)據(jù)庫連接與檢索。不同于普通PC環(huán)境,在ARMLinux平臺下,需要解決三個(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ù)庫的連接,需對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ù)庫的檢索就相對簡單了。QSqlQuery提供了一套檢索數(shù)據(jù)庫的簡單方式。
4 實(shí)驗(yàn)與討論
經(jīng)實(shí)驗(yàn)驗(yàn)證,該導(dǎo)醫(yī)系統(tǒng)能夠正確接收有源RFID標(biāo)簽發(fā)射的病人ID號,并以此發(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ī)終端的后臺運(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ā)布平臺,有較好的實(shí)用價(jià)值。整個(gè)系統(tǒng)還處于試驗(yàn)、設(shè)計(jì)階段,應(yīng)用于實(shí)際還需要較長時(shí)間的完善與驗(yàn)證。后續(xù)的工作將集中于功能的整合、完善和儲存導(dǎo)醫(yī)信息數(shù)據(jù)庫建設(shè)。
參考文獻(xiàn)
[1] 張忠安,齊俊傳.門診排隊(duì)叫號系統(tǒng)設(shè)計(jì)[J].醫(yī)療衛(wèi)生裝備,2006(10).
[2] 李俊,高錄濤.掛號分診的方法及技巧探討[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ā)完全手冊[M].北京:人民郵電出版社,2009.
[5] 孫明麗.SQL Server 2005數(shù)據(jù)庫系統(tǒng)開發(fā)完全手冊(第一版)[M].北京:人民郵電出版社,2007.
[6] BLANCHETTE J,SUMMERFIELD M.C++ GUI programming with QT4(second edition)[M].BeiJing:Publishing House of Electronics Industry,2008.