牟曉東
我們在開發開源硬件涉及到物聯網應用項目時,會用到一種為連接遠程設備提供實時可靠消息服務的MQTT(Message Queuing Telemetry Transport)協議,即“消息隊列遙測傳輸協議”。這是一種基于“客戶端-服務器”的“消息發布與訂閱”式即時通訊協議,開銷較小且占用的網絡帶寬也較低,非常適合進行物聯網創客項目的實施。比如我們來制作一個利用掌控板遠控樹莓派LED燈陣的項目,通過對掌控板的A、B鍵按下和搖晃掌控板三種動作,遠程觸發樹莓派上的LED燈陣發光、熄滅和流水閃爍效果。
將掌控板通過數據線與電腦USB接口連接,運行mPython X,登錄成功后進行程序的編寫。
首先設置網絡的連接,分別填寫好WiFi名稱和密碼;接著從“物聯網”-“MQTT”中選擇第一個MQTT模塊,客戶端“client_id”的內容設置為“luke007”,這是樹莓派的古德微機器人網站登錄賬號名稱;服務器“server”的內容設置為古德微機器人網站的“www.gdwrobot.top”;下方的“user”和“password”保持為空,“keepalive”也保持默認的“30”不變;然后添加一個“連接MQTT”模塊,作用是根據上方的參數設置模塊與對應的服務器進行MQTT連接;接著,使用“顯示”區域中的“OLED顯示清空”“OLED第1行顯示……”和“OLED顯示生效”三個模塊,控制掌控板的OLED顯示屏輸出提示信息:“MQTT連接成功!”(如圖1)。

以按下掌控板的A鍵為例,先從“事件”區域中選擇第一個“當按鍵A被按下時執行”,再從“MQTT”中選擇“發布……至主題……”,分別輸入“ON”(注意大寫)和“luke007/KeyA”,作為按鍵A被按下時觸發的第一個動作:向樹莓派賬號luke007發送主題為“KeyA”的消息,其值為“ON”;然后,添加一個0.5秒的等待語句。同理,再設置按鍵B被按下時觸發“發布‘ON至主題‘luke007/KeyB”;當掌控板檢測到“被搖晃”的動作發生時,觸發“發布‘ON至主題‘luke007/Shaking”(如圖2)。

在瀏覽器中訪問古德微機器人網站,登錄賬號luke007后開始進行“積木”編程:
第一, 從左側“物聯網”-“常用”中選擇“設置物聯網服務器”,保持服務器“www.gdwrobot.top”和端口號“1883”默認不變,用戶名和密碼保持為空;接著使用一條輸出調試信息,內容為“開始監聽掌控板傳來的消息:”,作為程序運行的提示信息。
第二, 是三個監聽主題語句(無先后次序),監聽的主題為“KeyA”、“KeyB”和“Shaking”,分別對應掌控板的按鍵A、按鍵B和搖晃動作所觸發的消息主題。
第三, 從“線程”中添加三個子線程,同樣也是不分先后次序,線程函數名分別為“ListenKeyA”、“ListenKeyB”和“ListenShake”,分別對應監聽掌控板三個動作消息后進行調用對應同名的函數(如圖3)。

以函數“ListenKeyA”為例,外層的“如果……執行……”條件分支對“物聯網是否收到新數據”進行判斷,條件成立的話則對變量“A鍵”進行賦值,其值為“獲取主題‘KeyA的數據”;接著輸出調試信息“收到掌控板A鍵消息!”,表示已經收到了掌控板按鍵A的動作消息;然后再用內層“如果……執行……”條件分支對“‘A鍵的值是否為‘ON”進行判斷,條件成立,說明掌控板的A鍵已經被按下,于是調用“LED_ON”函數(如圖4),執行由5、6、12和16四支LED所組成的燈陣全部發光的動作(如圖5);最后的0.1秒等待語句,作用仍然是防止程序過多占用系統資源。



與此類似,函數“ListenKeyB”和“ListenShake”是用來監聽掌控板按鍵B是否被按下和整個掌控板是否被搖晃兩個動作的(如圖6),條件成立則分別調用“LED_OFF”和“LED_Water”函數,前者是熄滅LED燈陣,后者則是循環點亮和熄滅燈陣,效果類似于流水燈(如圖7)。

返回mPython X界面,點擊“刷入運行”按鈕,將程序代碼寫入掌控板(稍候,右下角會有“刷入成功”、連接WiFi:“Connection WiFi……”的提示),掌控板顯示屏的第一行會顯示出“MQTT連接成功!”;在古德微機器人平臺先點擊“連接設備”,然后點擊“運行”按鈕,LOG調試信息區會顯示提示信息:“開始監聽掌控板傳來的消息:”。
此時,嘗試輕輕按下掌控板的A鍵,樹莓派的LED燈陣就會亮起(LOG調試信息提示:“收到掌控板A鍵消息!”);輕輕按下B鍵,樹莓派的LED燈陣就會熄滅(LOG調試信息提示:“收到掌控板B鍵消息!”);如果搖晃掌控板的話,樹莓派的LED燈陣就會出現流水燈效果(LOG調試信息提示:“收到掌控板晃動消息!”)。如果多次測試無問題,就說明我們實現了掌控板遠控樹莓派LED燈陣進行開、關燈和流水燈的目標(如圖8),大家不妨一試。
