我有2个nodeMCU模块,我想连接到MQTT代理并每隔5秒发送一些数据。
我想要实现的拓扑结构如[router]< == [nodeMCU#1]< == [nodeMCU#2]
看起来[nodeMCU#1]是一个wifi扩展器,但在工作中我们计划使用多个nodeMCU以类似网格的方式用于物联网应用。
在这两个版本中,我使用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或其他任何东西。
答案 0 :(得分:4)
据我了解,[nodeMCU#1]
创建了一个名为nodeMCUwifi
的wifi网络。然后其他人正在尝试连接到nodeMCUwifi
。如你所说:
现在我的笔记本电脑和智能手机连接到模块创建的wifi,但仍然无法连接到互联网。我可以ping模块,但我不能ping 8.8.8.8或MQTT代理IP或其他任何东西。
我认为您的笔记本电脑和智能手机连接到nodeMCUwifi
网络。现在你希望这个[nodeMCU#1]
行为像第2层交换机或类似路由器(因为SOFTAP创建自己的IP网络)。
掌握了所有这些信息后,我可以说,您尝试实现的目的是不可能的。因为esp没有足够的资源来像开关或类似的那样行事。另外(目前)在esp中没有实现软件来实现它。
然而;如果您只希望系统通过特定协议(,例如UDP )传输某些类型的流量(,例如MQTT ),则可以中继像网状结构这样的消息,但这只能单向工作。在此配置中,节点将更像中继器,但在OSI的上层。对于这个想法,我无法提供示例代码,但我将在下面提供伪代码:
<强>配置强>
&gt; 必须配置每个节点以构建链结构。这意味着每个SOFTAP节点应具有不同的SSID或TCP设置。例如:
router(192.168.0.0)<----[NODE#1(SOFTAP0)]<----[NODE#2(SOFTAP1)]<---...
...
...
...<----[NODE#n(STATION)]
&gt; 根据设置,每个节点必须具有 TARGET IP地址。这意味着每个节点都会将MQTT消息发送到该地址。
&gt; 如果某个节点配置为SOFTAP,则表示此系统是TARGET,必须侦听特定端口。
&gt; 如果SOFTAP节点收到正在侦听的端口上的某些数据,它应立即(或缓冲)将数据发送到 TARGET 节点。 / p>
&gt; 作为此链接操作的结果,无论来源是什么,该消息都将到达链的末尾。
代码: 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