2017-06-13 25 views
1

我在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

+0

您是否嘗試過像Wireshark這樣的其他工具來查看它是否僅僅是您的bash腳本而不是導致問題的ESP? – Forivin

回答

0

的問題同時解決。我的一位朋友向我指出了UDP問題的唯一通用基礎,即ARP。

只有當ESP與udp-listener處於不同的網絡時,纔會出現此行爲。 (比如192.168.1.x和192.168.5.y) 即使它還有點不清楚,猜測是netcat可能在接收到一條消息時發出ARP請求,並且這不知道路由器是否正確處理,如果發生在兩個不同的網絡之間。

將監聽器bashscript放在同一個網絡中後(基本上通過給它運行ESP的網絡中的第二個IP的樹莓),阻塞的ESP通信不會再發生。