王葦棋,陳文印,吳同德,陳亞平,謝飛武,吳科甲
(福建信息職業(yè)技術(shù)學(xué)院,福建 福州 350000)
物聯(lián)網(wǎng)是計(jì)算機(jī)、電子、通信等應(yīng)用技術(shù)的集中體現(xiàn),是近些年科技發(fā)展的幾種體現(xiàn),是人民生活的重要技術(shù)支撐。隨著物聯(lián)網(wǎng)應(yīng)用技術(shù)涉足的產(chǎn)業(yè)越來(lái)越廣、實(shí)際應(yīng)用越來(lái)越多、相關(guān)產(chǎn)品越來(lái)越豐富,物聯(lián)網(wǎng)已經(jīng)成為了一個(gè)千億級(jí)的行業(yè)市場(chǎng)[1-3]。
隨著物聯(lián)網(wǎng)行業(yè)迅速發(fā)展,帶動(dòng)了物聯(lián)網(wǎng)云服務(wù)應(yīng)用的提升,國(guó)內(nèi)代表廠商有百度、阿里、騰訊、小米、海爾等。按照商業(yè)模式的不同,物聯(lián)網(wǎng)云平臺(tái)可以分為公有云和私有云。公有云物聯(lián)網(wǎng)平臺(tái)一般由相關(guān)企業(yè)提供,開(kāi)放了大量物聯(lián)網(wǎng)服務(wù)和接口,方便設(shè)備接入和管理。物聯(lián)網(wǎng)公有云對(duì)設(shè)備的協(xié)議有更為嚴(yán)格規(guī)定,且大部分物聯(lián)網(wǎng)管理應(yīng)用功能由廠家定義。而物聯(lián)網(wǎng)私有云平臺(tái)是用戶自己搭建底層運(yùn)行框架,自定義業(yè)務(wù)邏輯功能,使用靈活但開(kāi)發(fā)維護(hù)門檻高。近年來(lái),部分公有云廠家也提供私有云部署業(yè)務(wù),可以為客戶定制開(kāi)發(fā)功能。對(duì)于個(gè)人用戶而言,想開(kāi)發(fā)一套自己的物聯(lián)網(wǎng)私有云系統(tǒng),一般還需要租用一臺(tái)云服務(wù)器。
利用百度物聯(lián)網(wǎng)云平臺(tái)提供的一種通用的MQTT 發(fā)布訂閱功能,可以將私有云物聯(lián)網(wǎng)平臺(tái)部署到自己的個(gè)人計(jì)算機(jī)上。將百度物聯(lián)網(wǎng)云平臺(tái)當(dāng)作一個(gè)數(shù)據(jù)轉(zhuǎn)發(fā)中心,把設(shè)備上報(bào)的數(shù)據(jù)轉(zhuǎn)發(fā)給部署私有云的服務(wù)端。同理,私有云也可以利用百度云將控制指令下發(fā)到設(shè)備。這樣,就可以無(wú)需租用云服務(wù)器也能實(shí)現(xiàn)對(duì)設(shè)備進(jìn)行數(shù)據(jù)采集和控制下發(fā),能夠降低私有云的開(kāi)發(fā)門檻,縮短項(xiàng)目驗(yàn)證周期。
通過(guò)測(cè)試驗(yàn)證表明,該方案實(shí)用性強(qiáng)、快速可靠,能有效提高私有云開(kāi)發(fā)效率。若設(shè)計(jì)得當(dāng),還可以作為物聯(lián)網(wǎng)應(yīng)用個(gè)人開(kāi)發(fā)者的實(shí)際業(yè)務(wù)系統(tǒng)。
基于百度云的物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的核心是具有MQTT 發(fā)布訂閱功能的百度云平臺(tái),設(shè)備端包括采集設(shè)備和轉(zhuǎn)換協(xié)議的智能網(wǎng)關(guān),業(yè)務(wù)端是一個(gè)私有云服務(wù)端。
系統(tǒng)的通信協(xié)議使用了百度提供的MQTT。MQTT 協(xié)議的角色可以分為服務(wù)代理端(Broker)和客戶端(Client),代理服務(wù)器可以支持多種服務(wù)質(zhì)量,客戶端根據(jù)功能劃分為發(fā)布者(Publish)和訂閱者(Subscribe),客戶端通過(guò)協(xié)議與代理服務(wù)器進(jìn)行連接[4]??傮w架構(gòu)如圖1所示。
圖1 總體架構(gòu)圖
百度云平臺(tái)作為數(shù)據(jù)透?jìng)鞯闹修D(zhuǎn)站,不處理具體業(yè)務(wù)邏輯。設(shè)備和私有云都是MQTT 客戶端,利用發(fā)布訂閱功能實(shí)現(xiàn)數(shù)據(jù)交互,進(jìn)而進(jìn)行設(shè)備遠(yuǎn)程監(jiān)控和運(yùn)維升級(jí)。
物聯(lián)網(wǎng)網(wǎng)關(guān)通過(guò)RS 485 等采集總線和ModBus 等采集協(xié)議獲取到采集設(shè)備的數(shù)據(jù)后,將數(shù)據(jù)按照百度云規(guī)定的格式打包后發(fā)給平臺(tái)。接收到平臺(tái)的控制指令后,將指令轉(zhuǎn)換成控制設(shè)備可識(shí)別的信號(hào),實(shí)現(xiàn)設(shè)備間聯(lián)動(dòng)控制。
采集控制設(shè)備具有環(huán)境數(shù)據(jù)采集與控制功能,例如植物工廠中的溫濕度、CO2、LED 補(bǔ)光燈、光照傳感器、噴灌等。要具備現(xiàn)場(chǎng)通信能力和協(xié)議處理能力,接收處理網(wǎng)關(guān)下發(fā)的終端命令[5]。
私有云服務(wù)端是運(yùn)行物聯(lián)網(wǎng)業(yè)務(wù)邏輯功能的主體,由于百度云的存在,服務(wù)端只需要能夠連上網(wǎng)絡(luò)即可實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)采集。因此,服務(wù)端的載體可以是個(gè)人計(jì)算機(jī)、手機(jī)APP,甚至是嵌入式設(shè)備,在開(kāi)發(fā)上更為靈活方便。
百度物聯(lián)網(wǎng)云平臺(tái)是面向物聯(lián)網(wǎng)行業(yè)開(kāi)發(fā)的云管理平臺(tái),它提供設(shè)備接入與管理、規(guī)則引擎及物聯(lián)網(wǎng)邊緣等功能[6]。云端可接入、管理設(shè)備并建立安全可靠的連接;規(guī)則引擎提供物聯(lián)網(wǎng)設(shè)備與云平臺(tái)其他產(chǎn)品之間的數(shù)據(jù)互傳;物聯(lián)網(wǎng)邊緣可將云計(jì)算能力拓展至用戶現(xiàn)場(chǎng),并且在工作條件差的區(qū)域也可以提供計(jì)算服務(wù)。
MQTT(消息隊(duì)列遙測(cè)傳輸)是一種基于發(fā)布訂閱(Publish Subscribe)模式的“輕量級(jí)”通信協(xié)議,該協(xié)議構(gòu)建于TCPIP 協(xié)議簇上。為了適應(yīng)硬件功能不穩(wěn)定或者網(wǎng)絡(luò)條件差等情況下而設(shè)計(jì)的一款發(fā)布訂閱型消息協(xié)議。它的最大優(yōu)勢(shì)在于可以提供實(shí)時(shí)可靠的消息傳遞服務(wù),用很少的代碼和有限的帶寬連接遠(yuǎn)程設(shè)備,低開(kāi)銷、低帶寬,因此被廣泛應(yīng)用于物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等領(lǐng)域[7]。云平臺(tái)配置流程包括創(chuàng)建IoTCore 實(shí)例、創(chuàng)建模板、創(chuàng)建設(shè)備、獲取連接信息、測(cè)試MQTT 通信。
百度云平臺(tái)作為物聯(lián)網(wǎng)網(wǎng)關(guān)、私有云服務(wù)端的“中介”,提供了MQTT 服務(wù),需要注冊(cè)賬號(hào)并生成通信密鑰,實(shí)現(xiàn)智能設(shè)備與云端之間建立安全的連接,防止設(shè)備被不法分子攻擊。
(1)創(chuàng)建IoTCore 實(shí)例
在使用物聯(lián)網(wǎng)核心套件前,需要?jiǎng)?chuàng)建一個(gè)百度智能云賬號(hào),登錄后在云平臺(tái)開(kāi)通IoTCore,點(diǎn)擊“創(chuàng)建IoTCore”,輸入名稱與描述,即可創(chuàng)建實(shí)例。
(2)創(chuàng)建模板
設(shè)備模板是提供當(dāng)前設(shè)備的主題描述,默認(rèn)的設(shè)備模板包含兩個(gè)主題。按照?qǐng)D2和圖3步驟新創(chuàng)建SertoCli 和ClitoSer 兩個(gè)主題。
圖2 創(chuàng)建一個(gè)模板
圖3 創(chuàng)建主題
(3)創(chuàng)建設(shè)備
填寫設(shè)備名稱、認(rèn)證方式、描述、設(shè)備模板,其中認(rèn)證方式選密鑰認(rèn)證,描述可以不寫。
(4)獲取連接信息
在云平臺(tái)配置好設(shè)備信息后,自動(dòng)生成新的設(shè)備信息和連接密鑰。進(jìn)入設(shè)備詳情頁(yè),在連接信息欄目,點(diǎn)擊右側(cè)圖標(biāo),即可查看設(shè)備信息:IoTCoreId、DeviceKey 和DeviceSecret。
針對(duì)不同項(xiàng)目需求創(chuàng)建相應(yīng)IoT Core 實(shí)例庫(kù),在庫(kù)中添加需要的物聯(lián)網(wǎng)傳感器,從而獲取傳感器采集傳輸?shù)南鄳?yīng)的實(shí)時(shí)數(shù)據(jù),實(shí)現(xiàn)云端部署管理[8]。
2.3.1 生成用戶名和密碼
MQTT 測(cè)試需要將獲取到的設(shè)備信息生成登錄用戶名和密碼,然后通過(guò)MQTT 測(cè)試工具或者軟件實(shí)現(xiàn)通信,具體流程可以分為以下幾個(gè)步驟:
(1)生成用戶名
創(chuàng)建設(shè)備時(shí)選的認(rèn)證方式為密鑰認(rèn)證后需通過(guò)拼接連接成用戶名,使用拿到的IoTCoreId、DeviceKey 和DeviceSecret,生成MQTT 連接所需的用戶名及密碼。用戶名具體拼接如下:
{adp_type}@{IoTCoreId}|{DeviceKey}|{timestamp}|{algorithm_type}
具體含義見(jiàn)表1所列。
表1 用戶名字段定義
例如:IoTCoreId 為"avmbgrk",DeviceKey 為"zwgcDevice",則用戶名可以為"thingidp@avmbgrk|zwgcDevice|0|MD5"。
(2)生成密碼
組合加密字符串具體拼接如下:
{DeviceKey}&{timestamp}&{algorithm_type}{DeviceSecret}
具體含義見(jiàn)表2所列。
表2 用戶名字段定義
例如:DeviceKey 為"zwgcDevice",DeviceSecret 為"oGciBvqglTuaVKlu",則加密字符串可以為"zwgcDevice&0&MD5oGciBvqglTuaVKlu"。
使用MD5 對(duì)加密字符串的UTF-8 字符集比特?cái)?shù)組進(jìn)行加密,并將結(jié)果轉(zhuǎn)換為小寫形式,密碼為“53b1e44951df2329 70a624d8dc4945c8”。
具體Python 參考代碼如下:
2.3.2 MQTT 數(shù)據(jù)收發(fā)
MQTT 數(shù)據(jù)收發(fā)功能測(cè)試可以使用mqtt.fx 等軟件進(jìn)行測(cè)試,使用方法與網(wǎng)絡(luò)調(diào)試助手類似。本文提供一種基于Python 代碼的MQTT 數(shù)據(jù)收發(fā)測(cè)試方法。
本文MQTT 代碼是基于Anaconda 環(huán)境,Python 版本為3.7.6,需要安裝paho-mqtt 模塊,可以通過(guò)指令安裝,也可以通過(guò)Anaconda 環(huán)境管理功能進(jìn)行安裝。
使用paho-mqtt 模塊前需要導(dǎo)入相關(guān)模塊,然后需要編寫連接回調(diào)函數(shù)和收到消息的回調(diào)函數(shù),緊接著連接到對(duì)應(yīng)的服務(wù)端,最后啟動(dòng)線程服務(wù)就完成了paho-mqtt 功能開(kāi)發(fā)。具體Python 參考代碼如下:
通過(guò)發(fā)布消息函數(shù),發(fā)布到對(duì)應(yīng)主題就可以接受到對(duì)應(yīng)的數(shù)據(jù):
In [6]:mqttser.publish(topicSertoCli,'{data:"mqttser1"}',qos = 1)
mqttser.publish(topicSertoCli,'{data:"mqttser2"}',qos = 1)
Out[6]:
dev_onmsg,$iot/zwgcDevice/user/SertoCli ,b’{data:"mqttser1"}’
dev_onmsg,$iot/zwgcDevice/user/SertoCli ,b’{data:"mqttser2"}'
私有云服務(wù)端主要流程包括生成登錄賬號(hào)和密碼、登錄百度云平臺(tái)、通過(guò)MQTT 發(fā)送控制指令、通過(guò)MQTT 接收遙測(cè)數(shù)據(jù)等,具體流程如圖4所示。
圖4 服務(wù)端流程
接收到遙測(cè)數(shù)據(jù)后,根據(jù)需求進(jìn)行處理,例如對(duì)數(shù)據(jù)進(jìn)行解析、將報(bào)文存儲(chǔ)到數(shù)據(jù)庫(kù)中、將數(shù)據(jù)轉(zhuǎn)發(fā)至展示平臺(tái)、對(duì)數(shù)據(jù)進(jìn)行告警判斷等[9]。
當(dāng)發(fā)生告警時(shí)或者人為下發(fā)控制指令等情況需要對(duì)設(shè)備進(jìn)行遠(yuǎn)程控制時(shí),服務(wù)端將命令通過(guò)MQTT 服務(wù)端下發(fā)至網(wǎng)關(guān),網(wǎng)關(guān)解析命令后實(shí)現(xiàn)對(duì)遠(yuǎn)程設(shè)備進(jìn)行調(diào)控。
設(shè)備端網(wǎng)關(guān)功能主要是硬件設(shè)備初始化、生成登錄賬號(hào)和密碼、登錄百度云平臺(tái)、接收服務(wù)端控制指令、采集傳感器數(shù)據(jù)并上報(bào),具體流程如圖5所示。
圖5 設(shè)備端流程
硬件部分最重要的是智能網(wǎng)關(guān)模塊,網(wǎng)關(guān)一般包括采集電路、通信模塊、主控模塊。智能網(wǎng)關(guān)模塊主要負(fù)責(zé)將采集到的傳感器數(shù)據(jù)打包后上傳至云平臺(tái),解析云平臺(tái)下發(fā)的指令并執(zhí)行,復(fù)雜的智能網(wǎng)關(guān)模塊還應(yīng)具有邊緣計(jì)算能力。
為了更方便測(cè)試,首先將Token 生成相關(guān)代碼封裝成一個(gè)BaiduMqttTockenClass 類,將所有用到的參數(shù)存到類里,具體Python 參考代碼如下。同理,將MQTT 連接功能封裝成一個(gè)BaiduMqttConClass 類,將所有連接過(guò)程封裝到類里。
服務(wù)端測(cè)試代碼首先要?jiǎng)?chuàng)建一個(gè)MQTT 連接,并訂閱設(shè)備上報(bào)主題用于接收設(shè)備上報(bào)的數(shù)據(jù),具體Python 參考代碼如下:
測(cè)試代碼模擬一個(gè)服務(wù)端下發(fā)控制指令過(guò)程,每隔1 s,交替下發(fā)風(fēng)扇開(kāi)啟和關(guān)閉指令,具體Python 參考代碼如下:
同理,設(shè)備端測(cè)試代碼首先要?jiǎng)?chuàng)建一個(gè)MQTT 連接,并訂閱服務(wù)端下發(fā)指令主題,用于接收服務(wù)端下發(fā)的指令,具體Python 參考代碼如下:
測(cè)試代碼模擬一個(gè)設(shè)備端上報(bào)數(shù)據(jù)的過(guò)程,每隔2 s,隨機(jī)生成溫度和濕度值,并上報(bào)至服務(wù)端,具體Python 參考代碼如下:
測(cè)試運(yùn)行結(jié)果具體Python 參考代碼如下,服務(wù)端每隔2 s 接收到設(shè)備端上報(bào)的數(shù)據(jù),設(shè)備端每隔1 s 接收到服務(wù)端下發(fā)的指令。
本文的研究充分證明了該物聯(lián)網(wǎng)模型的可行性和實(shí)用性,提供了一套搭建簡(jiǎn)易物聯(lián)網(wǎng)模型的思路,實(shí)現(xiàn)了用戶快速搭建一套物聯(lián)網(wǎng)項(xiàng)目的需求。在此基礎(chǔ)上,開(kāi)發(fā)者可以增加數(shù)據(jù)庫(kù)系統(tǒng)、可視化界面等其他模塊以便于構(gòu)建一套更完整的物聯(lián)網(wǎng)系統(tǒng)。
注:本文通訊作者為陳文印。