若該文為原創文章,未經允許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106539703
各位讀者,知識無窮而人力有窮,要么改需求,要么找專業人士,要么自己研究
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中…(點擊傳送門)
業務需求,需要使用到mqtt協議(中間件)。
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發布。MQTT最大優點在於,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
- 精簡,不添加可有可無的功能;
- 發布/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞;
- 允許用戶動態創建主題,零運維成本;
- 把傳輸量降到最低以提高傳輸效率;
- 把低帶寬、高延遲、不穩定的網絡等因素考慮在內;
- 支持連續的會話控制;
- 理解客戶端計算能力可能很低;
- 提供服務質量管理;
- 假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。
- 使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合
這一點很類似於XMPP,但是MQTT的信息冗余遠小於XMPP,,因為XMPP使用XML格式文本來傳遞數據。 - 對負載內容屏蔽的消息傳輸
- 使用TCP/IP提供網絡連接
主流的MQTT是基於TCP連接進行數據推送的,但是同樣有基於UDP的版本,叫做MQTT-SN。這兩種版本由於基於不同的連接方式,優缺點自然也就各有不同了。 - 有三種消息發布服務質量
"至多一次",消息發布完全依賴底層TCP/IP網絡。會發生消息丟失或重復。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。這一種方式主要普通APP的推送,倘若你的智能設備在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。
"至少一次",確保消息到達,但消息重復可能會發生。
"只有一次",確保消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。在計費系統中,消息重復或丟失會導致不正確的結果。這種最高質量的消息發布服務還可以用於即時通訊類的APP的推送,確保用戶收到且只會收到一次。 - 小型傳輸,開銷小
(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。非常適合"在物聯網領域,傳感器與服務器的通信,信息的收集",嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了。 - 客戶端異常中斷的機制。
Last Will:即遺言機制,用於通知同一主題下的其他設備發送遺言的設備已經斷開了連接。
Testament:遺囑機制,功能類似於Last Will。
MQTT是一個基於客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用范圍非常廣泛。 在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。
從圖上MQTT有三種角色的存在:
- Broker代理:很多人理解為中間件,當然可以這樣子認為。他就是一個中間件。用於處理信息並發送到相應的訂閱者。
- 發布者:用於發布信息到代理上面。注意:發布者也可以是訂閱者。
- 訂閱者:就是用於接受信息的客戶端。
MQTT服務器以稱為"消息代理"(Broker),可以是一個應用程序或一台設備。它是位於消息發布者和訂閱者之間,它可以:
- 接受來自客戶的網絡連接;
- 接受客戶發布的應用信息;
- 處理來自客戶端的訂閱和退訂請求;
- 向訂閱的客戶轉發應用程序消息。
MQTT協議中定義了一些方法(也被稱為動作),來於表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態生成數據,這取決於服務器的實現。通常來說,資源指服務器上的文件或輸出。主要方法有:
- Connect:等待與服務器建立連接
- Disconnect:等待MQTT客戶端完成所作的工作,並於服務器斷開TCP/IP會話
- Subscribe:等待完成訂閱
- UnSubscribe:等待服務器取消客戶端的一個活多個和topics訂閱
- Publish:MQTT客戶端發送消息請求,發送完成后返回應用程序線程
官方下載地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html
CSDN下載地址:https://download.csdn.net/download/qq21497936/11214604
下載系統對應的版本,windows x64位
添加java路徑到系統Path變量
JAVA_HOME
C:\Program Files\Java\jdk-12.0.1
PATH(最后面加上)
;%JAVA_HOME%\bin\
加粗樣式CLASSPATH
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
使用cmd運行java命名,jdk環境配置成功,如下圖:
將Apache Apoll解壓到C盤下(自定義),如下圖:
\
使用cmd進入該文件夾創建實例:
cd C:\apache-activemq-5.15.9
cd bin
activemq-admin.bat create mybroker
進入mybroker/conf,查看users.properties,可以看到用戶名
查看tcp監聽端口(可自行修改,筆者不修改)
查看web管理頁面端口(可自行修改,筆者不修改)
cd C:\apache-activemq-5.15.9\bin\mybroker\bin
mybroker.bat start
至此windows server2008 r2系統上的apache apoll中間件環境以及服務成功搭建完成。
客戶端遇到協議違規,因此關閉了連接。
錯誤
檢查服務器報錯
原因
ActiveMQ有時會報類似Frame size of 257 MB larger than max allowed 100 MB的錯誤,意思是單條消息超過了預設的最大值,在配置文件中
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?
maximumConnections=1000&wireFormat.maxFrameSize=1048576000"/>
我們可以配置這個值,但是有時會突然出現很大的單條消息,比如1G。
分析
QtMqtt與服務連接,傳過去的屬性最大值可能是258MB,所以直接修改服務器配置。
解決方法
重啟服務