溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-11-30 09:13:13 來源:億速云 閱讀:218 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“基于MQTTv5的智慧園區(qū)消息總線系統(tǒng)設(shè)計(jì)怎么實(shí)現(xiàn)”吧!

MQTT v5服務(wù)端實(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)相輔相成,缺一不可。

設(shè)計(jì)模型與術(shù)語

設(shè)備(Device)與 設(shè)備管理員(Device Manager)

各種物聯(lián)網(wǎng)智能終端設(shè)備與用于與舊式系統(tǒng)交互的工控機(jī)等被統(tǒng)一稱為設(shè)備,是用戶管理的基本單位,設(shè)備歸屬于某個(gè)特定的設(shè)備管理員,一個(gè)設(shè)備管理員可以管轄多個(gè)設(shè)備。

App 與 App管理員(App Manager)

用于展示、控制、獲取設(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ī)則引擎

規(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ā)布

發(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é)。

規(guī)則引擎

當(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ī)則中未定義的字段

附錄

已知支持MQTTv5的庫

  • paho java

  • paho python

  • paho c

  • paho c++

  • MQTT.js

Python示例代碼

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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI