您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

01 youtube官網網頁版設置簽名失敗請檢查mqtt broker(EMQ X 規則引擎系列 (八)橋接消息到 MQTT Broker)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-22 05:25:01【】1人已围观

简介MQTT系列之MQTTbroker的連接client在可以發布和訂閱消息之前,必須先連接到broker,下面我們來看一下連接到broker的流程。連接的建立由Client端發起,Client端首先向b

MQTT 系列之 MQTT broker 的連接

client 在可以發布和訂閱消息之前,必須先連接到 broker,下面我們來看一下連接到 broker 的流程。

連接的建立由 Client 端發起,Client 端首先向 broker 發送一個 CONNECT 數據包,CONNECT 數據包包含以下內容(這里我們略過 fixed header)。

在 CONNECT 數據包可變頭中,含有以下信息。

協議名稱(Proto買粉絲l name) :值固定為 MQTT 字符。

協議版本 :對于 MQTT3.1.1 來說,值為 4.

用戶名標識 :消息體中是否有用戶名字段, 1bit , 0 或 1。

密碼標識 :消息體中是否有密碼字段,1bit,0 或 1。

遺愿消息 Retain 標志(will retain) :標識遺愿消息是否是 retain 消息,1 bit,0 或 1。

遺愿消息 QoS 標志 (will QoS) :標志遺愿消息的 QoS 是否存在,1 bit,0 或 1。

會話清除標志(clean session) :標識 Client 是否建立一個持久化的會話,1bit,0或1,當 clean session 的標識為 0 時,代表 client 希望建立一個之久的會話連接,broker 間存儲該 client 訂閱的主題和未接受的消息,否則broker不會存儲這些數據,同時在建立連接時清除這個 client 之前的持久化會話保存的數據。

心跳保持(keep alive) :設置一個單位為秒的時間間隔,client 和 broker 之間在這個時間內至少需要進行一次消息交互,否則 client 和 broker 會認為它們之間的連接已斷開。

CONNECT 數據包的消息體中包含了以下數據。

客戶端標識符(client identifier) :Client Identifier 是用來標識 Client 身份的字段,在 MQTT3.1.1 的版本中,這個字段的長度是 1 到 23個字節,而且只能包含數字和26個字母(包括大小寫),broker 通過這個字段來區分不同的 client。所有在連接的時候,client應該保證它的 identifier 是唯一的,通常我們可以使用比如 UUID,唯一的設備硬件標識,或者 Android 設備的 DEVICE_ID 等作為 Client identifier 的取值來源。MQTT 協議中要求 Client 連接時必須帶上 Client Identifier,但是也允許 broker 在實現時 Client Identifier 為空,這時 Broker 會為 Client 分配一個內部唯一的 Identifier。如果你需要使用持久化會話,那就必須自己為 Client 設定一個唯一的 Identifier。

用戶名(Username) :如果可變頭中的用戶標識設為 1,那么消息體中將包含用戶名字段,Broker 可以使用用戶名和密碼來對接入的 Client 進行驗證,只允許已經授權的 Client 接入。注意不同的 Client 需要使用不同的 Client Identifier,但它們可以使用同樣的用戶名和密碼進行連接。

密碼(password) :如果可變頭中的密碼標識為1,那么消息體中將包含密碼字段。

遺愿主題(will topic) :如果可變頭中遺愿標識設為1,那么消息體中將包遺愿主題,當 Client 非正常地中斷連接的時候,Broker將向指定的遺愿主題中發布遺愿消息。

遺愿消息(will message) :如果可變頭中的遺愿標志為1,那么消息體中將包含遺愿消息,當 Client 非正常地中斷連接的時候,Broker 將向指定的遺愿主題中發布由該字段指定的內容。

當 broker 收到 client 的 CONNECT 數據包之后,將檢查并校驗 CONNECT 數據包的內容,之后回復 Client 一個 CONNACK 數據包。

CONNACK 數據包包含以下內容(這里略過 Fixed header)。

CONNACK 數據包的可變頭中,含有如下信息:

會話存在標識(Session Present Flag) :用于標識在 Broker 上,是否存在該 client(用 client identifier 區分)的持久性會話,1bit,0或1。當 Client 在連接時設置 clean session = 1 ,則 CONNACK 中的 Session Present Flag 始終為 0;當 client 在連接時設置 clean session = 0 時,那么分為兩種情況:如果 broker 上面保存了這個 Client 之前留下的持久性會話,那么 CONNACK 中的 session present flag 值為 1,如果 broker 沒有保存該 client 的任何會話數據,那么 CONNACK 中 session present flag 值為 0.

