【发布时间】:2020-10-27 11:29:27
【问题描述】:
我在我的项目中使用 ESP8266-7 作为唯一的微控制器,但我有一个小问题。有时互联网线路中断,我的 ESP 尝试重新连接到代理。发生这种情况时,程序会冻结,直到互联网重新上线并且 ESP 重新连接到代理。 (更具体地说,我的程序每次在.connect(device_ID.c_str(), mqtt_user.c_str(), mqtt_pass.c_str()) 中等待 15 秒。)
我正在使用PubSubClient.hlibrary,正如我所测试的,当我调用mqtt_client.connect(device_ID.c_str(), mqtt_user.c_str(), mqtt_pass.c_str()) 时会出现此问题。这样程序运行这个函数并等待进程完成。这最多可能需要 15 秒。
如何在不使用此代码的情况下尝试连接到代理,或者是否有任何其他解决方案可以让我的程序不会冻结?
ESP 能否在我的程序仍在运行时在后台连接到代理?
【问题讨论】:
-
通常在这类库/模块上存在连接超时,但如果您使用的是这个 (github.com/knolleary/pubsubclient),则没有。对于这样的情况,如果连接需要很长时间,我会使用看门狗定时器中止连接并重置电路板....不确定您的用例是否允许这样做。
-
感谢您的及时回复,但正如我所说,它是我板上唯一的微控制器,我不想关闭它。我希望一切顺利运行,没有任何停顿,我想在程序的后台连接到代理。我不想要互联网连接,以任何方式中断我的程序。我有机会这样做吗?
-
这取决于您的应用程序是如何编写的。例如,我有一个池温度传感器,它每五分钟连接一次以发送数据。它首先连接到 WiFi,如果看起来不错,则尝试连接到 MQTT 代理。我有一个 90 秒的看门狗定时器,如果整个 WiFi + MQTT 代理连接在那个时间范围内没有发生,它会重置电路板。没有规定必须始终连接您的传感器(尤其是如果它只是发送数据而不是接收数据!)
-
确实如此。但不幸的是,在我的情况下,我的 ESP 还有很多其他的事情要控制;它不仅仅是检查传感器。所以在我的情况下不能有任何冻结时间。您对我有什么建议或解决方案吗?
-
京东的物联网规则#1:传感器应该只是感知。 PubSub 架构的重点是节点可以是单一用途的,其他节点可以订阅传感器数据和操作员。如果您让传感器感知并让其他节点处理数据,您的生活将会轻松得多。在我家的 IOT 系统中,我有一个 Docker 服务器,我的 MQTT 代理在其中运行,并且只是创建容器来处理数据。添加功能就像添加另一个 Container 并让它订阅数据一样简单。 diysmarthome.io
标签: mqtt arduino-esp8266 esp8266wifi