當前位置:首頁 » 雲伺服器 » mqtt伺服器如何配置

mqtt伺服器如何配置

發布時間: 2022-09-06 20:13:08

Ⅰ 應該使用哪個節點將數據從MQTT代理獲取到node - red

mqtt獲取狀態,使用NodeRED進行MQTT數據發布,使用Mode-RED進行MQTT數據發布。

Ⅱ 在雲伺服器上搭建了mqtt,為什麼手機連接不上mqtt,要怎麼做才能連接上求求大神幫忙

MQTT協議是廣泛應用的物聯網協議,使用測試MQTT協議需要MQTT的代理。有兩種方法使用MQTT服務,一是租用現成的MQTT伺服器,如阿里雲,網路雲,華為雲等公用的雲平台提供的MQTT服務,使用公用的MQTT伺服器的好處是省事,但如果僅僅用於測試學習還需要注冊帳號,靈活性差些,有的平台還需要付費。另一方法是自己使用開源的MQTT組件來搭建。
MQTT伺服器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。
這里介紹的是用輕量級的mosquitto開源項目來搭建一個屬於自己的MQTT伺服器。
第一步:需要安裝一台linux主機,這不多介紹,可以使用真機安裝也可以使用虛擬機安裝。如果僅僅是自己測試使用都可以。
第二步:下載mosquitto需要的依賴
sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake

第三步:下載mosquitto並解壓,現在mosquitto官網最新的版本是1.5.1
tar xzvf mosquitto-1.5.1.tar.gz
第四步:編譯
cd mosquitto-1.5.1/
make
make install
第五步:啟動mosquitto
./mosquitto -v
1535473957: mosquitto version 1.5.1 starting
1535473957: Using default config.
1535473957: Opening ipv4 listen socket on port 1883.
1535473957: Opening ipv6 listen socket on port 1883.
這時候mosquitto就會以默認的參數啟動。如果需要帶配置文件可以修改配置文件mosquitto.conf,
啟動時候加上參數 -c,
./mosquitto -c mosquitto.conf
可以看到,mosquitto監聽的埠為1883.
這時候我們的MQTT伺服器就搭建好了。可找一個mqtt客戶端來測試一下。
先發布一個主題「home/garden/fountain/2」
內容是「hello world」
這時候在mosquitto會列印出下面的log
535474247: New connection from 192.168.1.105 on port 1883.
1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).
1535474247: No will message specified.
1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)
1535474307: Received PINGREQ from MQTT_FX_Client
1535474307: Sending PINGRESP to MQTT_FX_Client
1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))
1535474367: Received PINGREQ from MQTT_FX_Client
1535474367: Sending PINGRESP to MQTT_FX_Client

訂閱主題「home/garden/fountain/2」

可以看到收到了自己發布的消息。
用wireshark抓包
可以看到抓到了一個MQTT的publish的報文。

Ⅲ ubuntu mqtt 服務怎麼搭建

在Ubuntu下搭建MQTT伺服器",主要涉及到【MQTT】在Ubuntu下搭建MQTT伺服器方面的內容,對於【MQTT】在Ubuntu下搭建MQTT伺服器感興趣的同學可以參考一下。

Ⅳ 【內部分享】MQTT協議解讀及使用經驗

時間:2018-07-26

Q: 什麼是網路連接?

A: 網路連接是傳輸層定義的概念,在傳輸層以下只存在網路數據包的相互交換。

所謂連接,其實也不是在網路上有一條真實存在的數據通道。只要通信雙方在一段時間內持續保持數據包交換,就可以視為雙方建立的連接並沒有斷開。

連接的建立是依託於TCP協議的三次握手,一旦連接已經建立完畢,通信雙方就可以復用這條虛擬通道進行數據交換。如果連接保持長時間工作一直沒有被中斷,那麼這樣的TCP連接就俗稱為長連接。

Message Queue Telemetry Transport ,中文直譯: 消息隊列遙測傳輸協議

在MQTT協議被設計出來的年代,還沒有物聯網這么時髦的詞彙,當年叫做 遙測設備

MQTT協議真正開始聲名鵲起的原因,是其正好恰恰踩中移動互聯網發展的節拍,為消息推送場景提供了一個既簡便又具有良好擴展性的現成解決方案。

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

