MQTT 簡介與使用

目前物聯網(IoT)有許多的服務開發,想要萬物皆連網,一張簡單的無線網卡與一個可以做中介溝通的服務器就變成是必要條件。MQTT是乎是目前蠻多人用的一個方案。這個簡介一下。

https://test.mosquitto.org/
這是一個免費的MQTT服務站。大家可以多多使用。

https://mosquitto.org/download/
下載頁中有許多作業系統可選,也有程式碼可看。

安裝完後,會有三個可用的程式

mosquitto -> MQTT server,執行後,電腦就有MQTT服務的功能。記得到mosquitto.config中更改一下設定。也要把防火牆設定好。讓MQTT的通訊可以通過。

mosquitto_pub->發佈
使用方法
mosquitto_pub -h test.mosquitto.org -t JurassicPark -m "Hello World" -P password -u username


mosquitto_sub->訂閱
使用方法
mosquitto_sub -h test.mosquitto.org -t JurassicPark -P password -u username

如果沒有使用者的設定,-P password -u username是可以省略的。指令上也頗好記。
-h 就是指host,也就是伺服器的IP或是域名。
-t 就是Topic。Topic就是一個要溝通的主題。如果我們訂閱了(如上例)JurassicPark這個主題。也就只能收到針對這個主題發佈的訊息。
-m 就是指要發佈的訊息。

補充幾個名詞


Clean session 

指client斷線時,server是否要保留client沒有收到的訊息,等client再次連線,再發佈給client。
設為1,不保留。 
設為0,保留。


QoS (Quality of Service) 

每個發佈者或是訂閱者都可以設自己的QoS。
有三個level,0,1,2
以下以發佈者跟MQTT代理人(Server)來說明。

設為0 代表發佈者送給MQTT代理人,就不管了。

設為1代表發佈者送給MQTT代理人MQTT代理人要說收到了,也就是回應一個PUBACK的訊息讓發佈者知道。

設為2,代表發佈者送給MQTT代理人MQTT代理人要說收到了,也就是回應一個PUBREC的訊息讓發佈者知道。發佈者收到PUBREC,就知道MQTT代理人已經收到,就可以拋棄目前在傳送的這個訊息。再回應MQTT代理人PUBREL,然後MQTT代理人收到PUBREL,就可以知道發送完這個訊息就可以拋棄,然後回送發佈者PUBCMP。發佈者收到PUBCMP整個發送完成。

為什麼要這麼複雜,我們可以推演幾個情形,
當QoS是0時,那個MQTT代理人有沒有收到訊息,發佈者無法知道。雖然網路科技在今天已經算是穩定,但這個穩定是建立在很多防斷的機制之下。當QoS為1時,我們可以推論,發佈者如果沒有收到PUBACK只有兩種情形,一是訊息沒送到MQTT代理人,二是MQTT代理人有收到,但回應PUBACK後,發佈者沒收到。不管如何,發佈者都要再發一次。如果是第一種情形,那MQTT代理人就只收到一次訊息。如果是二這種情形,MQTT代理人就會收到重複的訊息了。如果在網路品質不好的地方,那就可能多次收到重複的訊息。所以就需要QoS為2的方式。
在QoS為2時,我們可以推論就算是中間有斷線,還是可以保證訊息一次會傳到MQTT代理人,而且不會重複。

到底選哪一個好,這個就看每個人的應用了。像一些溫度監測,長時間的發送,QoS=0或許就夠。如果是儀器有關安全QoS=2才是最佳選擇。

Last Will and Testament  最後的遺言…

聽起來好悲傷…。這是指client斷線,是否要server發佈什麼訊息到什麼主題去。也就是說,如果有設定Last Will ,client初次連線,就要先把這個最後的遺言跟server講。

有三個Flag要設定
Will flag 
設為1就是要啟用遺言功能
設為0就是不要啟用遺言功能

Will Qos 
設定遺言的品質,同QoS

Will Retain 
設定是否把遺言留在server上。


Keep Alive timer

當client很多沒有發送訊息給Server,Server就會把client斷線,這個時間是以秒為單位。在這個時間內client會送一個PINGREQ給Server,而Server會回應一個PINGRESP給client。Server通常會等待1.5*(Keep Alive timer)的時間。如果這個時間,client沒送訊息,Server就會把client斷線。如果client有送訊息,但這一段時間後沒有收到Server的回應,client也會自己斷線。




留言

這個網誌中的熱門文章

python 找圖自動點擊

Python pyserial 抓取系統內的 COM PORT

VBA EXCEL 工作表變化 馬上執行 的作法 Worksheet_Change