王國偉,陸華麗,張苗苗,薛瑞晨,郝媛媛,趙 華
(南京師范大學 計算機與電子信息學院,江蘇 南京 210000)
隨著醫(yī)療和信息技術(shù)的快速發(fā)展,人們生活質(zhì)量不斷提高,人類的平均壽命在不斷增加,但同時“老齡化社會”“慢性疾病”等問題日益突出[1]。成年人由于工作忙碌常忘記服藥,老年人也因為健忘而常常忘記服藥,錯誤服藥已經(jīng)成為整個社會密切關(guān)注的問題[2]。為了解決用戶錯誤服藥等一系列的問題,設(shè)計一款集智能化與人性化的智能藥柜系統(tǒng)已經(jīng)迫在眉睫。
目前,智能藥柜系統(tǒng)應(yīng)用廣度雖遠不及其他的智能家居產(chǎn)品,但也已經(jīng)有了一些成果[3]。美國Mobile Aspects公司采用了RFID設(shè)計了一款智能型的藥柜,可以將存儲量和使用情況記錄下來,而且可以識別藥品的使用期限,提醒過期藥品需要清除[4]。國內(nèi)市場也有相關(guān)的產(chǎn)品出現(xiàn),例如,天津德致倫電子科技有限公司基于STM32設(shè)計與實現(xiàn)了一款新型智能藥箱,該產(chǎn)品可以提醒老年人群體按時用藥,安全用藥[5]。同時國內(nèi)市場上也出現(xiàn)了很多適合在智能手機上使用的軟件,如“醫(yī)生樹”“醫(yī)指通”等[6]。但以上涉及的產(chǎn)品存在系統(tǒng)復(fù)雜,實施困難,成本較高,功能相對單一等一系列問題,并不能保證正確的人在正確的時間服用正確的藥物。
為了解決以上問題,本文結(jié)合多種產(chǎn)品的優(yōu)點,從用戶實際使用時易出現(xiàn)的問題的角度出發(fā),設(shè)計一款基于樹莓派(Raspberry PI)的智能藥柜系統(tǒng)。在設(shè)計的智能藥柜系統(tǒng)中,采用指紋模塊以識別服藥對象、采用掃碼模塊掃入條碼編號、利用網(wǎng)絡(luò)爬蟲技術(shù)提取并存儲藥品信息、搭建數(shù)據(jù)庫用于信息管理。通過以上設(shè)計結(jié)合開發(fā)的交互界面,保證了用戶在正確的時間服用正確的藥物。為了進一步提高系統(tǒng)的可用性,在Android Studio開發(fā)平臺設(shè)計了一款基于智能保健系統(tǒng)的掌上管理應(yīng)用程序(APP),APP可以遠程查看和設(shè)置服務(wù)器的藥品信息和用戶信息。實驗表明,本文提出的系統(tǒng)實施成本較低、功能齊全,從用戶使用需求出發(fā),解決了現(xiàn)有產(chǎn)品無法識別身份、無法管理信息的問題。
本文設(shè)計的智能藥柜由樹莓派主控板、條形碼掃入模塊、指紋識別模塊、鬧鐘提醒模塊、電磁鎖模塊和智能Android手機組成,系統(tǒng)總體架構(gòu)如圖1所示。用戶通過樹莓派顯示器進行人機交互,移動終端通過無線網(wǎng)絡(luò)獲得本地服務(wù)器數(shù)據(jù)庫數(shù)據(jù)。
圖1 系統(tǒng)總體架構(gòu)
選用的樹莓派主控板是一款基于ARM的微型電腦主板,有40個引腳,包括4個USB接口,以及1個HDMI視頻線接口[7]。圖1中,電磁鎖模塊采用GPIO高低電平控制的方式;指紋模塊采用串口通信,RXD與TXD交叉連接;掃碼模塊和鬧鐘模塊采用USB的方式與主控板通信。
智能藥柜功能模塊的驅(qū)動和上層通信均采用Python語言設(shè)計,功能代碼在PyCharm平臺上完成。指紋電路用于錄入用戶指紋,通過指紋特征值比對確認身份進入用戶界面,顯示用戶信息。隨后可以通過存取藥品模塊,掃入藥品條碼檢索提取藥品信息并存儲、顯示當前用戶該服用的藥物并取出、同時可以取出其他藥品;可在服藥設(shè)置模塊選擇藥物后顯示藥品具體信息,并根據(jù)用法用量設(shè)置服藥鬧鐘時間;可在信息查詢模塊查詢服藥記錄、查詢藥品庫存、查詢存取藥日志;可在參數(shù)設(shè)置模塊設(shè)置用戶信息和系統(tǒng)設(shè)置。程序流程如圖2所示。
圖2 程序流程
指紋模塊和主控的通信采用主從模式,主設(shè)備發(fā)送的命令以及從設(shè)備模塊的應(yīng)答根據(jù)數(shù)據(jù)長度分為等于8 B和大于8 B兩類,大于8 B的數(shù)據(jù)格式為“數(shù)據(jù)頭+數(shù)據(jù)包”,數(shù)據(jù)頭的格式見表1所列。其中:CMD為命令/應(yīng)答類型;P1,P2,P3為命令參數(shù);Q1,Q2,Q3為應(yīng)答參數(shù),Q3用于返回操作的有效性信息,0x00為操作成功,0x01為操作失敗,0x04為數(shù)據(jù)庫已滿,0x06表示用戶已存在。
表1 數(shù)據(jù)頭格式
為了確保指紋數(shù)據(jù)庫指紋的唯一性,1枚指紋只能添加1個用戶,需要將模塊設(shè)置為“禁止重復(fù)模式”,此時CMD設(shè)置為0x2D,P1設(shè)置為0,P2設(shè)置為Byte5=1:0。在采集圖像時,命令數(shù)據(jù)長度為8 B,CMD=0x24,P1,P2,P3為0,應(yīng)答數(shù)據(jù)包中指紋圖像200×264像素,每個像素灰度用8位表示,指紋圖像如圖3所示,模塊成功上傳指紋圖像后提取指紋的特征值,按指定用戶號存入DSP模塊數(shù)據(jù)庫中。
圖3 指紋圖像
下傳指紋特征值與DSP模塊數(shù)據(jù)庫比對為1∶N時,CMD=0x43,命令格式為“數(shù)據(jù)頭+數(shù)據(jù)包”,數(shù)據(jù)包中存入當前用戶的指紋特征值。
服務(wù)器的數(shù)據(jù)庫使用目前最流行的關(guān)系型和關(guān)聯(lián)性數(shù)據(jù)庫管理系統(tǒng)MySQL[8]。關(guān)聯(lián)性數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有的數(shù)據(jù)放在一個大倉庫,這樣就提高了速度和靈活性。MySQL使用的操作語言是SQL,操作數(shù)據(jù)非常便捷。
設(shè)計的智能藥柜系統(tǒng)的數(shù)據(jù)庫需要存儲用戶信息、藥品庫存信息、服藥記錄信息、存藥取藥日志信息、藥品信息。
建立的表與對應(yīng)的含義見表2所列。
表2 數(shù)據(jù)庫表
掃碼存藥功能采用掃碼模塊識別藥盒上的條碼,系統(tǒng)將條碼編號輸入到“1藥網(wǎng)”藥品網(wǎng)站檢索此藥品,進一步地,系統(tǒng)爬蟲模塊爬取藥品的名稱、功能主治、用法用量、用藥禁忌、不良反應(yīng)并保存到數(shù)據(jù)庫藥品信息表中,系統(tǒng)流程如圖4所示。掃碼模塊錄入藥盒條碼編號并檢索信息過程如圖5所示。
圖4 系統(tǒng)流程圖
圖5 掃碼檢索藥品過程
傳統(tǒng)的爬蟲通過直接模擬HTTP請求來爬取站點信息,由于這種方式和瀏覽器訪問差異比較明顯,很多站點都采取了反爬手段,無法有效地爬取需要的信息。為了避免站點的反爬導致藥品信息爬取失敗,本文采用Selenium爬蟲框架對藥品進行主要信息檢索、分類、存儲。Selenium是一個用于對Web網(wǎng)頁進行自動化測試的工具,可以通過它提供的方法自動操作瀏覽器,完全模擬人的操作行為,瀏覽器選擇Google Chrome 87.0.4280.88,同時安裝對應(yīng)版本的驅(qū)動WebDriver。Selenium通過WebDriver協(xié)議控制瀏覽器來完成一系列的任務(wù)。首先,通過Selenium的API得到“1藥網(wǎng)”輸入框?qū)ο?;接下來在輸入框輸入條碼編號進入此藥品對應(yīng)的頁面,此時就拿到了該藥品網(wǎng)頁的HTML源碼;下一步利用Xpath方法提取系統(tǒng)需要的“藥品名稱”“功能主治”“用法用量”“用藥禁忌”“不良反應(yīng)”。爬取過程如圖6所示。在數(shù)據(jù)庫藥品信息表中創(chuàng)建字段,將上述5類藥品信息保存至數(shù)據(jù)庫中。創(chuàng)建的字段與對應(yīng)的含義見表3所列。
圖6 爬取過程
表3 MySQL藥物信息字段
智能藥柜系統(tǒng)用戶界面設(shè)計采用PyQt5工具包。PyQt是由 Phil Thompson開發(fā)的一個創(chuàng)建GUI應(yīng)用程序的工具包,其是Python編程語言和Qt庫的成功融合[9-10]。在本系統(tǒng)上位機的設(shè)計中,使用QtDeSinger設(shè)計用戶GUI,將生成的UI文件通過PYUIC5工具轉(zhuǎn)換成PY文件,下一步在PyCharm平臺編寫功能代碼,使用到的組件包括QWidget、QLabel、QPushButton、QTextEdit、QMessageBox、QTextBrowse。智能藥柜登錄頁面如圖7所示。
圖7 智能藥柜登錄頁面
應(yīng)用程序(APP)的設(shè)計使用Java語言,在Android Studio平臺上完成[11]。手機APP模塊包括存取藥日志、健康信息、服藥記錄、藥品庫存信息和用戶信息5個子模塊,如圖8所示。其中:存取藥日志模塊用于查看存藥和取藥記錄;健康信息模塊用于查看用藥禁忌;服藥記錄模塊用于查看用戶歷史服藥記錄;藥品庫存信息模塊用于查看藥品信息及藥品的剩余量;用戶信息模塊用于查看用戶的個人信息。
圖8 手機APP功能設(shè)計框圖
數(shù)據(jù)庫操作使用JDBC(Java Database Connectivity)。JDBC是實現(xiàn)Java應(yīng)用程序與各類不一樣數(shù)據(jù)庫會話的一種體制,主要作用是實現(xiàn)了對數(shù)據(jù)庫的訪問和操作。JDBC能實現(xiàn)的主要功能包括:請求連接數(shù)據(jù)庫、向數(shù)據(jù)庫發(fā)送 SQL請求、查詢結(jié)果等功能[12]。其實現(xiàn)步驟為:加載JDBC驅(qū)動程序;提供JDBC連接的URL;創(chuàng)建數(shù)據(jù)庫的鏈接和執(zhí)行SQL語句操作[13]。加載驅(qū)動就是在使用數(shù)據(jù)庫之前需要導入MySQL和JDBC的驅(qū)動包到Android的Java build path[14],使用JDBC驅(qū)動程序鏈接MySQL數(shù)據(jù)庫,連接成功之后就可以使用SQL語句對數(shù)據(jù)庫進行操作,在MySQL數(shù)據(jù)庫中建立數(shù)據(jù)表。
本文通過硬件及軟件的設(shè)計,實現(xiàn)了如圖9所示的智能藥柜。為了驗證系統(tǒng)的可行性和系統(tǒng)工作流程,將可觸摸顯示器安裝到藥柜上,將主控板及周邊功能模塊部署到藥柜對應(yīng)位置。首先給主控板供電,設(shè)置目標IP地址為192.168.1.101,固定端口號。經(jīng)過測試,Android手機APP與數(shù)據(jù)庫可以做到實時通信,各功能模塊均可正常工作。系統(tǒng)各模塊如10所示。
圖9 實物圖
圖10 模塊實物圖
登入系統(tǒng)后進入主頁面,主頁面功能包括:
(1)顯示當前用戶信息;
(2)存取藥品模塊,包括當前用戶此時需要服用的藥物、選擇其他藥物以及掃入藥品條形碼檢索藥品信息并存儲;
(3)服藥設(shè)置模塊,選擇該用戶關(guān)聯(lián)下的藥品,并調(diào)取數(shù)據(jù)庫關(guān)于該藥品的基本信息,根據(jù)用法用量設(shè)置服藥鬧鐘并在右側(cè)顯示該藥品的圖片;
(4)參數(shù)設(shè)置模塊,包括用戶信息設(shè)置以及系統(tǒng)設(shè)置;
(5)信息查詢模塊,包括歷史服藥記錄查詢、藥品庫存查詢以及存取藥品記錄查詢。
系統(tǒng)主頁面如圖11所示。
圖11 智能藥柜系統(tǒng)
點擊“歷史服藥記錄查詢”按鈕,系統(tǒng)則調(diào)取該用戶數(shù)據(jù)庫所有的歷史服藥記錄并顯示在主欄目中,如圖12所示。
圖12 用戶歷史服藥記錄
點擊“掃碼存藥”按鈕,使用掃碼模塊掃入藥盒上的條碼編號,檢索、分類并保存到數(shù)據(jù)庫中。使用Navicat數(shù)據(jù)庫可視化管理工具連接到樹莓派MySQL數(shù)據(jù)庫,輸入MySQL用戶名、密碼登錄成功,在藥品信息表中查看藥品信息添加情況。圖13是Navicat中查看掃碼爬取“1藥網(wǎng)”藥品的關(guān)鍵信息。
圖13 掃碼存藥測試
智能終端登錄測試如圖14所示,終端功能包括查看“存取藥日志”“健康信息”“服藥記錄”“藥品庫存信息”以及“用戶信息”。
圖14 手機終端測試
本文針對已有的智能藥柜在實際使用中出現(xiàn)的問題,基于樹莓派主控設(shè)計了一種智能藥柜。設(shè)計的智能藥柜可解決現(xiàn)實生活中服藥的用戶身份識別和藥品信息管理,及用戶經(jīng)常忘、漏服藥等問題。測試結(jié)果表明,該系統(tǒng)軟硬件工作正常,APP能正常操作數(shù)據(jù)庫內(nèi)容,上位機能夠正常使用,能滿足用戶實際的需求。