您好,登錄后才能下訂單哦!
這篇文章主要講解了“基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)”吧!
為此,我們設(shè)計(jì)并實(shí)現(xiàn)了海舟智慧園區(qū)消息總線系統(tǒng)SailMQ。
海舟智慧園區(qū)消息總線系統(tǒng),是一個(gè)MQTT服務(wù)端的實(shí)現(xiàn),基于gmqtt提供的全面的MQTT v3.1.1和MQTT v5支持,為用戶提供面向未來的智慧園區(qū)基礎(chǔ)設(shè)施。
海舟智慧園區(qū)消息總線系統(tǒng)包含以下子系統(tǒng):
海舟智慧園區(qū)管理系統(tǒng)SailUI
海舟智慧園區(qū)消息總線系統(tǒng)SailMQ
這兩個(gè)子系統(tǒng)相輔相成,缺一不可。
各種物聯(lián)網(wǎng)智能終端設(shè)備與用于與舊式系統(tǒng)交互的工控機(jī)等被統(tǒng)一稱為設(shè)備,是用戶管理的基本單位,設(shè)備歸屬于某個(gè)特定的設(shè)備管理員,一個(gè)設(shè)備管理員可以管轄多個(gè)設(shè)備。
用于展示、控制、獲取設(shè)備狀態(tài)的應(yīng)用系統(tǒng)被稱為App,App歸屬于某個(gè)特定的App管理員,App管理員被授權(quán)訪問多個(gè)設(shè)備,其所管理的App具有同這些設(shè)備進(jìn)行交互的權(quán)限。
統(tǒng)一將設(shè)備和App稱為客戶端。
主題被劃分為三級,例如dm-1/dev-1/DATA,其中dev-1為相應(yīng)客戶端的Client ID,dm-1為其所屬的管理員的User Name,DATA為通道名(Channel Name)。
所有通道名如下:
OFFLINE
DATA
CONTROL
CREPLY
QUERY
QREPLY
規(guī)則引擎是一個(gè)用于校驗(yàn)消息格式的系統(tǒng)模塊,后續(xù)章節(jié)會進(jìn)行詳細(xì)介紹。
在MQTT協(xié)議中,客戶端向服務(wù)端發(fā)送的第一個(gè)報(bào)文是CONNECT報(bào)文,本系統(tǒng)對此報(bào)文中的客戶標(biāo)識符(Client Identifier)、用戶名(User Name)、密碼(Password)、遺囑主題(Will Topic)和遺囑消息(Will Payload)進(jìn)行校驗(yàn),在MQTT v5協(xié)議的客戶端中,如果存在認(rèn)證方法(Authentication Method),則應(yīng)將其設(shè)置為jwt,并將認(rèn)證數(shù)據(jù)(Authentication Data)設(shè)置為與密碼相同。
下面詳細(xì)介紹以上字段的配置規(guī)則:
客戶端標(biāo)識符
應(yīng)根據(jù)其類型配置為 dev-XXX(設(shè)備) 或 app-YYY (App)。
用戶名
根據(jù)客戶端類型進(jìn)行配置,當(dāng)客戶端類型為設(shè)備,此處應(yīng)設(shè)置為其設(shè)備管理員的User Name;當(dāng)客戶端類型為App,此處應(yīng)設(shè)置為其App管理員的User Name。
密碼
如需獲取密碼,請安裝SailPasswordGenerator,打開后按照界面提示輸入相應(yīng)參數(shù)即可獲得密碼。
遺囑主題
遺囑主題的設(shè)置根據(jù)客戶端類型的不同采用不同的設(shè)置,如果類型為設(shè)備則應(yīng)設(shè)置為dm-XXX/dev-YYY/OFFLINE;如果類型為App則應(yīng)將其置空。
遺囑消息
遺囑主題的設(shè)置根據(jù)客戶端類型的不同采用不同的設(shè)置,如果類型為App則應(yīng)將其置空;如果類型為設(shè)備,遺囑消息需通過規(guī)則引擎的驗(yàn)證,關(guān)于規(guī)則引擎請參考后續(xù)章節(jié)。
訂閱支持共享訂閱和非共享訂閱,訂閱根據(jù)不同的客戶端類型而有所不同:
當(dāng)客戶端類型為設(shè)備,其可以訂閱主題dm-XXX/dev-YYY/CONTROL和dm-XXX/dev-YYY/QUERY。
當(dāng)客戶端類型為App,她可以訂閱其所屬App管理員被授權(quán)的設(shè)備,可以訂閱的通道為DATA、CREPLY、QREPLY;此時(shí)也可以訂閱相應(yīng)的共享訂閱主題。例如有名為app-1的App,其所屬App管理員為am-1,am-1被授權(quán)的設(shè)備有dev-1,而dev-1所屬的管理員為dm-1,這時(shí)app-1可以訂閱的主題有dm-1/dev-1/DATA、dm-1/dev-1/CREPLY和dm-1/dev-1/QREPLY;及相應(yīng)的共享訂閱主題,例如$share/{ShareName}/dm-1/dev-1/DATA。
發(fā)布支持QOS0、1、2。
發(fā)布根據(jù)不同的客戶端類型而有所不同:
當(dāng)客戶端類型為設(shè)備,其可以發(fā)布的主題為dm-XXX/dev-YYY/DATA、dm-XXX/dev-YYY/CREPLY和dm-XXX/dev-YYY/QREPLY。
當(dāng)客戶端類型為App,她可以發(fā)布消息到其所屬App管理員被授權(quán)的設(shè)備,可以發(fā)布的通道為CONTROL和QUERY。例如有名為app-1的App,其所屬App管理員為am-1,am-1被授權(quán)的設(shè)備有dev-1,而dev-1所屬的管理員為dm-1,這時(shí)app-1可以發(fā)布的主題有dm-1/dev-1/CONTROL和dm-1/dev-1/QUERY。
如果以上的發(fā)布的訪問控制校驗(yàn)通過,那么會進(jìn)行規(guī)則引擎的校驗(yàn),關(guān)于規(guī)則引擎請參考后續(xù)章節(jié)。
當(dāng)消息進(jìn)入系統(tǒng)時(shí),規(guī)則引擎會對其進(jìn)行校驗(yàn)。
首先,規(guī)則引擎會根據(jù)消息的主題去Redis中尋找相應(yīng)的規(guī)則,例如,當(dāng)主題為dm-1/dev-1/CONTROL時(shí),規(guī)則引擎會按如下的優(yōu)先級順序查找規(guī)則:
dm-1/dev-1/CONTROL
dm-1/*/CONTROL
*/*/CONTROL
*/*/*
當(dāng)規(guī)則引擎找到相應(yīng)的規(guī)則后,不會繼續(xù)向下查詢。
規(guī)則為一段特殊定制的json,下面舉例說明:
{ "age": "number", "books": "list", "isStudent": "bool", "name": "string", "other": "object", "score": { "math": "number", "music": "number", "sport": "number" }, "tag": "value" }
消息若想通過上述規(guī)則的校驗(yàn),必須滿足其定義:
age 應(yīng)設(shè)置為number類型
books 應(yīng)設(shè)置為一個(gè)列表
isStudent 應(yīng)設(shè)置為 true 或 false
name 應(yīng)設(shè)置為字符串
other 應(yīng)設(shè)置為一個(gè)對象,對象的鍵值對沒有要求。
score 應(yīng)設(shè)置為一個(gè)對象,并且其應(yīng)該遞歸滿足規(guī)則中鍵值對的要求,遞歸的層級沒有限制
tag 應(yīng)設(shè)置為number、bool或string類型的值
消息中不得包含規(guī)則中未定義的字段
paho java
paho python
paho c
paho c++
MQTT.js
import paho.mqtt.client as mqtt import json PASSWORD = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6ImFwcC0xIiwidXNlcm5hbWUiOiJhbS0xIn0.fkotiit0lMJhO1FO2P9cvAF8g7KKL9xHF7XgMyq1H-5" def on_connect(client, userdata, flags, reason, properties): print(flags, reason, properties) client.subscribe("dm-1/dev-1/CREPLY") msg = {"light": "on"} client.publish("dm-1/dev-1/CONTROL", json.dumps(msg), 2, True) def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client(client_id="app-1", protocol=mqtt.MQTTv5) client.username_pw_set("am-1", PASSWORD) client.on_connect = on_connect client.on_message = on_message client.connect("localhost", 1883, 60) client.loop_forever()
感謝各位的閱讀,以上就是“基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。