使用 nodeMCU 的 Wifi 网状网络

Posted

技术标签:

【中文标题】使用 nodeMCU 的 Wifi 网状网络【英文标题】:Wifi mesh-like network using nodeMCU 【发布时间】:2016-03-11 21:02:21 【问题描述】:

我有 2 个 nodeMCU 模块,我想将它们连接到 MQTT 代理并每 5 秒发送一些数据。

我想要实现的拓扑类似于 [router]

看起来 [nodeMCU#1] 是一个 wifi 扩展器,但在工作中,我们计划使用多个 nodeMCU 以类似网格的方式用于 IoT 应用程序。

我使用 nodeMCU-flasher 从这里 https://github.com/nodemcu/nodemcu-firmware/releases/tag/0.9.6-dev_20150704 下载了最新的(浮动)版本。

为此项目编写了 2 个 lua 脚本,我已使用 ESPlorer 将它们上传到模块中。

对于第一个模块,它以 STATIONAP 模式连接到我的工作 wifi,并使用 SSID nodeMCUwifi 创建自己的网络,基本密码为 10 个字符“1234567890”。连接后,脚本会向 MQTT 主题发送随机值。

对于第二个模块正确连接到nodeMCUwifi,它被分配了一个IP地址,但它无法连接到MQTT代理。

当我尝试使用我的智能手机连接到 nodeMCUwifi 时(只是为了测试连接,我无意使用这个系统来处理繁重的互联网负载,只有 MQTT 消息)我收到一条消息“发生身份验证错误”,即使我有正确输入了密码,或者(在极少数情况下)它连接但立即断开连接。

如果有任何解决此问题的想法,我将不胜感激。谢谢。

编辑:在 AP 配置中,我将 auth 参数设置为 3,我在下面粘贴了我的一部分代码。

cfg.ssid="ESP8266_"..node.chipid(); 
cfg.pwd="1234567890"
cfg.auth=3
wifi.ap.config(cfg);

现在我的笔记本电脑和智能手机连接到模块创建的 wifi,但仍然无法连接到互联网。我可以 ping 模块,但我无法 ping 8.8.8.8 或 MQTT 代理 IP 或其他任何东西。

【问题讨论】:

您应该尝试的第一件事是不要使用任何过时的二进制版本,而是自己构建固件。见github.com/nodemcu/nodemcu-firmware/issues/788 和github.com/nodemcu/nodemcu-firmware/issues/719。 将 SOFTAP 的信标间隔增加 3000 毫秒 @MertGülsoy 我仍然面临同样的问题 @MarcelStör 你能给我一个可靠的链接,告诉我如何得到固件的二进制文件吗? nodemcu-build.com 或 hub.docker.com/r/marcelstoer/nodemcu-build 【参考方案1】:

据我了解,[nodeMCU#1] 创建了一个名为 nodeMCUwifi 的 wifi 网络。然后其他人正在尝试连接到nodeMCUwifi。正如你所说:

现在我的笔记本电脑和智能手机连接到模块创建的 wifi,但仍然无法连接到互联网。我可以 ping 模块,但我无法 ping 8.8.8.8 或 MQTT 代理 IP 或其他任何东西。

我假设您的笔记本电脑和智能手机连接到 nodeMCUwifi 网络。现在你想要这个[nodeMCU#1] 像第 2 层交换机或路由器一样的东西(因为 SOFTAP 创建了自己的 ip 网络)。

有了所有这些信息,我可以说你试图达到的目的是不可能用 esp 实现的。由于 esp 没有足够的资源来充当 switch 或类似的行为。另外(目前)在 esp 中没有实现软件来实现这一点。

但是;如果您只希望系统通过某种协议(如 UDP)传输某种类型的流量(如 MQTT),则可以中继 strong> 消息像网状结构,但这只能单向工作。在此配置中,节点将更像中继器,但位于 OSI 的上层。对于这个想法,我无法提供示例代码,但我将在下面提供伪代码:

配置

> 每个节点都必须配置成链式结构。这意味着每个 SOFTAP 节点应该有不同的 SSID 或 TCP 设置。例如:

router(192.168.0.0)<----[NODE#1(SOFTAP0)]<----[NODE#2(SOFTAP1)]<---...
...
...
...<----[NODE#n(STATION)]

> 根据设置,每个节点都必须有一个TARGET IP 地址。这意味着每个节点都会将 MQTT 消息发送到该地址。

> 如果一个节点被配置为一个 SOFTAP,这意味着这个系统是一个目标并且必须监听一个特定的端口。

> 如果 SOFTAP 节点在正在侦听的端口上接收到一些数据,它应该立即(或缓冲)将数据发送到它的 TARGET 节点。 p>

> 作为这种链接操作的结果,消息,无论来源是什么,都将到达链的末端。

代码: SOFTAP

...soft ap config...
listento.port: udp.965
on("receive"):
    create.conn:TARGET
    send(DATA_RECEIVED)
    close.conn:TARGET

代码: STATION

...station config...
...Do some logic...
data=gather.data()
create.conn:TARGET
send(data)
close.conn:TARGET

【讨论】:

以上是关于使用 nodeMCU 的 Wifi 网状网络的主要内容,如果未能解决你的问题,请参考以下文章

使用 Wifi 将 Lua 脚本上传到 NodeMCU

Mesh无线网络的定义与WiFi的区别

是否可以通过 iOS 上的 Safari 进行网状网络?

nodemcu随笔(esp8266 wifi)

NodeMCU入坑指南-烧写固件并连接WIFI

NodeMCU连接wifi快速调用