黃弘毅,韓劍輝,胡小文,韓飛馳
(哈爾濱理工大學 計算機科學與技術學院,黑龍江 哈爾濱150080)
數(shù)據(jù)的存儲與可視化幾乎是所有依賴數(shù)據(jù)運行的項目所需解決的一大難題。在傳統(tǒng)開發(fā)中,開發(fā)者一般選擇將數(shù)據(jù)存儲到本地數(shù)據(jù)庫,并通過顯示屏等人機交互接口來實現(xiàn)數(shù)據(jù)的可視化。但是本地存儲具有一系列的弱勢:(1)相對依賴本地的硬件環(huán)境;(2)容易受到各種物理因素的影響,導致數(shù)據(jù)丟失或損壞,造成不可挽回的損失。在通信技術急劇發(fā)展的今天,云端數(shù)據(jù)庫為我們提供了一個高效安全的平臺,給開發(fā)者提供了一個更加具有優(yōu)勢的選擇,能在很大程度上彌補本地存儲帶來的不足與風險。
系統(tǒng)上位機在本地裝載了具有較小內核且適用于安全操作的Linux系統(tǒng),通過Pyhton3腳本將本地數(shù)據(jù)封裝成阿里云物聯(lián)網(wǎng)平臺可識別的JSON格式?;贛QTT網(wǎng)絡通訊協(xié)議,通過高速4G DTU模塊將本地數(shù)據(jù)發(fā)送到阿里云物聯(lián)網(wǎng)平臺的物模型平臺中,通過平臺的物理引擎編寫云產(chǎn)品流轉規(guī)則將數(shù)據(jù)轉儲到具有完善性能且安全的RDS數(shù)據(jù)庫中進行及時存儲。整個過程十分快捷,且易于維護,降低了風險的發(fā)生率,當本地數(shù)據(jù)被存儲到數(shù)據(jù)庫中以后,還可以非常方便地在本地編寫Python3腳本,實現(xiàn)對數(shù)據(jù)庫的進一步操作。該系統(tǒng)所涉及的模塊主要包括三個大步驟以及九個小步驟:
(1)本地數(shù)據(jù)的人為分析;(2)編寫數(shù)據(jù)整合腳本;(3)測試腳本性能。
(1)MQTT的性能機制;(2)4G DTU與云端通信;(3)阿里云的簡單測試。
(1)云上轉儲流程細則;(2)本地收發(fā)流程細則;(3)本地與云的整體運行測試。
通常,本地數(shù)據(jù)為分別獨立的變量,每個變量代表實際的物理量。若按位傳輸數(shù)據(jù),其缺點以及可能造成的后果如表1所示。
表1 數(shù)據(jù)按位傳輸?shù)娜秉c以及可能造成的后果
若要解決諸如此類的問題,就需要開發(fā)者根據(jù)項目的實際情況,通過按照阿里云平臺的格式,來對本地數(shù)據(jù)進行相應的封裝。阿里云提供的可以識別的數(shù)據(jù)格式為JSON格式,本文將通過編寫Python3腳本來實現(xiàn)對數(shù)據(jù)的合并,然后有序地封裝。以工程中傳輸8個紅外傳感器的實時數(shù)據(jù)為例,數(shù)據(jù)整合腳本的詳情如圖1(a)所示。
該腳本的輸入為一個12位的二進制串,前4位為消息包頭,0x00表示這是傳感器的消息,后面8個二進制數(shù)表示8個紅外傳感器的值。運行該腳本,得到JSON格式的數(shù)據(jù)如圖1(b)所示。
圖1 數(shù)據(jù)整合腳本和數(shù)據(jù)解析結果
本文采用4G DTU模塊,通過4G網(wǎng)絡,并基于MQTT網(wǎng)絡通訊協(xié)議,實現(xiàn)將數(shù)據(jù)傳輸至阿里云物聯(lián)網(wǎng)平臺。
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協(xié)議),是構建于TCP/IP協(xié)議上,基于發(fā)布/訂閱(Publish/Subscribe)模式的輕量級通訊協(xié)議[1]。其實現(xiàn)方式如圖2所示。
圖2 MQTT協(xié)議實現(xiàn)方式
MQTT協(xié)議一共有三種身份,其中發(fā)布者和訂閱者都是客戶端,消息的代理為服務器端[2]??蛻舳税l(fā)送的消息共有兩種類型:主題(Topic):主題是消息的類型,訂閱者訂閱該主題后,就可以收到該主題的內容[3]。負載(Payload):負載是消息的內容,是指訂閱者具體要使用的內容[3]。相較于其他網(wǎng)絡傳輸協(xié)議,MQTT協(xié)議最大的優(yōu)點是可以用極少的代碼和有限的帶寬,為遠程設備提供實時可靠的消息服務[2]。
阿里云物聯(lián)網(wǎng)平臺封裝了許多物理型通信主題可以用于數(shù)據(jù)通信,如表2所示。
表2 阿里云平臺物理型通信主題
4G DTU模塊通過訂閱阿里云的物理型通信主題,實現(xiàn)將串口接收到的數(shù)據(jù)發(fā)送至其相應的主題上,此時阿里云物聯(lián)網(wǎng)平臺便能接受其發(fā)送的數(shù)據(jù)并執(zhí)行后續(xù)操作。
數(shù)據(jù)的云上轉儲是將原始的Payload數(shù)據(jù)通過物模型解析傳到物模型數(shù)據(jù)上,通過規(guī)則引擎對數(shù)據(jù)進行解析,得到SQL語句處理的結果。通過編寫數(shù)據(jù)傳送規(guī)則,將得到的數(shù)據(jù)轉儲到數(shù)據(jù)庫中,實現(xiàn)數(shù)據(jù)的存儲。以8個紅外傳感器采集到的數(shù)據(jù)為例。首先通過本地Python3腳本,可以得到如圖3(a)所示的原始Payload數(shù)據(jù)。然后阿里云物聯(lián)網(wǎng)平臺會對原始Payload數(shù)據(jù)進行解析,得到如圖3(b)所示的數(shù)據(jù)解析結果(此處僅展示部分解析結果)。接著通過編寫如圖4(a)所示的規(guī)則引擎SQL語句,可以得到如圖4(b)所示的處理結果。再編寫云產(chǎn)品流轉規(guī)則就可以將數(shù)據(jù)轉儲到RDS數(shù)據(jù)庫中。
圖3 原始Payload數(shù)據(jù)和物模型解析結果
圖4 規(guī)則引擎SQL語句和規(guī)則引擎處理結果
至此,我們已經(jīng)可以將本地數(shù)據(jù)發(fā)送到云端,并實現(xiàn)數(shù)據(jù)的云端存儲。但是有時候也需要手動操作數(shù)據(jù)庫的內容,此時就需要在本地電腦中編寫Python程序來連接云端數(shù)據(jù)庫并實現(xiàn)對遠端數(shù)據(jù)庫的操作。
Python3腳本連接云端數(shù)據(jù)庫一般的操作步驟如下:
(1)連接數(shù)據(jù)庫;(2)編寫SQL語句實現(xiàn)對數(shù)據(jù)庫的操作;(3)提交SQL腳本到云端執(zhí)行;(4)云端執(zhí)行SQL語句并返回結果。
以刪除數(shù)據(jù)庫的數(shù)據(jù)為例,其Python3代碼如圖5所示。
圖5 刪除數(shù)據(jù)庫中的數(shù)據(jù)腳本
其中腳本的輸入是SQL語句。阿里云RDS數(shù)據(jù)庫增刪改查的SQL語句示例如圖6所示。
圖6 阿里云RDS數(shù)據(jù)庫增刪改查SQL語句示例
這樣,通過在Python3腳本中調用相應的SQL語句就可以實現(xiàn)本地對云端RDS數(shù)據(jù)庫的操作。
本文詳細講解了如何將傳感器收集到的數(shù)據(jù)通過4G DTU模塊傳輸至阿里云物聯(lián)網(wǎng)平臺,并轉儲至RDS數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)的云端存儲。同時也可以在本地使用Python3腳本實現(xiàn)對云端數(shù)據(jù)庫的直接操作。這樣完成了項目與云端的數(shù)據(jù)處理部分,為后續(xù)的項目開發(fā)奠定了基礎。