古人智慧

Just Do it!
上士聞道,勤而行之;中士聞道,若存若亡;下士聞道,大笑之。不笑,不足以爲道。
~ 道德經 41

搜尋此網誌

Translation

2016年2月11日 星期四

[Study] ESP8266 - nodemcu + MQTT study(02/xx)

ESP8266是一款具備wifi與32bit mcu的高C/P值SOC,同好們似乎拿來做IOT devices居多。
以目前IOT架構來說,MQTT是目前傳遞data最常見的protocol運用。
做個詳細記錄,避免日後忘記,也可以分享同好,剛好沾沾IOT的潮流~~

MQTT主要精神如圖所示:

為了讓學習順利,我規劃用local network的封閉環境來模擬MQTT的環境如下:
1. Topic: 由Macbook的Mosquitto來扮演broker
2. Publisher: ESP-01和Mac終端機都可以message
3. Subscriber:ESP-01和Mac終端機都可以message 

使用Mosquitto是除了open source之外,LASS也是用這個Tools來傳送sensors的message。首先,下載安裝Mosquitto,在Mac環境下建議用brew方式比較簡單容易。
直接在終端機內輸入
brew install mosquitto
確定安裝成功後,啟動Mosquitto broker。這過程卡住不少時間,主要是安裝流程中並無把moquitto的path加入,導致系統找不到moquitto程式!所以,直接在終端機輸入
/usr/local/Cellar/mosquitto/1.4.7/sbin/mosquitto 
1455180178: mosquitto version 1.4.7 (build date 2016-01-12 12:28:36-0800) starting
1455180178: Using default config.
1455180178: Opening ipv4 listen socket on port 1883.
1455180178: Opening ipv6 listen socket on port 1883.
1455180179: New connection from ::1 on port 1883.
1455180179: New client connected from ::1 as mosqsub/545-RegisdeMBP (c1, k60).
如果出現這些訊息,表示成功啟動MQTT broker,port1883。

然後,將下面的Lua code貼到ESPlorer,按“Run”讓ESP-01執行成為具備MQTT連接功能,如圖。
////////////////////////////////////////////////////

-- Connect to Wifi AP
wifi.setmode(wifi.STATION)
wifi.sta.config("myssid","mypassword")

-- init mqtt client with keepalive timer 120sec
m = mqtt.Client("notemcu", 120, "", "")

-- setup Last Will and Testament (optional)
-- Broker will publish a message with:
-- qos = 0, retain = 0, data = "offline" 
-- to topic "/lwt" if client don't send keepalive packet
m:lwt("/lwt", "offline", 0, 0)

m:on("connect", function(con) print ("connected") end)
m:on("offline", function(con) print ("offline") end)
-- on publish message receive event
m:on("message", function(conn, topic, data) 
  print(topic .. ":" ) 
  if data ~= nil then
    print("message=>", data)
  end
end)
////////////////////////////////////////////////////

接下來,即可開始測試與驗證Publisher與Subscriber的功能。
測試Macbook端:
先在Macbook開啟2個終端機,在第一個終端機擔任Subscriber,輸入
mosquitto_sub -d -t hello/world
第二個擔任Publisher,輸入
mosquitto_pub -d -t hello/world -m "from Macbook"
結果圖示:
當在Publisher輸入並按下enter後,在Subscriber立即看到“from Macbook",表示訊息成功被傳達。
測試ESP-01端:
再來,運用ESP-01發message到Moquitto broker(192.168.1.108)。
首先輸入以下Lua code到ESPloere的input box(如下圖inputbox),按下”Send“把code送到ESP-01。
每一行都必須按”Send“。
m:connect("192.168.1.108", 1883, 0)
m:publish("hello/world","from ESPlorer",0,0)
m:close()
說明:
透過port1883連接192.168.1.108的Moguitto broker。
發出title”hello/world“的message ”from ESPlorer“ 
結束這次的connection。
在Mac的終端機的Subscriber上可以看到這個message,表示ESP-01可以執行MQTT的Publisher功能。

再來測試Subscriber,
m:connect("192.168.1.108", 1883, 0)
m:subscribe("hello/world",0)
說明:
透過port1883連接192.168.1.108的Moguitto broker。
設定接收title”hello/world“的message。 

Macbook與ESP-01交互送message:
在Mac的終端機Publisher輸入
mosquitto_pub -d -t hello/world -m "from Macbook"

在ESPlorer和Mac終端機Subscriber都可以看到這message,表示ESP-01也可以接收訊息。
輪流在Mac和ESPlorer送message出來,觀察結果,很有趣!
以上是這兩天的學習,接下來要想看看ESP-01要接什麼sensors或modules來控制玩玩~~


2 則留言:

  1. 請問一下版主,如何讓esp8266過電後自動啟動MQTT,我使用的是esp-01

    回覆刪除
  2. 直接把code放到init script,就可以了

    回覆刪除