完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试使用 NodeMCU Lilin v3 制作遥控车。现在我已经能够使用网络服务器功能来实现它。我什至使用 DDNS 服务器 (DuckDNS) 能够通过蜂窝路由器(创建 WiFi 热点)提供的蜂窝网络从互联网远程访问它。
通常我使用手机访问 NodeMCU Web 服务器。 但是当由于某种原因手机失去连接时,我想让 NodeMCU 意识到这一点,这样它就会停止遥控车。 类似于故障保护机制。 我已经尝试实现 Ping 功能,但它不会通过蜂窝网络公共 IP。 |
|
相关推荐
1个回答
|
|
要实现故障保护机制,你可以在程序中使用心跳检测功能。这意味着在每次手机与 NodeMCU 建立连接时,NodeMCU 将发送一个心跳包给手机,如果手机不回复,则 NodeMCU 将认为手机已经断开连接,并停止遥控车的运行。
以下是一种实现方法: 1. 在 NodeMCU 的程序中添加一个计时器和一个计时器中断处理函数。计时器可以定时触发中断,以便在没有收到心跳包的情况下停止车辆的运行。 2. 当手机访问 NodeMCU Web 服务器时,NodeMCU 会发送一个心跳包给手机。手机应该回复该心跳包,以确认已经与 NodeMCU 建立了连接。 3. 如果 NodeMCU 在指定时间内没有收到心跳包,则中断处理函数将会被触发,车辆的运动将会停止。 关于 Ping 功能的问题,因为蜂窝网络的 IP 地址是不稳定的,建议你使用 UDP 包来实现心跳检测。这样可以避免因为 IP 地址变化而导致的问题。以下是一些使用 UDP 包实现心跳检测的代码示例: 发送心跳包的代码: ``` C #include #include WiFiUDP udp; IPAddress serverIP(192, 168, 1, 100); // 服务器的 IP 地址 unsigned int serverPort = 8888; // 服务器接收的 UDP 端口 void sendHeartBeat() { udp.beginPacket(serverIP, serverPort); udp.write("hello"); udp.endPacket(); } ``` 接收心跳包的代码: ``` C #include #include WiFiUDP udp; unsigned int localPort = 8888; // 本地的 UDP 端口 void setup() { udp.begin(localPort); } void loop() { int packetSize = udp.parsePacket(); if(packetSize) { char packetBuffer[255]; int len = udp.read(packetBuffer, 255); if(len > 0) { packetBuffer[len] = 0; if(strcmp(packetBuffer, "hello") == 0) { // 收到心跳包,回复确认包 udp.beginPacket(udp.remoteIP(), udp.remotePort()); udp.write("world"); udp.endPacket(); } } } } ``` 这样,NodeMCU 就可以通过发送 UDP 包进行心跳检测,以实现故障保护机制。 |
|
|
|
只有小组成员才能发言,加入小组>>
145个成员聚集在这个小组
加入小组536浏览 6评论
449浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
432浏览 5评论
430浏览 4评论
404浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 09:09 , Processed in 0.806843 second(s), Total 75, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号