ESP8266, NodeMCU, soft AP - UDP server-like soft AP, 独立接入点

Posted

技术标签:

【中文标题】ESP8266, NodeMCU, soft AP - UDP server-like soft AP, 独立接入点【英文标题】:ESP8266, NodeMCU, soft AP - UDP server-like soft AP, independent access point 【发布时间】:2016-08-14 13:59:11 【问题描述】:

我正在使用带有升级固件的 NodeMCU(带有 ESP8266-E)。所有基本命令都能完美运行,但有一个问题。

我想创建一个独立的接入点,它的行为类似于 UDP 服务器。这意味着无需直接连接到任何其他接入点。一个简单的 UDP 服务器,如软 AP。

我按照以下步骤操作:

    我已将新固件上传到 NodeMCU。 我已经下载了 ESPlorer 以便更好地使用 NodeMCU。 我已经上传了下面的源代码。 我已连接到我桌面上的 NodeMCU 接入点。 我已经使用 Java UDP 客户端程序向 NodeMCU 发送了一些字符串。 我查看了 ESPlorer 上的消息。 NodeMCU 尚未收到任何此类字符串。

--

print("ESP8266 Server")
wifi.setmode(wifi.STATIONAP);
wifi.ap.config(ssid="test",pwd="12345678");
print("Server IP Address:",wifi.ap.getip())

-- 30s timeout for an inactive client
srv = net.createServer(net.UDP, 30)
-- server listens on 5000, if data received, print data to console
srv:listen(5000, function(sk)
  sk:on("receive", function(sck, data) 
    print("received: " .. data)
  end)
  sk:on("connection", function(s)
    print("connection established")
  end)
end)

当我尝试使用 Java 应用程序发送消息时,ESPlorer 没有任何变化。甚至当我尝试使用 Hercules 程序(用于 TCP、UDP 通信的好程序)发送消息时也没有。

我猜这可能是错误的 IP 地址。我使用的是 AP 的 IP 地址,而不是站点的 IP 地址。

换句话说,我使用这个地址:wifi.ap.getip() 而不是这个地址wifi.sta.getip() 来连接到 UDP 服务器。但是sta.getip() 返回一个 nil 对象。真的不知道。

我会很高兴得到任何建议。

非常感谢。

【问题讨论】:

【参考方案1】:

好的,既然你更新了问题,让我们重新开始吧。在我给你第一个提示之前我应该​​打开我的大脑,对此感到抱歉。

UDP 是无连接的,因此当然没有s:on("connection")。因此,您不能在套接字上注册回调,而是在服务器本身上注册。它位于the documentation,但很容易错过。

这应该可以帮助您:

wifi.setmode(wifi.STATIONAP)
wifi.ap.config( ssid = "test", pwd = "12345678" )
print("Server IP Address:", wifi.ap.getip())

srv = net.createServer(net.UDP)
srv:listen(5000)
srv:on("receive", function(s, data)
    print("received: " .. data)
    s:send("echo: " .. data)
end)

我对来自dev 分支的固件运行了这个,并像这样从命令行进行了测试

$ echo "foo" | nc -w1 -u 192.168.4.1 5000
echo: foo

ESPlorer 然后也正确打印了“received: foo”。

【讨论】:

我已经修复了我的问题。谢谢 非常感谢。我发现它终于完美地工作了。它不起作用的原因是我对UDP协议的错误理解。当我尝试使用 Hercules 发送一个字符串时,它什么也没发生。但是在发送了更多字符串/消息后,我发现 UDP 服务器可以正常接收。换句话说UDP协议是一个不可靠的协议:) “UDP 协议是一个不可靠的协议” - 哦,是的,very much so。【参考方案2】:

这一行是无效的 Lua 代码。 connected 放错地方了。你不能在函数调用之后只放一个词。

print(wifi.ap.getip()) connected

我猜你打算做类似的事情 打印(wifi.ap.getip() ..“已连接”) 虽然我认为您应该在此处添加 som 错误处理,以防 wifi.ap.getip() 不返回 IP。

这里你没有完成函数定义。你也没有完成srv:on 通话

srv:on("receive", function(srv, pl)
print("Strings received")
srv:listen(port)

我假设您只是没有复制/粘贴完整的代码。

【讨论】:

我已经解决了我的问题。谢谢 非常感谢。我发现它终于完美地工作了。它不起作用的原因是我对UDP协议的错误理解。当我尝试使用 Hercules 发送一个字符串时,它什么也没发生。但是在发送了更多字符串/消息后,我发现 UDP 服务器可以正常接收。换句话说UDP协议是一个不可靠的协议:)

以上是关于ESP8266, NodeMCU, soft AP - UDP server-like soft AP, 独立接入点的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266(nodemcu)引脚和I2C的坑!!!

ESP8266-NodeMCU项目:ESP8266-NodeMCU+Blinker+DHT11+小爱同学

ESP-NOW ESP8266 NodeMCU单板双向通信

ESP8266 nodemcu

ESP8266 NodeMCU 内存不足

基于MacOS搭建ESP8266 NodeMCU CP2102开发环境