1. 程式人生 > >使用nodeMCU平臺mqtt協議實現物聯網通訊

使用nodeMCU平臺mqtt協議實現物聯網通訊

國外有個哥們已經寫了一份如何使用nodeMCU平臺玩轉mqtt協議(連結請看附錄),我覺得大部分寫的已經算很清楚,不過有些點,沒提到,我碰了很多次壁,所以呢,我就基於他的文章,加上一些補充。


前言

nodeMCU, MQTT是什麼,本文就不做詳細介紹了。

一個最常見的物聯網場景:遠在家裡的硬體,要發一個資訊給我的手機。
實現方案是,硬體和手機連線同一個MQTT 代理伺服器(mqtt broker),手機根據MQTT協議,註冊一個話題A,硬體根據MQTT協議,向代理伺服器傳送話題A,附上資訊。代理伺服器,會轉發給手機,至此完成物聯網通訊。

硬體就是NodeMCU了。MQTT 代理伺服器,可以自己搭建,也可以用一些免費的(資料量大一般就要收費),比如CloudMQTT。手機嘛,我們就用很棒的MQTT測試工具:mqtt-spy代替。

框架如下:
這裡寫圖片描述

1. 搭建MQTT代理伺服器CloudMQTT

1) 到這個地址 plan,選擇Cute Cat,即免費套餐。還沒註冊的話,先註冊一下。

2) 到控制面板,建立一個instance
這裡寫圖片描述

3) 建立一個使用者和對應的密碼。mqtt-spy和nodeMCU連線CloudMQTT時要用。
本文,我們設定的使用者是nodemcu,密碼是nodemcu123
這裡寫圖片描述

4) 使用者有了,還需要設定使用者要使用什麼話題,以及使用者連線時的讀寫許可權。
這裡寫圖片描述

#號代表任意值,也就是說,以”/nodemcu/”開頭就行,後面的是什麼都不管,我伺服器都接受。
這裡在讀寫許可權全部打勾,你自己玩時,可以根據情況再定。

5)點選上圖的儲存以後,伺服器已經跑起來,可以接收MQTT的subscribe/publish了。

2. nodeMCU載入mqtt相關lua程式碼

程式碼都寫好了,在github,共4個檔案。

setup.lua: 連線wifi的模組。無需改動

app.lua : 包含application的邏輯處理。無需改動

init.lua : NodeMCU載入lua的啟動入口。無需改動

config.lua : 包含連線到MQTT server的配置資訊,包括wifi name password, MQTT server name,MQTT user name (前面設定的使用者) and password。這個就需要改了。

我這邊改好如下:

local module = {}

module.SSID = {}
module.SSID["fake360"] = "iqiyi123"

module.HOST = "m11.cloudmqtt.com"
module.PORT = 15510
module.USERNAME = "nodemcu"
module.PASSWORD = "nodemcu123"
module.ID = node.chipid()

module.ENDPOINT = "/nodemcu/"..node.chipid()
return module

其中,fake360是我的wifi SSID,iqiyi123是我的wifi密碼。
HOST和PORT分別填cloudMQTT給的值:

這裡寫圖片描述

也就是m11.cloudmqtt.com 和 15510。

USERNAME 和 PASSWORD也是剛才設定的使用者/密碼。也就是nodemcu 和 nodemcu123。


修改時要注意,別留空格,我就遇到”m11.cloudmqtt.com”的m11前面不小心加了個空格,導致DNS Failed的錯誤(其實就是找不到網址對應的實際伺服器IP)

config.lua 改好以後, 用ESPlorer把4個檔案上傳到nodeMCU,然後重啟。如果沒有意外,你將看到如下內容:
這裡寫圖片描述

記幾下Chip ID的值,後面要用。

3. 用mqtt-spy工具,測試CloudMQTT

nodeMCU的通訊,全部好了,伺服器也好了,就差另一端,手機了,不過本文不實際討論手機端app的開發,用mqtt-spy工具作為測試工具。

下載地址:https://github.com/eclipse/paho.mqtt-spy/wiki/Downloads

這是一個jar包,要用Java 8 Runtime開啟。
工具的使用guide:https://github.com/eclipse/paho.mqtt-spy/wiki/Configuration

這裡也簡要介紹一下:

1) 開啟app,點選第二個item,建立一個連線。
這裡寫圖片描述

2) 在Connectivity面板,Server URI填MQTT server的地址和埠號。Client Id自己隨便寫一個。
這裡寫圖片描述

3) 在Security面板,寫上使用者密碼,也就是nodemcu/nodemcu123
這裡寫圖片描述

4) Publications面板,填我們想要傳送給nodeMCU的話題,這裡是/nodemcu/386480/tonode。(386480就是上面獲得的Chip ID)
檢視lua程式碼就能知道,nodeMCU會向couldMQTT註冊這個話題,所以mqtt-spy傳送時,它就能接收到。
這裡寫圖片描述

5) Subscriptions面板, 寫我們要監聽的話題,這裡是/nodemcu/386480/fromnode。nodeMCU收到我們發的訊息後,也會主動發一個ping資訊回來,所以我們也得註冊了,才能收到。
這裡寫圖片描述

6) 全部寫好了,就點選Open Connection, mqtt-spy會連線cloudMQTT伺服器,連線成功,那個標籤會變綠色。
這裡寫圖片描述

7) 點選綠色TAB,可以給nodeMCU傳送訊息了。

我們就在Data欄,寫個“HELLO4”,然後點選Publish按鈕。
這裡寫圖片描述

順利的話,nodeMCU會列印如下log:

這裡寫圖片描述

至此,nodeMCU已經可以跑mqtt啦!!哈哈

稍微修改程式碼,就可以讓nodeMCU傳送任何資訊給任何聯網的模組,只要都支援MQTT協議就行!


參考文獻

1) Getting started with MQTT using nodeMCU