戴晶華
(內(nèi)蒙古自治區(qū)法治培訓(xùn)中心,內(nèi)蒙古呼和浩特,010070)
長時間占用圖書館的座位,導(dǎo)致圖書館座位的使用效率降低,影響其他讀者對公共資源的使用。雖然圖書館的管理員也在進(jìn)行管理,但工作量很大,也存在監(jiān)管不到位的情況。因此,開發(fā)一種可對圖書館座位進(jìn)行遠(yuǎn)程實時管理的智能管理系統(tǒng),以提高圖書館座位的利用效率。將基于窄帶物聯(lián)網(wǎng)這一具有覆蓋廣、連接多、成本低、功耗低等特點的新興技術(shù)應(yīng)用到圖書館座位智能管理系統(tǒng)中,具有極大的開發(fā)前景和極強的現(xiàn)實意義,可明顯提高圖書館座位的使用效率。
本系統(tǒng)結(jié)構(gòu)如圖1所示,由以下三個部分構(gòu)成:座位信息采集終端、云平臺端及應(yīng)用服務(wù)器端。座位信息采集端負(fù)責(zé)實時檢測圖書館內(nèi)各座位的使用情況,當(dāng)檢測到其狀態(tài)發(fā)生變化時,通過窄帶物聯(lián)網(wǎng)模塊將數(shù)據(jù)發(fā)送至云平臺端。云平臺端負(fù)責(zé)接收座位信息采集端上傳的數(shù)據(jù),將其解碼后轉(zhuǎn)發(fā)給后臺應(yīng)用服務(wù)器端。應(yīng)用服務(wù)器端負(fù)責(zé)處理云平臺及用戶的請求,將云平臺發(fā)送來的數(shù)據(jù)解析后存入數(shù)據(jù)庫,當(dāng)用戶訪問時,從數(shù)據(jù)庫中取出數(shù)據(jù),并將前端界面返回給用戶。
圖1 系統(tǒng)結(jié)構(gòu)框圖
1.2.1 座位信息采集端
座位信息采集端由多組座位信息采集終端構(gòu)成。各終端主要由以下三部分構(gòu)成:熱釋電紅外傳感器、Arduino微控制器、窄帶物聯(lián)網(wǎng)模塊。
采用HC-SR501熱釋電紅外傳感器模塊安裝于桌下,每個座位所對應(yīng)的位置上方。向下檢測用戶腿部的移動信號,當(dāng)用戶腿部發(fā)生移動時紅外輻射溫度發(fā)生變化,傳感器內(nèi)失去電荷平衡,向外釋放電荷。通過該模塊可將用戶的移動信號轉(zhuǎn)換為數(shù)字電信號,供后續(xù)電路處理。
采用Arduino Nano微控制器作為座位信息采集端的核心,處理分析熱釋電紅外傳感器的信號并通過窄帶物聯(lián)網(wǎng)模塊發(fā)送數(shù)據(jù)。Arduino Nano是Arduino USB接口的微型版本,具有14路數(shù)字輸入/輸出口、一路串口,且其尺寸較小,在滿足本系統(tǒng)設(shè)計的同時可最大程度上縮小座位信息采集終端,使其便于放置。
采用以具有高性能、低功耗等特點的移遠(yuǎn)BC95-B5無線通信芯片為核心的NB101窄帶物聯(lián)網(wǎng)模塊來發(fā)送數(shù)據(jù),其體積較小,在滿足終端需求的同時,最大限度的減少了座位信息采集終端的體積。
綜上所述,在各圖書館內(nèi),各桌下放置座位信息采集終端來采集各圖書館內(nèi)各座位的使用情況,以構(gòu)成座位信息采集端,完成采集圖書館內(nèi)座位信息的要求。
1.2.2 云平臺端
由于采用的窄帶物聯(lián)網(wǎng)模塊的核心為BC95電信版本,遂采用中國電信物聯(lián)網(wǎng)平臺,作為云平臺對數(shù)據(jù)進(jìn)行解碼等處理。該云平臺可在線設(shè)置解碼器及配置文件對數(shù)據(jù)進(jìn)行預(yù)處理,以便后續(xù)數(shù)據(jù)轉(zhuǎn)發(fā)及后端服務(wù)器處理。
1.2.3 應(yīng)用服務(wù)器端
應(yīng)用服務(wù)器端使用阿里云的云服務(wù)器ECS。方便部署操作系統(tǒng),不需進(jìn)行內(nèi)網(wǎng)穿透等煩瑣操作,且免費提供 DDoS 防護、木馬查殺、防暴力破解等服務(wù)。
1.3.1 座位信息采集端
使用Visual Studio Code及Arduino插件部署Arduino開發(fā)環(huán)境,使用C/C++編寫庫及主程序。通過AT指令控制窄帶物聯(lián)網(wǎng)模塊發(fā)送數(shù)據(jù)。
1.3.2 云平臺端
使用中國電信物聯(lián)網(wǎng)平臺提供的在線開發(fā)環(huán)境,設(shè)置部署解碼器及配置文件。
1.3.3 應(yīng)用服務(wù)器端
(1)后端
在阿里云服務(wù)器上部署Ubuntu 16.04操作系統(tǒng),搭建Python 3.6運行環(huán)境,使用Nginx和uWSGI進(jìn)行Django的生產(chǎn)環(huán)境部署。使用Mysql數(shù)據(jù)庫存儲圖書館內(nèi)座位信息。
當(dāng)客戶端(用戶瀏覽器、云平臺)發(fā)起http/https請求時,首先到達(dá)Nginx,Nginx收到請求后進(jìn)行解析處理(如果是靜態(tài)請求,直接返回靜態(tài)頁面),然后將請求發(fā)送給uWSGI,uWSGI對Nginx的請求進(jìn)行處理,將處理后的結(jié)果發(fā)送給Django應(yīng)用,Django應(yīng)用收到請求之后,對請求進(jìn)行處理,從Mysql中讀取或存儲數(shù)據(jù),將結(jié)果返回給uWSGI,uWSGI收到Django應(yīng)用的處理結(jié)果后,對該結(jié)果進(jìn)行處理打包,發(fā)送給Nginx,Nginx將收到的結(jié)果返回給客戶端(用戶瀏覽器)。
(2)前端
使用HTML+CSS+JavaScript編寫前端界面,并安裝Bootstrap前端開發(fā)框架和jQuery函數(shù)庫。使用HTML設(shè)置網(wǎng)頁的內(nèi)容,使用CSS設(shè)置樣式,使用JavaScript控制網(wǎng)頁的行為。
本系統(tǒng)硬件設(shè)計主要為座位信息采集終端的設(shè)計。各熱釋電紅外傳感器信號線依次連接Arduino的D2到D9引腳,Arduino的D10引腳連接LED;D11和D12在程序中設(shè)置為軟串口用來輸出調(diào)試信息,方便調(diào)試,不使用時可懸空;串口通過短路帽連接窄帶物聯(lián)網(wǎng)模塊,當(dāng)燒寫程序時,需斷開短路帽,防止出錯。
圖2 硬件連線圖
2.2.1 座位信息采集端
程序流程如圖3所示,安裝終端前需在各終端的Arduino程序上設(shè)置該終端所在圖書館編號,樓層,桌子編號。上電后首先點亮LED指示燈,初始化串口,設(shè)置波特率為9600,設(shè)置D11和D12為軟串口作為調(diào)試串口,設(shè)置波特率為9600。然后初始化窄帶物聯(lián)網(wǎng)模塊,依次向串口發(fā)送AT指令,并向調(diào)試串口輸出日志,指令依次為AT,確保AT指令正常;AT+CFUN=1,開啟射頻;AT+NCDP=180.101.147.115,5683(第一個參數(shù)為中國電信物聯(lián)網(wǎng)平臺窄帶物聯(lián)網(wǎng)接入IP地址,第二個參數(shù)為非加密端口),配置電信平臺的CDP服務(wù)器地址;AT+CGATT=1,激活網(wǎng)絡(luò);AT+NNMI=1,配置核心板將接收到的數(shù)據(jù)直接輸出到串口。最后初始化各座位對象(設(shè)置D2到D9引腳的類型為輸入)。關(guān)閉LED指示燈。
圖3 座位信息采集端程序流程圖
為避免用戶暫時離開座位或較長時間未移動產(chǎn)生誤報,使用以下算法:逐個檢測各座位對象當(dāng)前狀態(tài),獲取當(dāng)前該座位對象所對應(yīng)的座位的使用情況,與該座位對象上一次的狀態(tài)進(jìn)行對比,當(dāng)狀態(tài)發(fā)生變化時,分析其變化:若狀態(tài)從已使用變化為未占用則為該座位對象添加計數(shù)器標(biāo)志,當(dāng)下一次檢測該座位時,如果狀態(tài)未變化,則計數(shù)器加一,當(dāng)計數(shù)器值達(dá)到15分鐘時,確認(rèn)該座位未被占用,可以發(fā)送數(shù)據(jù),如果座位狀態(tài)變化回已使用,則清零計數(shù)器,清除計數(shù)器標(biāo)志,保持該座位為已使用狀態(tài);若狀態(tài)從未占用變化為已占用,且沒有計數(shù)器標(biāo)志則確認(rèn)該座位已被使用,可以發(fā)送數(shù)據(jù)。
2.2.2 云平臺端
云平臺端接入流程如圖4所示。
圖4 云平臺接入流程圖
首先通過“天翼物聯(lián)產(chǎn)業(yè)聯(lián)盟”微信公眾號或“天翼物聯(lián)產(chǎn)業(yè)聯(lián)盟”網(wǎng)站填寫開放平臺測試賬號申請,賬號申請通過后,收到賬號和初始密碼。登錄中國電信物聯(lián)網(wǎng)開發(fā)中心。
點擊創(chuàng)建項目,填寫“項目名稱”、“所屬行業(yè)”、“描述”等項目信息后,點擊“創(chuàng)建”。
點擊新建產(chǎn)品,選擇自定義產(chǎn)品,在設(shè)置產(chǎn)品信息中填入產(chǎn)品名稱、型號、廠商ID、所屬行業(yè)、設(shè)備類型、接入應(yīng)用層協(xié)議類型、數(shù)據(jù)格式等信息,點擊創(chuàng)建。產(chǎn)品是某一類具有相同能力或特征的設(shè)備的集合稱,除了設(shè)備實體,產(chǎn)品還包含該類設(shè)備在物聯(lián)網(wǎng)能力建設(shè)中產(chǎn)生的產(chǎn)品信息、產(chǎn)品模型(Profile)、插件、測試報告等資源。
然后創(chuàng)建產(chǎn)品模型(也稱Profile)用于描述設(shè)備具備的能力和特性。通過定義Profile,在云平臺構(gòu)建一款設(shè)備的抽象模型,使云平臺理解該款設(shè)備支持的服務(wù)、屬性、命令等信息。設(shè)置服務(wù)名稱為Seat,添加以下五個屬性用于承載上報的數(shù)據(jù)。
(1)樓層編號:floor,數(shù)據(jù)類型為int,范圍為1-10,必選且只讀。
(2)桌子編號:table,數(shù)據(jù)類型為int,范圍為1-50,必選且只讀。
(3)座位編號:seat,數(shù)據(jù)類型為int,范圍為1-8,必選且只讀。
(4)座位狀態(tài):status,數(shù)據(jù)類型為int,范圍為0-1,必選且只讀。
(5)圖書館編號:library,數(shù)據(jù)類型為int,范圍為1-10,必選且只讀。
由于座位信息采集端發(fā)送的數(shù)據(jù)在中國電信物聯(lián)網(wǎng)平臺做協(xié)議解析時,會轉(zhuǎn)換成統(tǒng)一的json格式,以方便Web服務(wù)器使用。最終與產(chǎn)品模型建立映射后按協(xié)議順序轉(zhuǎn)換成如下json格式數(shù)據(jù){"libra ry":1,"floor":2,"table":3,"seat":7,"status":0}。當(dāng)設(shè)置完產(chǎn)品模型及解碼插件后,可接入設(shè)備進(jìn)行測試。最后設(shè)置應(yīng)用訂閱,設(shè)置訂閱設(shè)備數(shù)據(jù)變化接口及訂閱地址。
2.2.3 應(yīng)用服務(wù)器端
Django為重量級Web框架,為使業(yè)務(wù)邏輯、數(shù)據(jù)、界面開發(fā)分離,解除耦合。使用MTV的框架模式,其中視圖Views響應(yīng)用戶http請求,進(jìn)行邏輯處理,模型Models描述服務(wù)器儲存的數(shù)據(jù)(數(shù)據(jù)庫的表),模板templates用來生產(chǎn)HTML頁面(返回給用戶的HTML頁面是由模型和模板渲染出來的)。
2.2.4 數(shù)據(jù)庫端
通過models在數(shù)據(jù)庫PW中創(chuàng)建三個數(shù)據(jù)表:
在sm_library中 設(shè) 置id( 主 鍵)、name及introduce字段,用于存儲圖書館名稱及簡介。
在sm_seat中設(shè)置id(主鍵)、library、serialID 、floor_num、equipID、status字段,用于存儲圖書館編號,座位號,樓層,桌子編號,座位狀態(tài)。其中設(shè)置library外鍵約束為sm_library的主鍵,使其保持?jǐn)?shù)據(jù)一致性,禁止出現(xiàn)sm_library存儲以外的信息。
在sm_order中設(shè)置id(主鍵)、seat、user、start_time、end_time字段,用于儲存座位,用戶,預(yù)訂開始時間,預(yù)訂結(jié)束時間。其中設(shè)置seat外鍵約束為sm_seat的主鍵,防止對未知的座位進(jìn)行操作,擾亂程序操作。
座位采集終端的實物連接如圖5所示。在Visual Studio Code中連接Arduino的硬件串口,出口的輸出結(jié)果如圖6所示。當(dāng)完成初始化后,連接在D2端口上的熱釋電紅外傳感器檢測到移動,通過AT指令發(fā)送數(shù)據(jù)。一號圖書館的一樓一號桌一號座位狀態(tài)為已占用。
圖5 座位采集終端實物連接圖
圖6 串口輸出數(shù)據(jù)
將數(shù)據(jù)中的status改為1后,由postman模擬發(fā)送數(shù)據(jù),整體用戶測試界面如圖7所示,可見對應(yīng)座位樣式發(fā)生變化。
本設(shè)計針對圖書館座位利用效率較低這一問題展開研究,采用熱釋電傳感器采集座位使用信息,Arduino微控制器處理數(shù)據(jù),窄帶物聯(lián)網(wǎng)模塊傳輸數(shù)據(jù),中國電信物聯(lián)網(wǎng)平臺解碼轉(zhuǎn)發(fā)數(shù)據(jù),阿里云云服務(wù)器搭建應(yīng)用服務(wù)器接收數(shù)據(jù),B/S模式展示數(shù)據(jù)的方式完成以下功能:
(1)非接觸式,實時主動采集座位使用信息;
(2)人性化判斷座位的使用情況,排除了一些干擾;
(3)低功耗數(shù)據(jù)傳輸,節(jié)約系統(tǒng)維護成本;
(4)各端數(shù)據(jù)可視,方便數(shù)據(jù)追蹤;
(5)圖書館管理員遠(yuǎn)程管理,用戶遠(yuǎn)程查看,預(yù)訂座位;
(6)圖書館內(nèi)座位使用情況圖形化展示,使數(shù)據(jù)展示更加直觀。