可以看出,MQTT對消息頭的規定十分精簡, 固定頭部佔用空間大小僅為1個位元組 ,一個最小的報文佔用的空間也 只有兩個位元組 (帶一位元組的長度標識位)。

這也是MQTT協議針對不穩定及帶寬低下的網路環境做出的特定設計 - - - - 盡可能地節省一切不必要的網路開銷

Q:為什麼MQTT協議需要心跳報文(PINGREQ, PINGRESP)來維護連接狀態,只監控該TCP的連接狀態是否可以實現目的?

A: TCP數據傳輸默認的超時時間過長,不符合應用層上細粒度的要求。

TCP數據傳輸超時的情況可分成三種: 服務端斷開 、 客戶端斷開 、 中間網路斷開 。

在前兩種場景下,若斷開操作是一方主動發起的,即表示為TCP連接正常結束,雙方走四次揮手流程;若程序異常結束,則會觸發被動斷開事件,通信另一方也能立刻感知到本次連接所打開的 Socket 出現中斷異常。

唯獨中間網路的狀態是通信雙方不能掌握的。 在Linux系統下 ,TCP的連接超時由內核參數來控制,如果通信中的一方沒有得到及時回復,默認會主動再嘗試 6次 。如果還沒有得到及時回應,那麼其才會認定本次數據超時。

連帶首次發包與六次重試,Linux系統下這7次發包的超時時間分別為 2的0次方 2的6次方 ,即1秒、2秒、4秒、8秒、16秒、32秒、64秒,一共127秒。MQTT協議認為如此長的超時時間對應用層而言粒度太大,因此其在應用層上還單獨設計屬於自身的心跳響應控制。常見的MQTT連接超時多被設定為 60秒 。

擴展知識 - TCP的KeepAlive機制: http://hengyunabc.github.io/why-we-need-heartbeat/

由通信中的 報文標識符 ( Packet Identifier )傳達。

Q:僅Publish與Pubrec能保證消息只被投遞一次嗎?

A: 業務上可以實現,但MQTT協議並沒有如此設計,原因如下:

每個消息都會擁有屬於自己的報文標識符,但如果需要兩次數據交換就實現消息僅只收到一次,就需要通信雙方記錄下每次使用的報文標識符,並且在處理每一條消息時都需要去重處理,以防消息被重復消費。

但MQTT協議最初被設計的工作對象是輕量級物聯設備,為此在協議的設計中報文標識符被約定為 可重用 ,以減少對設備性能的消耗,換回的代價不得不使用四次網路數據交換,才能確保消息正好被消費一次。

Q:兩個不同客戶端在發布與訂閱同一Topic下的消息時,都可以提出通信Qos要求,此時以哪項為基準?

A: 偽命題,故意在分享時埋下坑,等人來踩。

兩個不同客戶端的通信是需要 Broker 進行中轉,而不是直連。因此,通信中存在兩個不同的會話,雙方的Qos要求僅僅作用於它們與 Broker 之間的會話,最終的Qos基準只會向最低要求方看齊。

例:遺囑消息的正確使用方式可參考此篇文章: https://www.hivemq.com/blog/mqtt-essentials-part-9-last-will-and-testament

雖然可以藉助 Retain Message 實現綁定一條消息至某個Topic,以達到消息的暫時保留目的。

但首先 Retain Message 並不是為存儲場景而設計的,再次MQTT協議並沒有對消息的持久化作出規定,也就是說Broker重啟後,現有保留消息也將丟失。

Q:兩種特殊消息的使用場景?

A: 遺囑消息,多用於客戶端間獲取互相之間異常斷線的消息通知;

保留消息,可保存 最近一條 廣播通知,多用於公告欄信息的發布。

Eclipse Mosquitto :MQTT協議的最小集實現

有 EMQ , HiveMQ , RabbitMQ MQTT Adapter 等。

Qos=2 消息保障的網路I/O次數過多,如果不是必需,盡少在程序里使用此類消息。

畢竟當初其設計的目的是為了減少設備的性能佔用,但若應用場景並不是物聯網,而是用於手機、電腦或瀏覽器端等現在已不缺性能的設備上,最好在報文體中,使用UUID生成全局唯一的消息ID,然後自行在業務解析中判斷此報文是否被消費過。

或者,業務方在處理消息時保證其被消費的冪等性,也可消除重復消息對系統帶來的影響。

