NodeMCU 的文檔裡面終於發現,ESP8266 的GPIO 2 確實是 PIN 4,GPIO 0 是 PIN 3。 https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_cn 話說,這個 API 不是給地球人看的。按照說明,ne...
NodeMCU 的文檔裡面終於發現,ESP8266 的GPIO 2 確實是 PIN 4,GPIO 0 是 PIN 3。
https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_cn
話說,這個 API 不是給地球人看的。按照說明,net.createServer 返回的是 Server,事實上,如果用 UDP,按照裡面的代碼你死活乾不出來的。終於在 www.esp8266.com 論壇裡面找到了答案,本篇的內容就是描述 UDP 在 NodeMCU 裡面的正確姿勢。
接線、BBB 開 UART,和 minicom 相關的,請看上幾篇。首先我直接上代碼。
LUA 代碼
init.lua
print('init.lua ver 0.9')
wifi.setmode(wifi.STATION)
print('set mode=STATION (mode='..wifi.getmode()..')')
print('MAC: ',wifi.sta.getmac())
print('chip: ',node.chipid())
print('heap: ',node.heap())
wifi.sta.config('SSID','PWD')
dofile('main.lua')
init.lua 是啟動後執行的用戶程式代碼,wifi 設成 station 模式(另外可以是 AP 模式的),然後設置 SSID 和密碼,如果你想試,代碼裡面的 wifi.sta.config 需要改為正確值。代碼的最後一句是讓它執行另一個 lua 代碼檔。
main.lua
print('Connecting...')
tmr.alarm(0, 1000, 1, function()
if wifi.sta.getip() ~= nil then
print('IP: ',wifi.sta.getip())
tmr.stop(0)
dofile('udp.lua')
end
end)
這個沒什麼,每秒鐘看一遍是否已經連上了無線路由,如果連上了,就執行另一個代碼檔。(又一個檔案?有點多餘是吧,這是我個人癖好,我每個單獨測試的)
udp.lua
sv=net.createServer(net.UDP,0)
sv:on('receive', function(c,pl)
print(pl)
r=cjson.decode(pl)
if r.cmd == '0' then
print('I got a ZERO cmd.')
c:send('{\"cmd\":\"2\",\"GUID\":\"24F92\",\"dType\":\"powerPlug\"}')
end
end)
sv:listen(4000)
print('Server started')
關鍵就是這個 on 方法。你看官方 API,on 是 socket 的方法,不是 server 的。而 net.createServer 按照官方說明,是返回 server 的。就是說,如果按照官方說明,我這代碼是錯誤的。我是看了 http://www.esp8266.com/viewtopic.php?f=24&t=645 這裡才知道這“錯誤”做法…。
上傳代碼
我代碼是用 vim 在 BBB 裡面寫的,保存在 BBB,然後用 luatool 寫入。https://github.com/4refr0nt/luatool。python 而已,git clone 下來就能用,裡面還有個 telnet 代碼示範。這 luatool 其實是幫我操作 NodeMCU 命令並且轉換代碼而已。運行時加 –v 參數你就知道它是幹嘛的了。
用法是 python luatool.py –p /dev/ttyO2 –b 9600 –f XXX.lua –v
-p 是串口埠,-b 是 baud,-f 是本機的代碼檔,-v 是顯示過程。很明顯它只不過調用 NodeMCU 的lua 命令而已,而它最不好的地方是,它會等待 NodeMCU 反應返回字元來判斷操作有沒有順利執行。如果你像我一樣,有東西在裡面跑,有 print 的話,就會出現些錯誤,因為 print 和這 luatool 的響應混在一起了。
效果
不用 BBB,從 Windows,通過無線路由,直接發 UDP 給 ESP8266,開著 BBB 的 minicom 看看這些 debug (呃,print)信息。我首先發了 cmd: 1 和 2 字元過去,反應正常,也正確 print 了出來。然後 cmd:0,它正確的回傳了自己的身份,powerPlug。沒錯,我準備玩智能插座。
廣播一樣 no problem:
今天到此為止。