天天看點

MQTT入門級簡單介紹與使用

1.什麼是MQTT

2.MQTT協定實作方式

一.什麼是MQTT

什麼是快樂星球。。不對。。什麼是MQTT

       MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協定),是一種基于釋出/訂閱(publish/subscribe)模式的輕量級協定,該協定建構于TCP/IP協定之上,MQTT最大優點在于,可以以極少的代碼和有限的帶寬,為連接配接遠端裝置提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協定,使其在物聯網、小型裝置、移動應用等方面有較廣泛的應用。

  MQTT是一個基于用戶端-伺服器的消息釋出/訂閱傳輸協定。MQTT協定是輕量、簡單、開放和易于實作的,這些特點使它适用範圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鍊路通信傳感器、偶爾撥号的醫療裝置、智能家居、及一些小型化裝置中已廣泛使用。  

  • (1)使用釋出/訂閱消息模式,提供一對多的消息釋出,解除應用程式耦合。

    這一點很類似于XMPP,但是MQTT的資訊備援遠小于XMPP,,因為XMPP使用XML格式文本來傳遞資料。

  • (2)對負載内容屏蔽的消息傳輸。
  • (3)使用TCP/IP提供網絡連接配接。

    主流的MQTT是基于TCP連接配接進行資料推送的,但是同樣有基于UDP的版本,叫做MQTT-SN。這兩種版本由于基于不同的連接配接方式,優缺點自然也就各有不同了。

  • (4)有三種消息釋出服務品質:

    "至多一次",消息釋出完全依賴底層TCP/IP網絡。會發生消息丢失或重複。這一級别可用于如下情況,環境傳感器資料,丢失一次讀記錄無所謂,因為不久後還會有第二次發送。這一種方式主要普通APP的推送,倘若你的智能裝置在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。

    "至少一次",確定消息到達,但消息重複可能會發生。

    "隻有一次",確定消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級别。在計費系統中,消息重複或丢失會導緻不正确的結果。這種最高品質的消息釋出服務還可以用于即時通訊類的APP的推送,確定使用者收到且隻會收到一次。

  • (5)小型傳輸,開銷很小(固定長度的頭部是2位元組),協定交換最小化,以降低網絡流量。

    這就是為什麼在介紹裡說它非常适合"在物聯網領域,傳感器與伺服器的通信,資訊的收集",要知道嵌入式裝置的運算能力和帶寬都相對薄弱,使用這種協定來傳遞消息再适合不過了。

  • (6)使用Last Will和Testament特性通知有關各方用戶端異常中斷的機制。

    Last Will:即遺言機制,用于通知同一主題下的其他裝置發送遺言的裝置已經斷開了連接配接。

    Testament:遺囑機制,功能類似于Last Will。

 二.MQTT的實作方式

實作MQTT協定需要用戶端和伺服器端通訊完成,在通訊過程中,MQTT協定中有三種身份:釋出者(Publish)、代理(Broker)(伺服器)、訂閱者(Subscribe)。其中,消息的釋出者和訂閱者都是用戶端,消息代理是伺服器,消息釋出者可以同時是訂閱者。

MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分:

  • (1)Topic,可以了解為消息的類型,訂閱者訂閱(Subscribe)後,就會收到該主題的消息内容(payload);
  • (2)payload,可以了解為消息的内容,是指訂閱者具體要使用的内容。

 三.我經常看到有人說用MQTT來做im

我之前有做IM的,後來換地方是以面試也有被面到過MQTT是以也就一臉懵逼

當時用的是netty做的單體伺服器,都知道單台服務正在websockt長連接配接是沒辦法持久化到redis裡面的,是以也就把長連接配接對象儲存在map裡面,就存儲量有限,單體伺服器就沒辦法承載下來這麼多,負載均衡呢,map對象又沒辦法共享出去

是以我當時就想到mq,伺服器之間互相訂閱,我使用者注冊的時候1~100000在第一台伺服器上,100001~200000在第二台伺服器上,設定好使用者的身份辨別,消息發個某個使用者,消息--》伺服器--》根據辨別--》MQ--》對應的伺服器--》使用者  

流程感覺也是可以的  也就是說,我當時并沒有用到mqtt,用到了mq

   後來我就去了解了一下mqtt,才發現用他來實作im簡直可以不用寫代碼,當然我當時幹im有很多地方都有控制到,是以不寫代碼是做夢

好了,直接拿mqtt幹貨

    我自己架設了rabbitMQ與activeMQ 兩種來內建mqtt

這兩種mq環境的搭建我就不說了

       rabbitMQ 要開起mqtt 在它的sbin目錄下用指令執行 

rabbitmq-plugins enable rabbitmq_mqtt
           

當然也有web的mqtt

rabbitmq-plugins enable rabbitmq_web_mqtt
           
MQTT入門級簡單介紹與使用
MQTT入門級簡單介紹與使用

 如果需要自己的mqtt在其它ip上也能通路,當然也有通過指令來的,但是有界面可以操作為啥要用指令,對吧,哈哈哈

MQTT入門級簡單介紹與使用

 然後就給這個使用者配置設定權限

MQTT入門級簡單介紹與使用

 好了我們現在直接用MQTTBox來測試一下

MQTT入門級簡單介紹與使用
MQTT入門級簡單介紹與使用

你可以根據你現有的設定

這個說明已經連接配接上了

MQTT入門級簡單介紹與使用
MQTT入門級簡單介紹與使用

這樣就ok了,然你會發現,消息能發了

activeMQ怎麼來實作MQTT  呢?

這就更簡單了

直接啟動activeMQ

MQTT入門級簡單介紹與使用

然後我們直接通路 http://127.0.0.1:8161/   admin/admin

MQTT入門級簡單介紹與使用

發現它直接支援了mqtt,好了一樣的通過MQTTBox測試

MQTT入門級簡單介紹與使用

完美   打完ok