正如MQTT協議並沒有依賴TCP連接狀態,自己在應用層協議上實現心跳報文來控制連接狀態,業務方作為MQTT協議的使用者,也不要完全依賴協議的工作狀態,而是依託MQTT協議建立屬於業務本身的信息匯報機制,以加強系統的穩健性。

Retain Message 可視為客戶端主動拉取的行為。如果業務系統採用 HTTP+MQTT 雙協議描述業務過程,主動拉取的操作也可使用 HTTP 請求替代。

作為一個長連接型的應用,上線前需要根據業務量級,評估對操作系統 埠數 文件描述符 的佔用要求,以防伺服器資源被打滿。

在服務端的配置文件和客戶端的連接參數中,都擁有 max_inflight_messages 此項配置,來維護 Qos=1 or 2 消息是否被成功消費的狀態。

MQTT 最初被設計為物聯網級的通信協議,因此此參數的默認配額較小(大多數情況下被限制到10至20)。

但如果將MQTT協議應用至手機、PC或Web端的推送場景時,硬體性能已不在是瓶頸,在實際使用中推薦把此參數調大。

Mosquitto提供Bridge功能,需要我們自己配置。

Bridge 意為橋接,當我們把兩台Broker橋接在一起時,只需要修改一台Broker的配置,填上另一台Broker的運行地址。前一台Broker將作為客戶端發布與訂閱後一台Broker的所有Topic,實現消息互通的目的。

橋接帶來的問題有以下幾點:

我的建議:

Websockets協議被設計的目的是為瀏覽器提供一個全雙工的通信協議,方便實現消息推送功能。

在Websockets協議被設計出來前,受限於HTTP協議的一問一答模型,消息的推送只能靠輪詢來實現,在資源消耗與時效性保障上,均難以達到令人滿意的效果。

Websockets協議復用了HTTP協議的頭部信息,告知瀏覽器接下來的操作將觸發協議升級,然後通信雙方繼續復用HTTP的Header,但報文內容已轉變為雙方均接受的新協議的格式。

Websockets協議改進了網頁瀏覽中的消息推送的方式,因此被廣泛應用在聊天、支付通知等實時性要求比較高的場合下。

MQTT協議重點在於 消息隊列的實現,其對消息投遞的方式作出約定,並提供一些額外的通信保障

MQTT可採取原生的TCP實現,也有基於Websockets的實現版本。當然後者在網路位元組的利用率上,不如前者那麼精簡。但瀏覽器端無法直接使用TCP協議,所以就只能基於Websockets協議開發。

不過基於Websockets的應用也有方便之處:一是證書不需要額外配置,直接與網站共用一套基礎設施;二是可使用 Nginx 等工具管理流量,與普通HTTP流量可共用一套配置方法。

MQTT非常適合入門,原因如下:

實際的應用場景遠比理想中的復雜,無法一招走遍天下,必須做好取捨。

MQTT協議在這方面做得很優秀,以後工作中可以作為參考,設計好自己負責的業務系統。

Ⅳ 海為物聯雲HMI如何設置MQTT

首先需要搭建MQTT伺服器,然後搭建MySQL資料庫,然後使用海為組態寫段程序,最後配置客戶端驗證即可。具體可以參考內容 Haiwell(海為)HMI/CBOX/IPC MQTT 配置應用教程網頁鏈接

Ⅵ mqtt 伺服器如何使用設置最大發送數量

1、在這里下載Apollo伺服器,下載後解壓,然後運行apache-apollo-1.6\bin\apollo.cmd,輸入create mybroker(名字任意取,這里是根據官網介紹的來取的)創建伺服器實例,伺服器實例包含了所有的配置,運行時數據等,並且和一個伺服器進程關聯。
2、create mybroker之後會在bin目錄下生成mybroker文件夾,裡麵包含有很多信息,其中etc\apollo.xml文件下是配置伺服器信息的文件,etc\users.properties文件包含連接MQTT伺服器時用到的用戶名和密碼,後面會介紹,可以修改原始的admin=password,可以接著換行添加新的用戶名密碼。
3、打開cmd,運行…apache-apollo-1.6\bin\mybroker\bin\apollo-broker.cmd run 開啟伺服器,可以在瀏覽器中輸入http://127.0.0.1:61680/查看是否安裝成功,該界面展示了topic,連接數等很多信息。
經過上面的簡單步驟,伺服器基本上就已經完成,下一篇將介紹Android客戶端的編寫和注意事項。
客戶端使用的API,開始我使用的是mqtt-client,使用過後發現問題百出,不能很好的滿足要求,後來使用了官方推薦的Eclipse Paho,

