牟曉東
我們在開發(fā)開源硬件涉及到物聯(lián)網(wǎng)應(yīng)用項(xiàng)目時(shí),會用到一種為連接遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠消息服務(wù)的MQTT(Message Queuing Telemetry Transport)協(xié)議,即“消息隊(duì)列遙測傳輸協(xié)議”。這是一種基于“客戶端-服務(wù)器”的“消息發(fā)布與訂閱”式即時(shí)通訊協(xié)議,開銷較小且占用的網(wǎng)絡(luò)帶寬也較低,非常適合進(jìn)行物聯(lián)網(wǎng)創(chuàng)客項(xiàng)目的實(shí)施。比如我們來制作一個(gè)利用掌控板遠(yuǎn)控樹莓派LED燈陣的項(xiàng)目,通過對掌控板的A、B鍵按下和搖晃掌控板三種動作,遠(yuǎn)程觸發(fā)樹莓派上的LED燈陣發(fā)光、熄滅和流水閃爍效果。
將掌控板通過數(shù)據(jù)線與電腦USB接口連接,運(yùn)行mPython X,登錄成功后進(jìn)行程序的編寫。
首先設(shè)置網(wǎng)絡(luò)的連接,分別填寫好WiFi名稱和密碼;接著從“物聯(lián)網(wǎng)”-“MQTT”中選擇第一個(gè)MQTT模塊,客戶端“client_id”的內(nèi)容設(shè)置為“l(fā)uke007”,這是樹莓派的古德微機(jī)器人網(wǎng)站登錄賬號名稱;服務(wù)器“server”的內(nèi)容設(shè)置為古德微機(jī)器人網(wǎng)站的“www.gdwrobot.top”;下方的“user”和“password”保持為空,“keepalive”也保持默認(rèn)的“30”不變;然后添加一個(gè)“連接MQTT”模塊,作用是根據(jù)上方的參數(shù)設(shè)置模塊與對應(yīng)的服務(wù)器進(jìn)行MQTT連接;接著,使用“顯示”區(qū)域中的“OLED顯示清空”“OLED第1行顯示……”和“OLED顯示生效”三個(gè)模塊,控制掌控板的OLED顯示屏輸出提示信息:“MQTT連接成功!”(如圖1)。
以按下掌控板的A鍵為例,先從“事件”區(qū)域中選擇第一個(gè)“當(dāng)按鍵A被按下時(shí)執(zhí)行”,再從“MQTT”中選擇“發(fā)布……至主題……”,分別輸入“ON”(注意大寫)和“l(fā)uke007/KeyA”,作為按鍵A被按下時(shí)觸發(fā)的第一個(gè)動作:向樹莓派賬號luke007發(fā)送主題為“KeyA”的消息,其值為“ON”;然后,添加一個(gè)0.5秒的等待語句。同理,再設(shè)置按鍵B被按下時(shí)觸發(fā)“發(fā)布‘ON至主題‘luke007/KeyB”;當(dāng)掌控板檢測到“被搖晃”的動作發(fā)生時(shí),觸發(fā)“發(fā)布‘ON至主題‘luke007/Shaking”(如圖2)。
在瀏覽器中訪問古德微機(jī)器人網(wǎng)站,登錄賬號luke007后開始進(jìn)行“積木”編程:
第一, 從左側(cè)“物聯(lián)網(wǎng)”-“常用”中選擇“設(shè)置物聯(lián)網(wǎng)服務(wù)器”,保持服務(wù)器“www.gdwrobot.top”和端口號“1883”默認(rèn)不變,用戶名和密碼保持為空;接著使用一條輸出調(diào)試信息,內(nèi)容為“開始監(jiān)聽掌控板傳來的消息:”,作為程序運(yùn)行的提示信息。
第二, 是三個(gè)監(jiān)聽主題語句(無先后次序),監(jiān)聽的主題為“KeyA”、“KeyB”和“Shaking”,分別對應(yīng)掌控板的按鍵A、按鍵B和搖晃動作所觸發(fā)的消息主題。
第三, 從“線程”中添加三個(gè)子線程,同樣也是不分先后次序,線程函數(shù)名分別為“ListenKeyA”、“ListenKeyB”和“ListenShake”,分別對應(yīng)監(jiān)聽掌控板三個(gè)動作消息后進(jìn)行調(diào)用對應(yīng)同名的函數(shù)(如圖3)。
以函數(shù)“ListenKeyA”為例,外層的“如果……執(zhí)行……”條件分支對“物聯(lián)網(wǎng)是否收到新數(shù)據(jù)”進(jìn)行判斷,條件成立的話則對變量“A鍵”進(jìn)行賦值,其值為“獲取主題‘KeyA的數(shù)據(jù)”;接著輸出調(diào)試信息“收到掌控板A鍵消息!”,表示已經(jīng)收到了掌控板按鍵A的動作消息;然后再用內(nèi)層“如果……執(zhí)行……”條件分支對“‘A鍵的值是否為‘ON”進(jìn)行判斷,條件成立,說明掌控板的A鍵已經(jīng)被按下,于是調(diào)用“LED_ON”函數(shù)(如圖4),執(zhí)行由5、6、12和16四支LED所組成的燈陣全部發(fā)光的動作(如圖5);最后的0.1秒等待語句,作用仍然是防止程序過多占用系統(tǒng)資源。
與此類似,函數(shù)“ListenKeyB”和“ListenShake”是用來監(jiān)聽掌控板按鍵B是否被按下和整個(gè)掌控板是否被搖晃兩個(gè)動作的(如圖6),條件成立則分別調(diào)用“LED_OFF”和“LED_Water”函數(shù),前者是熄滅LED燈陣,后者則是循環(huán)點(diǎn)亮和熄滅燈陣,效果類似于流水燈(如圖7)。
返回mPython X界面,點(diǎn)擊“刷入運(yùn)行”按鈕,將程序代碼寫入掌控板(稍候,右下角會有“刷入成功”、連接WiFi:“Connection WiFi……”的提示),掌控板顯示屏的第一行會顯示出“MQTT連接成功!”;在古德微機(jī)器人平臺先點(diǎn)擊“連接設(shè)備”,然后點(diǎn)擊“運(yùn)行”按鈕,LOG調(diào)試信息區(qū)會顯示提示信息:“開始監(jiān)聽掌控板傳來的消息:”。
此時(shí),嘗試輕輕按下掌控板的A鍵,樹莓派的LED燈陣就會亮起(LOG調(diào)試信息提示:“收到掌控板A鍵消息!”);輕輕按下B鍵,樹莓派的LED燈陣就會熄滅(LOG調(diào)試信息提示:“收到掌控板B鍵消息!”);如果搖晃掌控板的話,樹莓派的LED燈陣就會出現(xiàn)流水燈效果(LOG調(diào)試信息提示:“收到掌控板晃動消息!”)。如果多次測試無問題,就說明我們實(shí)現(xiàn)了掌控板遠(yuǎn)控樹莓派LED燈陣進(jìn)行開、關(guān)燈和流水燈的目標(biāo)(如圖8),大家不妨一試。