連接返回碼: 用于標識 client 是否連接建立成功,連接返回碼如下:

在這里強調一下 買粉絲de 4 和 5。Return Code 4 在 MQTT 協議中的含義是 Username 和 Password 的格式不正確,但是在大部分的 Broker 實現中,在使用錯誤的用戶名密碼時,得到的返回碼也是 4。所以這里我們認為 4 就是代表錯誤的用戶名或密碼。Return Code 5 一般在 Broker 不使用用戶名和密碼而使用 IP 地址或者 Client Identifier 進行驗證的時候使用,來標識 Client 沒有通過驗證。

CONNACK 沒有 payload。

Client 主動關閉連接的流程很簡單,只需要向 broker 發送一個 DISCONNECT 數據包就可以了。DISCONNECT 數據包沒有可變頭和消息體。在 Client 發送完 DISCONNECT 后,無需等待 broker 的回復(broker 也不會有回復),直接關閉底層的 tcp 連接即可。

MQTT 協議規定 Broker 在沒有收到 Client 的 DISCONNECT 數據包之前都應該保持和 Client 連接,只有 Broker 在 Keep Alive 的時間間隔里,沒有收到 Client 的任何 MQTT 數據包的時候會主動關閉連接。一些 Broker 的實現在 MQTT 協議上做了一些拓展,支持 Client 的連接管理,可以主動地斷開和某個 Client 的連接。

Broker 主動關閉連接之前不會向 Client 發送任何 MQTT 數據包,直接關閉底層的 TCP 連接就完事了。

EMQ X 規則引擎系列 (八)橋接消息到 MQTT Broker

橋接是一種連接多個 EMQ X 或者其他 MQTT 消息中間件的方式。不同于集群,工作在橋接模式下的節點之間不會復制主題樹和路由表。橋接模式所做的是:

工作在橋接模式下和工作在集群模式下有不同的應用場景,橋接可以完成一些單純使用集群無法實現的功能:

在具體應用中,一個橋接的發起節點可以被近似的看作一個遠程節點的客戶端。

該場景需要將 EMQ X 指定主題下且滿足條件的消息橋接到 EMQ X 或其他 MQTT Broker。

該場景下設備端上報信息如下:

當上報數據發動機轉速數值大于 8000 時,將該條信息部分數據橋接到指定服務器。

為了避免與本地的 emqx 出現端口沖突的情況,這里臨時修改一下 mosquitto 的本地端口號。

打開 EMQ X Dashboard,進入左側菜單的 資源 頁面,點擊 新建 按鈕,鍵入 Mosquitto 服務器信息進行資源創建。

EMQ X 集群中節點所在網絡環境可能互不相通,資源創建成功后點擊列表中 狀態按鈕 ,查看各個節點資源連接狀況,如果節點上資源不可用,請檢查配置是否正確、網絡連通性,并點擊 重連 按鈕手動重連。

進入左側菜單的 規則 頁面,點擊 新建 按鈕,進行規則創建。這里選擇觸發事件 消息發布 ,在消息發布時觸發該規則進行數據處理。

選定觸發事件后,我們可在界面上看到可選字段及示例 SQL:

規則引擎使用 SQL 語句處理規則條件,該業務中我們需要將 payload 中所有字段單獨選擇出來,使用 payload.fieldName 格式進行選擇,還需要消息上下文的 topic 、 qos 、 id 信息,當前 SQL 如下:

使用 SQL 語句 WHERE 字句進行條件篩選,該業務中我們需要定義兩個條件:

組合上一步驟得到 SQL 如下:

借助 SQL 測試功能,我們可以實時查看當前 SQL 處理后的數據輸出,該功能需要我們指定 payload 等模擬原始數據。

payload 數據如下,注意更改 tachometer 數值大小,以滿足 SQL 條件:

點擊 SQL 測試 切換按鈕,更改 topic 與 payload 為場景中的信息,點擊 測試 按鈕查看數據輸出:

測試輸出數據為:

測試輸出與預期相符,我們可以進行后續步驟。

SQL 條件輸入輸出無誤后,我們繼續添加相應動作,配置寫入 SQL 語句,將篩選結果橋接到 Mosquitto。

點擊響應動作中的 添加 按鈕,選擇 橋接數據到 MQTT Broker 動作,選取剛剛選定的資源。

我們成功創建了一條規則,包含一個處理動作,動作期望效果如下:

切換到 工具 --> Websocket 頁面,使用任意信息客戶端連接到 EMQ X,連接成功后在 消息 卡片發送如下信息:

很赞哦!(63)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:甘肃平凉华亭县

工作室:小组

Email:[email protected]