3

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

我试图实现的拓扑类似于 [router]<==[nodeMCU#1]<==[nodeMCU#2]

看起来 [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 或其他任何东西。

4

1 回答 1

4

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

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

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

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

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

配置

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

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

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

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

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

>由于此链接操作,消息,无论来源是什么,都将到达链的末端。

代码 : SOFTAP

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

代码 :

...station config...
...Do some logic...
data=gather.data()
create.conn:TARGET
send(data)
close.conn:TARGET
于 2015-12-12T11:52:22.447 回答