大家好,這裡是又發現新大陸的小編過路君子
真的運氣很好,同個關卡會掉兩種素材,機率各 50%,結果一直掉另一個小編不需要的素材......
當我們今天有一百個感測器且有一百個接收站,但是每個接收站所要接收的資料又各異,有什麼方式能讓我們快速達成任務呢?
那我們能簡單想出的方法大概是:http 或是 udp 吧。但是這時就變成要我們主動地去處理收發的問題,有點麻煩。
當只有一個工程師這樣想的時候,他會自己寫一個;當有三位工程師這樣想的時候,就會變出了一個套件,而這就是我們今天的主題 —— MQTT 協定。
那我們照慣例,在開始之前先付上小編所使用的設備、軟體規格。
小編在這裡是使用 LinkIt 7697,事實上程式碼跟 Arduino 一模一樣,基本上可以直接移植,只有接線不同而已。
但如果不是使用麵包版,是使用 Grove 模組的話,那基本上......一模一樣。
軟體名稱 | 版本或發行商 |
MQTT.fx | 1.7.1 |
LinkIt 7697 | 聯發科技 |
USB Driver | CP210x |
Arduino IDE | 1.8.19 |
PubSubClient | 2.6.0 |
Step.1 安裝 PubSubClient
因為我們在使用 MQTT 的時候會使用到第三方函式庫 PubSubClient,而該函式庫從 2.7.0 開始有使用到非標準的 C 函式庫,又由於 LinkIt 7697 實在過於老舊,所以最高只能使用到 2.6.0。
所以我們先來安裝 PubSubClient 吧!
(所有圖片點擊都可以放大、變高清)
唯一要注意的就只有不要選到 2.6.0 以後的版本就好了,這邊快速帶過。
看到上圖就代表安裝好了,可以關閉這個畫面了。
更新的按鈕雖然很誘人,但是我們不能按,各位忍住誘惑啊!
Step2. 安裝 MQTT.fx
那既然是 MQTT 就一定會有 broker、publisher 和 subscriber 這三個角色,而我們今天只會實作 publisher 和 subscriber。
所以 broker 的部分我們會使用第三方公開的,那既然是第三方的,請各位實作的時候千萬別太頻繁的送出 publish,約莫一秒一次 publish 即可,否則會被當成 DDoS 攻擊而封鎖無法使用。
請各位從下方選取或使用自己習慣的第三方 broker 網址來用吧,埠都是 1883。
1. broker.emqx.io
2. test.mosquitto.org
3. broker.hivemq.com
小編會以使用 test.mosquitto.org 來做示範,因為下方的程式碼也是使用這個網站,這樣就不需要再另外做更改。
選好了嗎?那因為我們還需要一個監控畫面來查看我們的 LinkIt 7697 是否有成功將訊息 publish 出去。
那小編在這裡使用的軟體是 MQTT.fx 1.7.1,所以我們先來下載並安裝一下。
下載點:https://www.jensd.de/wordpress/?p=2746。
然後因為小編是使用 Window 10 的,所以選倒數第二個來下載。
下載好了之後,點擊該執行檔並依照指示一直按 Next 即可。
Step3. 將溫度濕度模組接到LinkIt 7697上
因為原作者在程式碼中是將溫濕度感測器接在 D3,那小編也懶得去改,所以直接沿用。
Step4. 寫入程式並燒錄到LinkIt 7697內
相關的程式碼小編式直接找別人現成的程式碼來用,那原出處在這:ghliaw / NPTU-Shore-Course-MQTT-NodeRED。
下載下來會是一個壓縮檔,直接解壓縮即可,解壓縮完畢之後點進去應該可以發現一個「01_MQTT_DHT11」的資料夾。
再點進去,就可以看到我們要的檔案躺在裡面了喔~
基本上程式碼可以被我們拿來直接使用,我們只需要小小的修改幾處地方即可。
刪除 #include<SPI.h> 和 #include <WiFiNINA.h>,並替換成 #include <LWiFi.h>。
將 DHTTYPE 後面接的值換成我們溫濕度模組的型號,Github上的預設是 DHT11,那因為小編手上拿到的是 DHT22,所以小編在這邊改成 DHT22。
至於各位是否要更改就請自行確認手上的溫濕度模組是否是 DHT11 囉。
原作者是跟他自己的 WiFi 機做連線,所以使用的當然是他的 WiFi 登入密碼。
所以我們要換成我們自己本身的 WiFI 名稱(ssid)和密碼(password)。
對於 broker 來說,client_id 是唯一的,當今天有第二個相同 ID 的使用者連線進來時,broker 會自動踢掉先加入的那位,留下後加入的那位。
那畢竟此程式碼是公開的,所以如果不修改有可能會被不知名的人士踢掉,所以我們修改一下,值無所謂,只要不跟其他人重複即可。
這邊也是怕有人跟我們同時使用此程式碼,造成我們的資料相互汙染,所以將最前面的「ghliaw」改成隨便的一個字串即可。
至此,程式碼準備工作結束,可以直接燒錄了。
Step5. 設定 MQTT.fx
進入設定介面。
MQTT.fx 有提供產生隨機 ID 的功能,那我們就給他產生一下,千萬別用預設值,要不不知道什麼時候就會被不明人士踢掉。
當我們將這一切都準備好之後,就可以讓 MQTT.fx 正式的跟公開公用的 broker 來取得連線。
接下來就是要來 Subscribe 主題了。
剛剛在更改程式碼的時候,有一部分是要將「ghliaw」改成我們自己喜歡的字串,那這邊的 xxx 也是。
Step 6. 啟動 LinkIt 7697 的 MQTT 服務
只要將序列埠監控視窗打開即可。
從 WiFi 連線上到感應器送出第一條訊息的這段時間,大約十秒,所以如果接下來沒訊息並不是出錯,給他一點時間。
實際收到訊息的效果如上圖,其中的 temp 就是溫度,而 hum 則是濕度,各位可以比較看看是否跟序列埠監控視窗上的數值一致呢。
Step 7. 使用 MQTT 控制 LinkIt 7697 上的 LED
此程式碼的作者並非僅有提供單向的傳輸,也提供了讓 LinkIt 7697 去 Subscribe 某一主題,並針對該主題去執行相對應的動作。
各位有沒有發現原本是熄滅的內建 LED 燈泡亮起來了呢?原作者提供了三種操作方式:
0 | 1 | 2 |
關閉 LED 燈 | 開啟 LED 燈 | 使 LED 燈閃爍 |
除此之外也可以偷偷回去看一眼序列埠監控視窗喔。
至此,全部結束!
原作者寫的這個小小的範例基本上就包含了所有 MQTT Client 的行為,只要稍稍修改,便可以拿來玩出很多花樣。
例如:裝一個接著馬達的 LinkIt 7697 在電燈開關旁邊,使用 MQTT Publish 指令出去讓他自動敲擊電燈開關,這樣晚上躺在床上要關燈時就方便很多了。
後記
寫 Windows 系統的文章圖片都一堆,寫 Linux 系統的文章程式碼都一堆。