工具
硬件:ESP8266 開發板、杜邦線、USB 數據線、LED 燈
軟件:ESPlorer、socketools、flashtool
前提准備
NodeMcu 的介紹:https://baike.baidu.com/item/NodeMCU/17106281?fr=aladdin
去 NodeMcu的官網上在線編譯一個固件 https://nodemcu-build.com/,編譯選項選擇默認,填上郵箱一會就把固件的下載地址發送過來了。
使用 ESPFlasher 把固件刷入(integer 和 float 兩種版本都行),接着就可以用 ESPlorer 進行 Lua 語言的開發了。
實現局域網內點亮一個 LED 燈
具體的步驟如下:
- 設置 ESP8266 的 wifi 模式為 STATION 和 STATIONAP(同時具有 ap 和 station 的功能,以前很舊的安卓機的 wifi 可能有的會有這種功能,但是現在的手機似乎都被限制成只能單獨開啟一種模式。)
- 連接 wifi。參考官方的 api 函數。鏈接見參考資料。
- 建立一個 socket server,將 10116 端口設置為監聽的端口,以 "receive" 為監聽器,將收到的數據進行判斷。
- 收到為 "on" 則控制 ESP8266 的引腳 1 (D1)為輸出模式以及高電平,若為 "off",則相反。以此來達到點亮 LED 燈的目的。
ESP8266 IO 口引腳圖:
代碼實現
wifi.setmode(wifi.STATIONAP)
function con_wifi()
cfg = {}
cfg.ssid = "D-Link_DIR-820LW"
cfg.pwd = "szdsys207"
wifi.sta.config(cfg)
wifi.sta.connect()
print("config success!")
end
con_wifi()
pin = 1
gpio.mode(pin,gpio.OUTPUT)
srv = net.createServer(net.TCP,28800)
srv:listen(10116,function(conn)
print "listening..."
conn:on("receive",function(sck,recvStr)
print("The data: "..recvStr)
if (recvStr == "on") then
gpio.write(1,gpio.HIGH)
elseif(recvStr == "off") then
gpio.write(1,gpio.LOW)
else
print("no choice!")
end
end)
end)
- 可以將代碼設置為 ESP8266 開機初始化加載,即在 init.lua 中使用 dofile 函數來載入。
但是需要注意的是必須點擊 UPLOAD 以后才能使得 init.lua 正常加載,否則會提示 file not found。
實現效果
這里是在本地開啟了一個 10116 的 TCP 端口,可以手寫 c 語言或者 python 的 socket 編程來連接上發送數據。
但是我這里直接選擇了現成的工具來發包。
- 發送 "on" 會將 LED 燈點亮
如圖:
- 發送 "off" 會將 LED 燈熄滅
如圖:
- 發送 "on" 或者 "off" 之外的命令會提示 "no choice"
wireshark 查看 TCP 包
用 wireshark 查看一下發送控制命令的 TCP 包的情況。
- 當控制信息為 "on" 時的情況
其他兩種情況都是類似,就不重新抓包了。
參考資料
https://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistagetap
https://blog.csdn.net/zz531987464/article/details/83449458
https://www.cnblogs.com/webenh/p/9087555.html