在linux搭建mqtt伺服器搭建
① 寮鍙慚QTT鎶奻reeRTOS閲岀殑MQTT浠g爜閫昏緫縐誨埌linux閲屽嚭鐜伴棶棰橈紵
灝哅QTT浠g爜閫昏緫浠嶧reeRTOS杞縐誨埌Linux涓鍙鑳戒細鍑虹幇涓浜涢棶棰橈紝鍥犱負涓や釜鎿嶄綔緋葷粺鐨勫簳灞傛灦鏋勫拰緙栫▼鎺ュ彛鍙鑳藉瓨鍦ㄥ樊寮傘傚湪縐繪嶈繃紼嬩腑錛岄渶瑕佺『淇滿QTT浠g爜鍦↙inux鐜澧冧腑姝g『緙栬瘧鍜岄摼鎺ワ紝騫朵笖鑳藉熶笌鍏朵粬妯″潡鍗忓悓宸ヤ綔銆
涓轟簡鍑忓皯縐繪嶈繃紼嬩腑鍙鑳藉嚭鐜扮殑闂棰橈紝寤鴻鍦ㄧЩ妞嶅墠浠旂粏闃呰籑QTT鐨勫畼鏂規枃妗e拰紺轟緥浠g爜錛屽苟鍦ㄧЩ妞嶈繃紼嬩腑浠旂粏嫻嬭瘯鍜岃皟璇曚唬鐮併傛ゅ栵紝榪樺彲浠ュ弬鑰冨叾浠栧紑鍙戣呯殑緇忛獙鍜屽緩璁錛屼互甯鍔╃『淇濈Щ妞嶇殑欏哄埄榪涜屻
② 如何通過php實現mqtt協議
MQTT是一個輕量級的消息發布/訂閱協議,它是實現基於手機客戶端的消息推送伺服器的理想解決方案。
我們可以從這里下載該項目的實例代碼,並且可以找到一個採用PHP書寫的伺服器端實現。
架構如下所示:
③ 【內部分享】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,為什麼手機連接不上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的報文。
⑥ MQTT簡單介紹
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上。好比你給好友發送一封電子郵件,發送完成後你可以去做別的事情,收件人也不必立刻響應,可以在自己有空的時候查看郵件,是一個典型的非同步發布/訂閱場景。而另一種典型的同步請求/回答場景,可以用接打電話的場景來類比。
MQTT的設計遵循以下的原則:
為了滿足不同的場景,MQTT支持三種不同級別的服務質量(Quality of Service,QoS)為不同場景提供消息可靠性:
MQTT擁有14種不同的消息類型:
實現MQTT協議需要客戶端和伺服器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(伺服器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是伺服器,消息發布者可以同時是訂閱者。
MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分:
MQTT會構建底層網路傳輸:它將建立客戶端到伺服器的連接,提供兩者之間的一個有序的、無損的、基於位元組流的雙向傳輸。
當應用數據通過MQTT網路發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關連。
一個使用MQTT協議的應用程序或者設備,它總是建立到伺服器的網路連接。客戶端可以:
MQTT伺服器以稱為"消息代理"(Broker),可以是一個應用程序或一台設備。它是位於消息發布者和訂閱者之間,它可以:
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
每個客戶端與伺服器建立連接後就是一個會話,客戶端和伺服器之間有狀態交互。會話存在於一個網路之間,也可能在客戶端和伺服器之間跨越多個連續的網路連接。
連接到一個應用程序消息的標簽,該標簽與伺服器的訂閱相匹配。伺服器會將消息發送給訂閱所匹配標簽的每個客戶端。
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
消息訂閱者所具體接收的內容。
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,