林志舟, 任 凱, 葉傲斌
1(南京大學(xué)金陵學(xué)院 信息科學(xué)與工程學(xué)院, 南京 210089)
2(華東師范大學(xué) 計算機科學(xué)與軟件工程學(xué)院, 上海 200062)
隨著我國經(jīng)濟的迅速發(fā)展, 人們的養(yǎng)寵意愿增強,寵物經(jīng)濟成為城市經(jīng)濟重要的組成部分[1,2].根據(jù)《2010-2015 年中國寵物市場調(diào)研及行業(yè)發(fā)展分析研究報告》[3],全國寵物數(shù)量已超過1 億只, 由寵物經(jīng)濟興盛帶來的龐大寵物基數(shù), 使得寵物丟失時有發(fā)生.在此背景下,設(shè)計一款以寵物追蹤為基礎(chǔ)功能的應(yīng)用系統(tǒng)尤為重要.一方面, 系統(tǒng)的使用可在一定程度上解決由于寵物丟失帶來的社會問題; 另一方面, 系統(tǒng)在經(jīng)濟方面的投資回報相對可觀, 可促進(jìn)該類產(chǎn)品的進(jìn)一步研發(fā).
依托嵌入式設(shè)備和Android 平臺, 本文構(gòu)建了基于消息隊列遙測傳輸(Message Queuing Telemetry Transport, MQTT)協(xié)議的智能寵物追蹤系統(tǒng).該系統(tǒng)具有規(guī)劃尋寵路徑、語音導(dǎo)航、預(yù)估尋找時間、路況預(yù)測等多種功能.系統(tǒng)采用的MQTT 傳輸協(xié)議具有簡潔、小巧、可擴展性強、省流量、低功耗等特點, 可確保MQTT 客戶端的持久耐用[4].
系統(tǒng)整體架構(gòu)按照物聯(lián)網(wǎng)3 層模型可分為: 應(yīng)用層、網(wǎng)絡(luò)層、感知層, 如圖1 所示.
圖1 系統(tǒng)整體架構(gòu)圖
應(yīng)用層包括Web 服務(wù)器、Android 客戶端應(yīng)用程序(以下簡稱Android 端)和導(dǎo)航服務(wù)器3 部分.Web服務(wù)包含應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器兩部分.應(yīng)用服務(wù)器主要負(fù)責(zé)處理Android 端發(fā)送來的各種請求, 并對每個請求給出響應(yīng).數(shù)據(jù)庫服務(wù)器負(fù)責(zé)用戶數(shù)據(jù)的存儲, 它與應(yīng)用服務(wù)器部署在同一個硬件設(shè)備中,Android 端根據(jù)嵌入式設(shè)備的所在位置為用戶提供導(dǎo)航功能, 利用該特點實現(xiàn)寵物追蹤.導(dǎo)航服務(wù)器由高德地圖提供, 在具體實現(xiàn)時, 只需調(diào)用高德地圖為Android 端提供的服務(wù)接口, 不關(guān)心其內(nèi)部實現(xiàn).
網(wǎng)絡(luò)層主要依靠MQTT 協(xié)議進(jìn)行消息的發(fā)布和訂閱.MQTT 服務(wù)器由蘇州煜瑛微電子科技有限公司提供, 該服務(wù)器主要負(fù)責(zé)寵物信息的發(fā)布與訂閱, 將寵物位置信息發(fā)送至Android 端.MQTT 服務(wù)器與Web服務(wù)器安裝在不同的硬件設(shè)備中.即使Web 服務(wù)器暫時不可用, 只要用戶在Android 端沒有退出登陸,Android 端的導(dǎo)航功能仍舊能夠正常使用.
感知層主要由嵌入式設(shè)備實現(xiàn), 為了實現(xiàn)寵物追蹤功能, 寵物必須攜帶并完成設(shè)備綁定才能完成定位和追蹤功能.
實現(xiàn)寵物追蹤需對寵物設(shè)備和Android 端應(yīng)用程序進(jìn)行綁定.綁定關(guān)系為一對多, 即每只寵物只屬于1 個用戶, 1 個用戶可擁有多只寵物.通過用戶的手機號碼來標(biāo)識用戶, 通過設(shè)備的SN 號(設(shè)備序列號)來標(biāo)識寵物.設(shè)備被封裝成項圈佩戴在寵物頸部, 可隨時通過本應(yīng)用程序獲取設(shè)備的位置信息, 即寵物的位置信息.
綁定設(shè)備只需要用戶通過掃描SN 號即可完成.主要過程分為兩步: 首先, 依靠Android 平臺提供的Bitmap 接口, 將SN 號編碼為JSON 格式字符串, 再將字符串轉(zhuǎn)為黑白點陣, 最后轉(zhuǎn)化為二維碼圖片, 如圖2所示.其次, 在識別二維碼時, 通過攝像頭捕獲, 然后判斷編碼類型, 再根據(jù)已有信息進(jìn)行解碼, 即可從開始的二維碼中獲取SN 號[5,6], 如圖3 所示.設(shè)備綁定完成后通過Android 端應(yīng)用程序即可進(jìn)行定位、導(dǎo)航等操作.
圖2 設(shè)備SN 號轉(zhuǎn)為二維碼
圖3 二維碼轉(zhuǎn)換設(shè)備SN 號
寵物綁定之后, 進(jìn)行寵物追蹤還需要寵物的位置信息與Android 端的位置信息.寵物的位置信息通過MQTT 服務(wù)端獲取, 由于與MQTT 服務(wù)器建立的是長連接, 在用戶訂閱消息后, 可獲取MQTT 服務(wù)器發(fā)布的寵物位置信息.用戶位置信息的獲取需要依靠Android 平臺查找手機所有可用的位置提供器.在找到位置提供器后動態(tài)請求權(quán)限, 經(jīng)用戶同意后獲取.在獲取雙方位置信息后, 調(diào)用高德地圖的API 即可開始導(dǎo)航.在低版本的SDK 中, 要實現(xiàn)語音播報需要語音在線合成平臺的SDK, 在取得導(dǎo)航播報信息后, 將播報信息轉(zhuǎn)換成語音.高版本SDK 對語音功能支持更好, 只需要集成導(dǎo)航公司提供的包含了語音功能的jar 包與so 包, 做好相關(guān)配置即可.
Android 端與導(dǎo)航服務(wù)器的通信由高德提供SDK 內(nèi)部實現(xiàn), 只需調(diào)用相關(guān)接口即可.Android 端和Web 服務(wù)器的交互通過HTTP 協(xié)議進(jìn)行.在Android端采用了Okhttp 框架進(jìn)行, 該框架可支持GZIP 格式,達(dá)到減少數(shù)據(jù)流量使用的目的.在編寫底層通信代碼時, 高版本Android SDK 不允許主線程進(jìn)行通信操作,因為主線程需要進(jìn)行界面元素的監(jiān)聽, 若主線程負(fù)責(zé)通信, 則會使界面在通信時失去響應(yīng), 造成不友好的用戶體驗.所以在進(jìn)行通信時, 應(yīng)啟動子線程, 由子線程負(fù)責(zé)監(jiān)聽, 并通過Handler 進(jìn)行必要的界面更新等操作.在OkHttp 框架中, 也是基于該原理進(jìn)行了封裝.
在與MQTT 服務(wù)端交互時, Android 端和嵌入式設(shè)備都可以看作MQTT 客戶端, 導(dǎo)入在MQTT 官網(wǎng)下載的jar 包之后, 在Android 端通過MQTT 協(xié)議提供的接口進(jìn)行通訊, 整體過程如圖4 所示[7].
圖4 MQTT 服務(wù)器交互方式示意圖
嵌入式設(shè)備為集成MTK2503 芯片組的WZ-203CS開發(fā)板.開發(fā)板的底層是一個實時操作系統(tǒng).圖5 為開發(fā)板的實物圖, 中間方形芯片為開發(fā)板的核心模塊.該核心模塊集成了GNSS、GPRS、藍(lán)牙等功能模塊, 分別由相應(yīng)的接口對外提供服務(wù), 其實現(xiàn)的內(nèi)部結(jié)構(gòu)框圖如圖6 所示.在核心模塊外部的開發(fā)板上嵌入了物聯(lián)網(wǎng)卡, 能夠滿足定位與追蹤需求.同時, 核心模塊還對外提供了SD、AUDIO 等接口, 通過外接SD 卡可存儲音頻等信息, 使得依托該開發(fā)板的系統(tǒng)擁有較好的可拓展性.對于集成了該開發(fā)板的設(shè)備, 開發(fā)商提供了一套較為齊全的服務(wù).若不采用該服務(wù), 可以在云平臺搭建屬于單個系統(tǒng)的私有云服務(wù)器, 整體設(shè)計思路相近, 系統(tǒng)容量會更加可觀.
圖5 WZ-203CS 開發(fā)板實物圖
圖6 開發(fā)板核心模塊結(jié)構(gòu)框圖
嵌入式設(shè)備需要能夠維持與MQTT 服務(wù)器端的長連接.傳統(tǒng)智能家居設(shè)備與Android 端進(jìn)行交互需要先進(jìn)行配網(wǎng)再控制設(shè)備, 它們的連接由WiFi 模塊發(fā)送心跳包維持[8].與智能家居設(shè)備不同的是, 當(dāng)用戶有寵物追蹤需求時, 寵物往往已不在家中, 此時再通過WiFi 模塊配網(wǎng)將使系統(tǒng)可用性大大降低, 故此時的連接交由開發(fā)板上內(nèi)嵌的物聯(lián)網(wǎng)卡進(jìn)行, 由GPRS 模塊負(fù)責(zé)連接的維持, 主動向MQTT 服務(wù)器上報設(shè)備狀態(tài).在整個過程中, 為了保證每個用戶都能夠訂閱到自己設(shè)備的信息, 系統(tǒng)以設(shè)備SN 號為標(biāo)識設(shè)置訂閱主題.簡化后的過程如圖7 所示.當(dāng)用戶訂閱了主題之后, 就可以接收到來自設(shè)備的推送信息.1 個用戶可以訂閱以多個SN 號為標(biāo)識的主題, 適用于1 個用戶擁有多只寵物的情形.為了避免訂閱主題在人工輸入環(huán)節(jié)出錯, 采用了二維碼掃描輸入的方法, 確保系統(tǒng)的易用性.
圖7 簡化后的發(fā)布訂閱模式示意圖
Web 服務(wù)端以Spring Boot 框架為基礎(chǔ), 集成Hibernate 中間件進(jìn)行數(shù)據(jù)持久化, 依靠Maven 進(jìn)行代碼管理.Web 服務(wù)端對Android 端的響應(yīng)利用了Spring MVC 的設(shè)計模式[9], 為Android 端提供服務(wù)的視圖層在服務(wù)端是不可見的.當(dāng)用戶發(fā)起請求時, 根據(jù)用戶請求的URL, 控制器會為其映射到對應(yīng)的處理方法中, 該方法會根據(jù)用戶需求進(jìn)行業(yè)務(wù)處理, 并將結(jié)果以JSON 格式返回給Android 端進(jìn)行解析.絕大多數(shù)業(yè)務(wù)都是對數(shù)據(jù)進(jìn)行處理, 對于需要訪問數(shù)據(jù)庫的業(yè)務(wù)邏輯, 服務(wù)器端將關(guān)系數(shù)據(jù)利用Hibernate 映射到實體類中, 即MVC 框架中的模型層, 該業(yè)務(wù)只需通過操作實體類即可完成對數(shù)據(jù)庫的事務(wù)操作.依靠數(shù)據(jù)庫連接池、Hibernate 的Transaction 事務(wù)處理接口、加鎖等操作, 可以在一定程度上依靠代碼處理好并發(fā).
由于Android 平臺開源的特性, 促進(jìn)了眾多基于Android 平臺的硬件設(shè)備的出現(xiàn), 這些硬件產(chǎn)品存在著不兼容的可能性.為確保系統(tǒng)穩(wěn)定, 需要對Android 端進(jìn)行兼容性測試.傳統(tǒng)測試每次只能在一個硬件上對測試用例串行執(zhí)行, 云測試可以合理的動態(tài)調(diào)用各類資源, 通過一個共享可用的自動化測試環(huán)境提供高效的便捷服務(wù)[10].通過云平臺以較低成本覆蓋測試更多的設(shè)備, 盡可能發(fā)現(xiàn)系統(tǒng)的潛在兼容性問題.本系統(tǒng)Android 端借助百度移動云測試中心進(jìn)行測試, 已通過MTC 認(rèn)證并在百度應(yīng)用市場發(fā)布.
用戶首次進(jìn)入該系統(tǒng), 需要先注冊, 注冊時會收到云平臺發(fā)送的短信驗證碼, 通過驗證登陸.登陸后用戶掃描二維碼綁定設(shè)備, 綁定成功后用戶即可查看寵物位置信息.當(dāng)寵物丟失時, 用戶可以通過位置信息發(fā)現(xiàn)寵物, 并選擇導(dǎo)航方式進(jìn)行寵物追蹤.核心業(yè)務(wù)流程如圖8 所示.
圖8 核心業(yè)務(wù)流程圖
用戶在注冊并登陸后, 可進(jìn)入如圖9 所示的主界面, 在該主界面下用戶可以綁定設(shè)備、查看設(shè)備信息,完成綁定后, 點擊主界面下方導(dǎo)航即可進(jìn)入如圖10 所示的導(dǎo)航界面預(yù)覽, 界面已將用戶與寵物的經(jīng)緯度信息可視化, 用戶在該界面可確認(rèn)寵物位置并確定是否要開始導(dǎo)航.當(dāng)用戶決定導(dǎo)航尋寵時, 單擊地圖下方的圖形按鈕即可開始導(dǎo)航, 如圖11 所示.
本文設(shè)計并實現(xiàn)了基于MQTT 協(xié)議的智能寵物追蹤系統(tǒng).通過掃描二維碼的形式錄入、識別綁定寵物攜帶的硬件設(shè)備SN 號.以SN 號設(shè)置訂閱主題, 實現(xiàn)用戶與設(shè)備間一對多的關(guān)系.綁定完成后通過MQTT協(xié)議獲取寵物的位置, 通過高德地圖繪制從用戶到寵物的路徑, 并可實現(xiàn)導(dǎo)航功能.除核心模塊外, 系統(tǒng)還為用戶提供了許多其他功能, 如疫苗規(guī)劃、科普、物聯(lián)網(wǎng)卡充值等.系統(tǒng)在設(shè)計過程中融入軟件工程復(fù)用思想, 為系統(tǒng)預(yù)留了拓展接口.依靠這些拓展接口, 可漸增集成開發(fā)老人防走失, 汽車防盜等模塊.采用該協(xié)議實現(xiàn)的追蹤功能具有低功耗、長連接、低流量等優(yōu)點, 為開發(fā)同類產(chǎn)品提供了一種新思路.
圖9 Android 端主界面圖
圖10 導(dǎo)航預(yù)覽界面圖
圖11 導(dǎo)航界面圖