Ⅶ 3. MQTT簡要介紹

——

[1.MQTT項目工程](https://github.com/LiamBindle/MQTT-C)

[2.MQTT API說明文檔](https://liambindle.ca/MQTT-C/group__api.html)

[3.MQTT協議中文版](https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introction.html)

MQTT是一個客戶端服務端架構的發布/訂閱模式的消息傳輸協議。它的設計思想是輕巧、開放、簡單、規范,易於實現。這些特點使得它對很多場景來說都是很好的選擇,特別是對於受限的環境如機器與機器的通信(M2M)以及物聯網環境(IoT)。

MQTT協議通過交換預定義的MQTT控制報文來通信。

報文格式: 固定包頭+可變包頭+payload。

固定包頭: 由兩個位元組組成

                byte1 高四位表示控制報文的類型,低四位表示控制報文類型的標志位。

                byte2表示剩餘長度,包括可變報頭和負載的數據。剩餘長度不包括用於編碼剩餘長度欄位本身的位元組數。

可變包頭:

                某些MQTT控制報文包含一個可變報頭部分。它在固定報頭和負載之間。可變報頭的內容根據報文類型的不同而不同。可變報頭的報文標(Packet Identifier)欄位存在於在多個類型的報文里。

有效載荷:

                對於PUBLISH來說有效載荷就是應用消息。

——1. 網路建立連接後,客戶端發送的第一個報文必須是CONNECT報文

——2. 客戶端只能發送一次CONNECT 報文,發送兩次會當作協議違規處理,並斷開連接。

——3. 有效載荷包括:客戶端唯一標識符,will主題,will消息,用戶名和密碼。

——4.可變包頭:協議名(protocol name)+協議級別(protocol level)+連接標志(connect flags)+保持連接(keep alive)。

——5. 協議名: MQTT的UTF-8編碼的字元串。(MSB+LSB +MQTT 六個位元組)

——6. 協議級別:一個位元組

——7. 連接標志:一個位元組,包含一些用於指定MQTT連接行為的參數。同時還指出有效載荷中的欄位是否存在。服務端必須驗證CONNECT控制報文的保留標志位(第0位)是否為0,如果不為0必須斷開客戶端連接。

——8. 清理會話:byte8 的bit1位標志。

        這個二進制位指定了會話狀態的處理方式。客戶端和服務端可以保存會話狀態,以支持跨網路連接的可靠消息傳輸。這個標志位用於控

       制會話狀態的生存時間。

        標志設置為0:服務端必須基於當前會話(使用客戶端標識符識別)的狀態恢復與客戶端的通信。

        標志設置為1:客戶端和服務端必須丟棄之前的任何會話並開始一個新的會話。會話僅持續和網路連接同樣長的時間。

——9. 遺囑標志 WILL FLAG: byte8的bit2位標志。

        遺囑標志(Will Flag)被設置為1,表示如果連接請求被接受了,遺囑(Will Message)消息必須被存儲在服務端並且與這個網路連接關聯。之後網路連接關閉時,服務端必須發布這個遺囑消息,除非服務端收到DISCONNECT報文時刪除了這個遺囑消息。

服務端發送CONNACK報文響應從客戶端收到的CONNECT報文。服務端發送給客戶端的第一個報文必須是CONNACK。

如果客戶端在合理的時間內沒有收到服務端的CONNACK報文,客戶端應該關閉網路連接。合理 的時間取決於應用的類型和通信基礎設施。

CONNACK報文沒有有效載荷。

PUBLISH控制報文是指從客戶端向服務端或者服務端向客戶端傳輸一個應用消息。

固定包頭:

注意byte1的bit3為重發標志DUP。

如果DUP標志被設置為0,表示這是客戶端或服務端第一次請求發送這個PUBLISH報文。如果DUP標志被設置為1,表示這可能是一個早前報文請求的重發。

服務端發送PUBLISH報文給訂閱者時,收到(入站)的PUBLISH報文的DUP標志的值不會被傳播。發送(出站)的PUBLISH報文與收到(入站)的PUBLISH報文中的DUP標志是獨立設置的,它的值必須單獨的根據發送(出站)的PUBLISH報文是否是一個重發來確定。

可變包頭:

主題名 :topic name

報文標識符 :packet identitfier。

有效載荷 :有效載荷包含將被發布的應用消息。數據的內容和格式是應用特定的。有效載荷的長度這樣計算:用固定報頭中的剩餘長度欄位的值減去可變報頭的長度。包含零長度有效載荷的PUBLISH報文是合法的。

響應:PUBLISH報文的接收者必須按照根據PUBLISH報文中的QoS等級發送響應。

PUBACK報文是對QoS 1等級的PUBLISH報文的響應。

PUBACK報文沒有有效載荷。

PUBREC報文是對QoS等級2的PUBLISH報文的響應。它是QoS 2等級協議交換的第二個報文。

PUBREC報文沒有有效載荷。

PUBREL報文是對PUBREC報文的響應。它是QoS 2等級協議交換的第三個報文。

PUBREL報文沒有有效載荷。

PUBCOMP報文是對PUBREL報文的響應。它是QoS 2等級協議交換的第四個也是最後一個報文。

PUBCOMP報文沒有有效載荷。

客戶端向服務端發送 SUBSCRIBE 報文用於創建一個或多個訂閱。每個訂閱注冊客戶端關心的一個或多個主題。為了將應用消息轉發給與那些訂閱匹配的主題,服務端發送PUBLISH報文給客戶端。SUBSCRIBE報文也(為每個訂閱)指定了最大的QoS等級,服務端根據這個發送應用消息給客戶端。

有效載荷:

SUBSCRIBE報文的有效載荷包含了一個主題過濾器列表,它們表示客戶端想要訂閱的主題。SUBSCRIBE報文的有效載荷必須包含至少一對主題過濾器 和 QoS等級欄位組合。沒有有效載荷的SUBSCRIBE報文是違反協議的。

響應:

服務端收到客戶端發送的一個SUBSCRIBE報文時,必須使用SUBACK報文響應,SUBACK報文必須和等待確認的SUBSCRIBE報文有相同的報文標識符。

服務端發送SUBACK報文給客戶端,用於確認它已收到並且正在處理SUBSCRIBE報文。SUBACK報文包含一個返回碼清單,它們指定了SUBSCRIBE請求的每個訂閱被授予的最大QoS等級。

有效載荷:

有效載荷包含一個返回碼清單。每個返回碼對應等待確認的SUBSCRIBE報文中的一個主題過濾器。返回碼的順序必須和SUBSCRIBE報文中主題過濾器的順序相同。

客戶端發送UNSUBSCRIBE報文給服務端,用於取消訂閱主題。

有效載荷 :

UNSUBSCRIBE報文的有效載荷包含客戶端想要取消訂閱的主題過濾器列表。

UNSUBSCRIBE報文中的主題過濾器必須是連續打包的、按照定義的UTF-8編碼字元串 

UNSUBSCRIBE報文的有效載荷必須至少包含一個消息過濾器。沒有有效載荷的UNSUBSCRIBE報文是違反協議的。

響應:

UNSUBSCRIBE報文提供的主題過濾器(無論是否包含通配符)必須與服務端持有的這個客 戶端的當前主題過濾器集合逐個字元比較。如果有任何過濾器完全匹配,那麼它(服務端)自己的訂閱將被刪除,否則不會有進一步的處理。

如果服務端刪除了一個訂閱:

——它必須停止分發任何新消息給這個客戶端 []。

——它必須完成分發任何已經開始往客戶端發送的QoS 1和QoS 2的消息 []。

——它可以繼續發送任何現存的准備分發給客戶端的緩存消息。

            服務端必須發送UNSUBACK報文響應客戶端的UNSUBSCRIBE請求。UNSUBACK報文必須包含和UNSUBSCRIBE報文相同的報文標識符 。即使沒有刪除任何主題訂閱,服務端也必須發送一個UNSUBACK響應 。

            如果服務端收到包含多個主題過濾器的UNSUBSCRIBE報文,它必須如同收到了一系列的多個UNSUBSCRIBE報文一樣處理那個報文,除了將它們的響應合並到一個單獨的UNSUBACK報文外。 

服務端發送UNSUBACK報文給客戶端用於確認收到UNSUBSCRIBE報文。

UNSUBACK報文沒有有效載荷。

客戶端發送PINGREQ報文給服務端的。用於:

1. 在沒有任何其它控制報文從客戶端發給服務的時,告知服務端客戶端還活著。

2. 請求服務端發送 響應確認它還活著。

3. 使用網路以確認網路連接沒有斷開。

保持連接(Keep Alive)處理中用到這個報文。

——PINGREQ報文沒有可變報頭。

——PINGREQ報文沒有有效載荷。

響應:

服務端必須發送 PINGRESP報文響應客戶端的PINGREQ報文。

服務端發送PINGRESP報文響應客戶端的PINGREQ報文。表示服務端還活著。

保持連接(Keep Alive)處理中用到這個報文。

PINGRESP報文沒有可變報頭。

PINGRESP報文沒有有效載荷。

DISCONNECT報文是客戶端發給服務端的最後一個控制報文。表示客戶端正常斷開連接。

DISCONNECT報文沒有可變報頭。

DISCONNECT報文沒有有效載荷。

響應:

客戶端發送DISCONNECT報文之後:

—— 必須關閉網路連接 [MQTT-3.14.4-1]。

——不能通過那個網路連接再發送任何控制報文。

服務端在收到DISCONNECT報文時:

——必須丟棄任何與當前連接關聯的未發布的遺囑消息。

——應該關閉網路連接,如果客戶端 還沒有這么做。

為了提供服務質量保證,客戶端和服務端有必要存儲會話狀態。在整個會話期間,客戶端和服務端都必須存儲會話狀態 。會話必須至少持續和它的活躍網路連接同樣長的時間。服務端的保留消息不是會話狀態的組成部分。服務端應該保留那種消息直到客戶端刪除它。

MQTT協議要求基礎傳輸層能夠提供有序的、可靠的、雙向傳輸(從客戶端到服務端 和從服務端到客戶端)的位元組流。

無連接的網路傳輸協議如UDP是不支持的,因為他們可能會丟失數據包或對數據包重排序。

MQTT按照這里定義的服務質量 (QoS) 等級分發應用消息。分發協議是對稱的,在下面的描述中,客戶端和服務端既可以是發送者也可以是接收者。分發協議關注的是從單個發送者到單個接收者的應用消息。服務端分發應用消息給多個客戶端時,每個客戶端獨立處理。分發給客戶端的出站應用消息和入站應用消息的QoS等級可能是不同的。

qos0:最多分發一次

qos1:至少分發一次

qos2:僅分發一次

客戶端設置清理會話(CleanSession)標志為0重連時,客戶端和服務端必須使用原始的報文標識符重發任何未確認的PUBLISH報文(如果QoS>0)和PUBREL報文 [MQTT-4.4.0-1]。這是唯一要求客戶端或服務端重發消息的情況。

服務端接管入站應用消息的所有權時,它必須將消息添加到訂閱匹配的客戶端的會話狀態。正常情況下,客戶端收到發送給它的訂閱的消息。客戶端也可能收到不是與它的訂閱精確匹配的消息。如果服務端自動給客戶端分配了一個訂閱,可能發生這種情況。正在處理UBSUBSCRIBE請求時也可能收到消息。客戶端必須按照可用的服務質量(QoS)規則確認它收到的任何PUBLISH報文,不管它選擇是否處理報文包含的應用消息 。

實現本章定義的協議流程時,客戶端必須遵循下列規則:

重發任何之前的PUBLISH報文時,必須按原始PUBLISH報文的發送順序重發(適用於QoS 1和QoS 2消息)[MQTT-4.6.0-1]。

——必須按照對應的PUBLISH報文的順序發送PUBACK報文(QoS 1消息)。

——必須按照對應的PUBLISH報文的順序發送PUBREC報文(QoS 2消息。

——必須按照對應的PUBREC報文的順序發送PUBREL報文(QoS 2消息)。

服務端必須默認認為每個主題都是有序的。它可以提供一個管理功能或其它機制,以允許將一個或多個主題當作是無序的 。

服務端處理發送給有序主題的消息時,必須按照上面的規則將消息分發給每個訂閱者。此外,它必須按照從客戶端收到的順序發送PUBLISH報文給消費者(對相同的主題和QoS)。

斜杠(『/』 U+002F)用於分割主題的每個層級,為主題名提供一個分層結構.

數字標志(『#』 U+0023)是用於匹配主題中任意層級的通配符。

加號 (『+』 U+002B) 是只能用於單個主題層級匹配的通配符。

服務端不能將 $ 字元開頭的主題名匹配通配符 (#或+) 開頭的主題過濾器.

$SYS/ 被廣泛用作包含伺服器特定信息或控制介面的主題的前綴。

應用不能使用 $ 字元開頭的主題。

訂閱 「#」 的客戶端不會收到任何發布到以 「$」 開頭主題的消息。

訂閱 「+/monitor/Clients」 的客戶端不會收到任何發布到 「$SYS/monitor/Clients」 的消息。

訂閱 「$SYS/#」 的客戶端會收到發布到以 「$SYS/」 開頭主題的消息。

訂閱 「$SYS/monitor/+」 的客戶端會收到發布到 「$SYS/monitor/Clients」 主題的消息。

如果客戶端想同時接受以 「$SYS/」 開頭主題的消息和不以 $ 開頭主題的消息,它需要同

時訂閱 「#」 和 「「$SYS/#」。

除非另有說明,如果服務端或客戶端遇到了協議違規的行為,它必須關閉傳輸這個協議違規控制報文的網路連接.

MQTT方案通常部署在不安全的通信環境中。在這種情況下,協議實現通常需要提供這些機制:

——用戶和設備身份認證

——服務端資源訪問授權

——MQTT控制報文和內嵌應用數據的完整性校驗

——MQTT控制報文和內嵌應用數據的隱私控制

作為傳輸層協議,MQTT僅關注消息傳輸,提供合適的安全功能是實現者的責任。使用TLS[RFC5246] 是比較普遍的選擇。

廣泛採用高級加密標准 [AES] 數據加密標准 [DES] 。

推薦使用為受限的低端設備特別優化過的輕量級加密國際標准 ISO 29192 [ISO29192] 。

如果MQTT在WebSocket [RFC6455] 連接上傳輸,必須滿足下面的條件:

——MQTT控制報文必須使用WebSocket二進制數據幀發送。如果收到任何其它類型的數據幀,接收者必須關閉網路連接 。

——單個WebSocket數據幀可以包含多個或者部分MQTT報文。接收者不能假設MQTT控制報文按WebSocket幀邊界對齊 。

——客戶端必須將字元串 mqtt 包含在它提供的WebSocket子協議列表裡 。

——服務端選擇和返回的WebSocket子協議名必須是  。

——用於連接客戶端和伺服器的WebSocket URI對MQTT協議沒有任何影響。

MQTT規范定義了MQTT客戶端實現和MQTT服務端實現的一致性要求

MQTT實現可以同時是MQTT客戶端和MQTT服務端。接受入站連接和建立到其它服務端的出站連接的服務端必須同時符合MQTT客戶端和MQTT服務端的要求 。

為了與任何其它的一致性實現交互操作,一致性實現不能要求使用在本規范之外定義的任何擴展 。

附錄:

控制報文類型

byte1:標志位flags:

Ⅷ Ubun安裝好MQTT之後如何配置

mqtt.fx的安裝和使用
MQTT.fx 是目前主流的mqtt客戶端,可以快速驗證是否可以與IoT Hub 服務交流發布或訂閱消息。設備將當前所處的狀態作為MQTT主題發送給IoT Hub,每個MQTT主題topic具有不同等級的名稱,如「建築/樓層/溫度。」 MQTT代理伺服器將接收到的主題topic發送給給所有訂閱的客戶端。
目前最新版下載地址(支持windows,linux,

熱點內容
跳轉頁源碼 發布:2024-09-17 03:13:05 瀏覽:543
html文件上傳表單 發布:2024-09-17 03:08:02 瀏覽:784
聊天軟體編程 發布:2024-09-17 03:00:07 瀏覽:726
linuxoracle安裝路徑 發布:2024-09-17 01:57:29 瀏覽:688
兩個安卓手機照片怎麼同步 發布:2024-09-17 01:51:53 瀏覽:207
cf編譯後沒有黑框跳出來 發布:2024-09-17 01:46:54 瀏覽:249
安卓怎麼禁用應用讀取列表 發布:2024-09-17 01:46:45 瀏覽:524
win10設密碼在哪裡 發布:2024-09-17 01:33:32 瀏覽:662
情逢敵手迅雷下載ftp 發布:2024-09-17 01:32:35 瀏覽:337
安卓如何讓軟體按照步驟自動運行 發布:2024-09-17 01:28:27 瀏覽:197