基于有源RFID的智能導(dǎo)醫(yī)系統(tǒng)
隨著醫(yī)院規(guī)模的逐漸擴(kuò)大,醫(yī)院的建筑結(jié)構(gòu)越來(lái)越復(fù)雜。本文介紹的患者就醫(yī)導(dǎo)引系統(tǒng),以嵌入式SQL和有源RFID技術(shù)為基礎(chǔ),能夠在患者就醫(yī)的整個(gè)過(guò)程中提供就醫(yī)路線的導(dǎo)引,使患者就醫(yī)的體驗(yàn)更人性化,同時(shí)可以提高醫(yī)生工作效率和各科室的協(xié)作化程度?,F(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ī)院走廊、過(guò)道、電梯、樓梯間等位置。整個(gè)系統(tǒng)的示意圖如圖1所示。
構(gòu)建導(dǎo)醫(yī)系統(tǒng)的關(guān)鍵在于導(dǎo)醫(yī)終端的搭建和服務(wù)器上數(shù)據(jù)庫(kù)的建立,而系統(tǒng)的網(wǎng)絡(luò)則可以依靠醫(yī)院原有的有線或無(wú)線局域網(wǎng)。就醫(yī)導(dǎo)引系統(tǒng)(以下簡(jiǎn)稱(chēng)導(dǎo)醫(yī)系統(tǒng))的基本工作原理如下:
病人掛號(hào)時(shí)領(lǐng)取一張有源射頻卡(閱讀距離大于1 m),該卡周期性發(fā)射病人ID號(hào)。掛號(hào)的過(guò)程中,將病人ID號(hào)與所要就診的科室等信息在數(shù)據(jù)庫(kù)中進(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ù)庫(kù)檢索,檢索出病人掛號(hào)時(shí)建立的數(shù)據(jù)庫(kù)表項(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開(kāi)發(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作為顯示器,屏幕較大,用戶(hù)體驗(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開(kāi)關(guān)電源。USB接口可以在單獨(dú)調(diào)試每個(gè)導(dǎo)醫(yī)終端上的程序時(shí),外接USB鍵盤(pán)或鼠標(biāo)。RJ45是外接網(wǎng)線的物理接口,每個(gè)終端通過(guò)這個(gè)接口獲取患者的完整信息。目前市面上也有很多USB接口的無(wú)線網(wǎng)卡,也可以無(wú)線局域網(wǎng)的形式將導(dǎo)醫(yī)終端連接到局域網(wǎng)。如果采用USB無(wú)線網(wǎng)卡的方式,則需要通過(guò)USB Hub來(lái)擴(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廠商提供的軟件包外,很多其他要用到的庫(kù)都需要自己修改或移植[3-4]。
2.1 數(shù)據(jù)庫(kù)訪問(wèn)
應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的方式如圖3所示。在ARM硬件平臺(tái)、Linux操作系統(tǒng)下也不例外。
本文介紹的導(dǎo)醫(yī)系統(tǒng)的數(shù)據(jù)庫(kù)是用Microsoft SQL Server建立的。SQL Server(及SyBase)使用TDS(Tabular_
Data_Stream)作為其數(shù)據(jù)庫(kù)現(xiàn)客戶(hù)端傳輸?shù)膮f(xié)議,它對(duì)應(yīng)于圖中的ODBC驅(qū)動(dòng)。Linux下有此協(xié)議的免費(fèi)版——freetds,將其移植到ARMLinux平臺(tái)作為訪問(wèn)SQL Server的ODBC驅(qū)動(dòng)。ODBC可以移植unixODBC和QT自帶的ODBC庫(kù)。
2.2 ODBC庫(kù)及其驅(qū)動(dòng)移植
系統(tǒng)中帶有相應(yīng)的ODBC驅(qū)動(dòng)和ODBC庫(kù)文件,是以O(shè)DBC方式在嵌入式系統(tǒng)中訪問(wèn)SQL數(shù)據(jù)庫(kù)的必需條件。這些庫(kù)和驅(qū)動(dòng)可以通過(guò)下載相應(yīng)軟件包,經(jīng)過(guò)交叉編譯并拷貝到ARM-Linux平臺(tái)相應(yīng)目錄來(lái)實(shí)現(xiàn)移植。而在交叉編譯之前必須對(duì)其進(jìn)行重新配置,否則無(wú)法生成合適的庫(kù)或驅(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目錄下的庫(kù)lib文件夾拷貝到x86體系unixODBC目錄下,替換x86下的庫(kù),然后make & make install。
2.2.4 QT ODBC庫(kù)的移植
如果需要在QT下直接通過(guò)ODBC方式訪問(wèn)SQL Server,則開(kāi)發(fā)板中還必需含有QODBC,這需要在交叉編譯QT4的庫(kù)時(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*文件拷貝到開(kāi)發(fā)板下,替換原來(lái)的文件。如果配置時(shí)添加的是 -plugin-sql-odbc 選項(xiàng),需要將plgins/Sqldrivers/目錄下的所有文件拷貝到開(kāi)發(fā)板相同目錄下。
2.3 SQL Server數(shù)據(jù)庫(kù)構(gòu)建[5]
導(dǎo)醫(yī)系統(tǒng)終端接收到病人ID號(hào)后將檢索數(shù)據(jù)庫(kù)。這個(gè)數(shù)據(jù)庫(kù)的構(gòu)建直接關(guān)系到給出的導(dǎo)醫(yī)信息是否正確。試驗(yàn)階段采用如圖4的數(shù)據(jù)庫(kù)結(jié)構(gòu)。該數(shù)據(jù)庫(kù)一共由5個(gè)表組成:(1)Patient表。記錄病人姓名,將要前往就診的科室等信息;(2)Department表。記錄醫(yī)院科室名稱(chēng)及所在物理位置等信息;(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ù)庫(kù)在試驗(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ù)庫(kù)服務(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++的圖形用戶(hù)界面庫(kù)。它的跨平臺(tái)特性比較好,編輯好的程序代碼幾乎不需做修改就可以編譯出運(yùn)行于其他平臺(tái)的可執(zhí)行程序。應(yīng)用程序的核心是檢測(cè)串口接收緩沖區(qū),當(dāng)串口接收緩沖區(qū)存在有效的病人ID號(hào),即依據(jù)該ID號(hào)發(fā)起一次數(shù)據(jù)庫(kù)連接與檢索。不同于普通PC環(huán)境,在ARMLinux平臺(tái)下,需要解決三個(gè)核心問(wèn)題:ARM-Linux下串口通信、漢字字符集兼容和SQL Server數(shù)據(jù)庫(kù)連接等。
3.1 ARM-Linux下串口通信
QT下沒(méi)有提供串口通信的控件,但是提供了第三方的串口通信類(lèi)qextserialport。本系統(tǒng)即是采用該類(lèi)完成了ARM-Linux下的串口通信。該類(lèi)繼承自QIODevice類(lèi),可分為Win_QextSerialPort和Posix_QextSerialPort,分別支持Windows和Linux兩種環(huán)境下的編譯。在Linux下需要添加 #define _TTY_POSIX_宏定義,以確保選擇正確的條件編譯。通過(guò)以下代碼即可打開(kāi)串口ttySAC3,并設(shè)置波特率為9 600 Kb/s,無(wú)流控制和奇偶校驗(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è)問(wèn)題可從以下兩個(gè)方面來(lái)解決:
(1)移植freetds和unixODBC時(shí),要將配置選項(xiàng)iconv設(shè)置為disable。具體來(lái)說(shuō),unixODBC的配置選項(xiàng)中一定要有--disable-iconv,freetds的配置選項(xiàng)中一定要有--disable-libiconv。這樣做可以避免ODBC和ODBC驅(qū)動(dòng)進(jìn)行字符集的自動(dòng)轉(zhuǎn)換,從而避免出現(xiàn)無(wú)法預(yù)見(jiàn)的字符集不兼容問(wèn)題。
(2)QT為世界上多數(shù)語(yǔ)系提供廣泛支持。在編寫(xiě)QT程序時(shí)一定要在主程序中添加相關(guān)代碼,定義好程序的字符編碼類(lèi)型。如果希望應(yīng)用程序用UTF8編碼,可以添加如下代碼:
QTextCodec::setCodecForLocale(QTextCodec::codecForName
("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName
("UTF8"));
QTextCodec::setCodecForTr (QTextCodec::codecForName
("UTF8"));
3.3 數(shù)據(jù)庫(kù)的連接與檢索
為了實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,需對(duì)freetds和unixODBC進(jìn)行必要的配置。這可以通過(guò)修改freetds.conf文件、odbc.ini和odbcinst.ini文件來(lái)實(shí)現(xiàn),這些文件分別在各自的安裝目錄下。有了unixODBC和freetds的支持,通過(guò)QT的ODBC庫(kù)QODBC就可以訪問(wèn)Windows XP下的SQL Server數(shù)據(jù)庫(kù)了。
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ù)庫(kù)的連接,數(shù)據(jù)庫(kù)的檢索就相對(duì)簡(jiǎn)單了。QSqlQuery提供了一套檢索數(shù)據(jù)庫(kù)的簡(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ù)庫(kù)檢索,檢索得到病人就醫(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)程控制閱讀器的開(kāi)啟和關(guān)閉、增益設(shè)置等。實(shí)現(xiàn)方式是在導(dǎo)醫(yī)終端的后臺(tái)運(yùn)行一個(gè)服務(wù)程序。該程序一直監(jiān)聽(tīng)一個(gè)socket端口,當(dāng)收到有效的RFID控制指令時(shí),將該控制指令寫(xiě)入到UART發(fā)送緩沖區(qū)。RFID閱讀器上的程序收到命令后將執(zhí)行相關(guān)操作。
該智能導(dǎo)醫(yī)系統(tǒng)整合了有源RFID技術(shù)、嵌入式系統(tǒng)和數(shù)據(jù)庫(kù)等軟硬件技術(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ù)庫(kù)建設(shè)。