我在ESP8266上有一個奇怪的問題,使用nodemcu固件(2.1.0),在那裏我沒有任何想法可以嘗試解決這個問題。Nodemcu:如果有/不是udp監聽器,UDP通信會受到影響嗎?
我有一個簡單的lua腳本正在運行,它正在偵聽UDP命令以開啓和關閉中繼,並且每隔60秒通過UDP發送活動消息到指定的IP地址。
如果在服務器端沒有聽到應該得到UDP「活動」消息的東西,ESP反應良好,都很好。 只要我啓動netcat來收聽來自ESP的UDP包,ESP就會每隔幾分鐘開始掛起至少30-60秒。 這是特別令人困惑,因爲我期待UDP是一個無連接協議。那麼UDP上的聽衆如何影響發送者的行爲呢? 這些是LUA腳本的相關部分:
[...]
alive=60000
[...]
function srvupd(s)
if (connected==1) then
s = s .." "..ip
srv:send(serverport, serveradr, s.."\n")
end;
end;
if (alive>0) then
tmr.alarm(2, alive, 1, function()
srvupd("alive")
end)
end
srv=net.createUDPSocket()
srv:listen(80)
srv:on("sent", function()
srv:close();
srv:listen(80);
end)
srv:on("receive",function(client,request, port, ip)
if (alive>0) then tmr.stop(2) end
print(string.format("received '%s' from %s:%d", request, ip, port))
buf="unknown"
if (request == "ch1on") then gpio.write(relay1, relayon);buf="ok" end
[...]
client:send(port, ip, buf)
if (alive>0) then tmr.start(2) end
end)
這就是我如何使用netcat來聆聽來自ESP在bash腳本的UDP消息:
#!/bin/bash
while true
do
msg=$(netcat -4 -u -n -l -D 192.168.0.5 2701 -w0 -q0)
echo -e "$msg"
done
在情況ESP不再對UDP命令作出反應,活着的消息仍然每分鐘發送一次。 UDP命令甚至可以被ESP接收,因爲只要處理繼續,一段時間之前發送的「通道開啓」命令就會被執行。
ESP的這些臨時阻塞僅在我偵聽其UDP消息時纔會發生。 我已經檢查過所有類型的組合,例如監聽器的獨立UDP套接字和ESP上的活動發送,關閉並打開服務器,發送消息後(如上面的當前版本)等。 甚至試圖通過TCP接收命令,只通過UDP發送活動消息。 行爲保持不變。所有的工作,只要沒有收到來自ESP的UDP消息。只要我啓動netcat,ESP就會在幾分鐘內開始掛起。
任何想法?因爲它是UDP,所以很難理解它是如何發生的。
親切的問候 Tjareson
您是否嘗試過像Wireshark這樣的其他工具來查看它是否僅僅是您的bash腳本而不是導致問題的ESP? – Forivin