ESP8266,NodeMCU,软AP - 类似UDP服务器的软AP,独立接入点

时间:2016-04-21 11:35:46

标签: lua esp8266 nodemcu

我正在使用带有升级固件的NodeMCU(带ESP8266-E)。所有基本命令都能很好地工作,但有一个问题。

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

我按照以下步骤操作:

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

    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对象。真的我不知道。

    我会很高兴任何建议。

    非常感谢。

2 个答案:

答案 0 :(得分:2)

好的,我们重新启动此问题,因为您更新了问题。在我给你第一个提示之前我应该​​打开我的大脑,对此感到抱歉。

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”。

答案 1 :(得分:1)

此行无效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)

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