[網絡篇]ESP8266-NonOS學習筆記(七)之物聯網標配MQTT初相識
恭祝各位豬年大吉,今天是大年初一,放假回家四五天了,講真的擱家比上班還累。。。今夜得閑覺得不能把時間浪費掉,得活躍活躍腦袋瓜,這幾天在家喝酒喝的感覺都變笨了。
閑話少說,還是進入正題吧,對於MQTT可以這麽說吧,但凡你對物聯網有所了解相信你肯定沒有沒聽過MQTT這幾個字,但是未必有過深入的了解,那麽我們在本片文章中一起來回顧一下。
不知道各位去學習新知識的時候是怎麽開始的,我個人是比較喜好先去官方了解一下,如果沒有官網我會嘗試先看一下百科,然後再就是博客園中大神寫的文章,個人感覺官網是最官方的,因為百科詞條跟博文可能不會跟官網的信息實時同步,所以我們先去官網看一下,戳卡片,官網並沒有太多內容,但已經把我們想要了解的都寫出來了,大家可以先看一下:
MQTT
MQTT stands for MQ Telemetry Transport. It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks. The design principles are to minimise network bandwidth and device resource requirements whilst also attempting to ensure reliability and some degree of assurance of delivery. These principles also turn out to make the protocol ideal of the emerging “machine-to-machine” (M2M) or “Internet of Things” world of connected devices, and for mobile applications where bandwidth and battery power are at a premium.
上面這段英文就是對MQTT最好的介紹,如果還覺得長,那我們可以從這簡短的文字中提取出有用的關鍵字:
- protocol
- machine-to-machine(M2M)
- Internet of Things(IoT)
可以看出這是一個通訊協議,主要應用M2M和IoT領域,所以如果你從事物聯網相關的行業,對這個協議就要有所了解了,這是目前個人感覺智能設備(手機、智能音響)與智能終端設備(燈、加濕器、窗簾等)之間交互比較好用的協議,是對硬件和網絡都要求不高的通訊協議,就目前而言這也是業內大多數大廠也在使用的通訊協議,所以對其了解與熟練使用也是很有必要的。
MQTT最早由IBM發布,目前作為一個Eclipse Paho開源項目,由Eclipse團隊維護,最新版本是5.0,我們先看一下幾個版本的各種語言支持情況:
這裏只列舉了三個版本,主要原因是3.1.1是MQTT的第一個OASIS標準版本,3.1版本應該是目前使用最廣泛的版本,5.0版本是最新版本:
MQTT and MQTT-SN software
特性:
MQTT是客戶端服務器發布/訂閱消息傳輸協議。它重量輕,開放,簡單,易於實現。這些特性使其非常適合在許多情況下使用,包括受限制的環境,例如機器到機器(M2M)和物聯網(IoT)環境中的通信,其中需要小的代碼占用空間和/或網絡帶寬非常寶貴。
- 該協議通過TCP / IP或其他提供有序,無損,雙向連接的網絡協議運行。
- 使用發布/訂閱消息模式,該模式提供一對多消息分發和應用程序的分離。
- 與有效負載內容無關的消息傳輸。
消息傳遞的三種服務質量:
- “最多一次”,根據操作環境的最佳努力傳遞消息。可能會發生消息丟失。例如,該水平可以用於環境傳感器數據,其中如果某個讀數丟失無關緊要,因為下一個讀數將很快發布。
- “至少一次”,確保消息到達但可能發生重復。
- “完全一次”,確保消息準確到達一次。例如,此級別可用於計費系統,其中重復或丟失的消息可能導致應用不正確的費用。
網絡開銷小和斷線機制:
- 最小化傳輸開銷和協議交換,以減少網絡流量。
- 發生異常斷線時通知相關方的機制。
更多相關內容可以戳下面卡片:
MQTT Version V5.0
關於MQTT的一些基礎知識我們就先了解到這裏,可能沒有接觸過的同學對這個協議還是有一點迷茫,對兩個設備之間如果建立起通信是有點比較好奇的,我簡單一說可能你就懂了,在這個通信協議中必不可少的一個環節就是有一臺消息服務器,前面特性當中也有說:MQTT是客戶端服務器發布/訂閱消息傳輸協議。其實兩臺設備之間的消息都是經由消息服務器轉發的,前面特性中也說過:該協議通過TCP / IP或其他提供有序,無損,雙向連接的網絡協議運行。所以MQTT是在TCP/IP協議之上的,所以兩個設備如果沒在一個局域網中是很難建立起TCP連接的,所以消息服務器就顯得很重要了,整個通訊架構簡圖如下:
設備1想跟設備2打個招呼:hi,這條消息是需要經由消息服務器轉發的,因為從整個網絡來看,消息服務器是可以部署在公網當中的,也就是有唯一的IP地址,但是兩個設備基本是不太可能有固定IP的,但是MQTT是在TCP協議之上的,這也就意味著我們必須要有某一個固定的IP去監聽消息,所以這條消息就在消息服務器監聽到後會轉發給設備2,那麽到這裏你可能又會想問,消息服務器為什麽會知道要轉發給設備2呢?其實,這裏說轉發給某一個設備是不對的,因為MQTT采用的是主題機制,這裏我們可以先將主題理解成為每一條消息所跟的一個屬性,這個屬性會決定到哪些設備可以接收到,哪些設備接收不到消息,比如下圖:
其中設備1以主題:/topic1,發送了一條消息:hi,由於這個主題只被設備2訂閱了,所以只有設備2接收到了該消息,但是設備2以主題:/topic2,發送了一條消息:hello world,由於這個主題被設備1和設備3同時訂閱了,所以,這條消息會被設備1跟設備3都接收到,這就是主題在這裏面起的作用,後面我們會在代碼中更加具體的了解什麽是主題,這裏只是以一種比較抽象的說法讓大家先了解一下。
關於MQTT的一些基礎知識先寫到這,主要是先對其有一定了解,後面預計還會有兩篇,一篇是如何在電腦(ubuntu)上搭建環境本機測試,另一篇是如何在ESP8266上利用MQTT,實現手機點燈?
[網絡篇]ESP8266-NonOS學習筆記(七)之物聯網標配MQTT初相識