| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- --[[
- @module network_watchdog
- @summary 网络环境检测看门狗功能模块
- @version 1.0
- @date 2025.07.23
- @author 朱天华
- @usage
- 本文件为网络环境检测看门狗功能模块,监控网络环境是否工作正常(设备和服务器双向通信正常,或者至少单向通信正常),核心业务逻辑为:
- 1、启动一个网络环境检测看门狗task,等待其他WebSocket网络应用功能模块来喂狗,如果喂狗超时,则控制软件重启;
- 2、如何确定"喂狗超时时间",一般来说,有以下几个原则;
- (1) 先确定一个最小基准值T1,2分钟或者5分钟或者10分钟,这个取值取决于具体项目需求,但是不能太短,因为开机后,在网络环境不太好的地方,网络初始化可能需要比较长的时间,一般推荐这个值不能小于2分钟;
- (2) 再确定一个和产品业务逻辑有关的一个值T2,这个值和产品的应用业务逻辑息息相关,假设你的产品业务中:
- <1> 服务器会定时下发数据给设备,例如设备连接上业务服务器之后,每隔3分钟,设备都会给服务器发送一次心跳,然后服务器都会立即回复一个心跳应答包;
- 这种情况下,可以取3分钟的大于等于1的倍数(例如1倍,1.5倍,2倍等等)+一段时间(例如10秒钟,如果前面是1倍,则此处必须加一段时间,给网络数据传输过程留够充足的时间);
- <2> 如果服务器不会定时下发数据给设备,但是WebSocket使用的是长连接,并且设备会定时发送数据给服务器,例如设备连接上业务服务器之后,每隔2分钟,设备都会给服务器发送一次心跳;
- 这种情况下,可以取2分钟的大于等于1的倍数(例如1倍,1.5倍,2倍等等)+一段时间(例如10秒钟,如果前面是1倍,则此处必须加一段时间,给网络数据传输过程留够充足的时间);
- <3> 如果服务器既不会定时或者至少一段时间下发应用数据给设备,设备也不会定时或者至少一段时间上传应用数据到服务器;
- 这种情况下,一般来说也不是长连接应用,一般来说也不需要网络业务逻辑看门狗,遇到这种情况再具体问题具体分析;
- (3) 取T1和T2的最大值,就是"喂狗超时时间"
- 3、其他WebSocket网络业务功能模块的喂狗时机,和上面2.2的描述相对应,一般来说,可以在以下几种时间点执行喂狗动作:
- (1) 设备收到服务器下发的数据时
- (2) WebSocket连接下,设备成功发送数据到服务器时
- (3) WebSocket连接成功时(不到迫不得已,这种情况下不要喂狗,如果喂狗,可能会影响以上两点的判断;
- 因为长连接的收发数据失败会导致一直重连,重连成功喂狗就会掩盖收发数据异常,除非收发数据完全无规律,才可能在WebSocket连接成功时喂狗)
- 4、最重要的一点是:以上所说的原则,仅仅是建议,要根据自己的实际项目业务逻辑以及自己的需求最终确定看门狗方案
- 5、具体到本demo
- (1) 产品业务逻辑为:
- <1> 创建了一个WebSocket连接,设备会定时发送数据到服务器,服务器何时下发数据给设备不确定;
- (2) 确定喂狗超时时间:
- <1> 本demo支持单WIFI、单以太网、单4G网络连接外网,网络环境准备就绪预留2分钟的时间已经足够,所以最小基准值T1取值2分钟;
- <2> 本demo中存在1路WebSocket连接,设备会定时发送数据给服务器,定时发送的时间间隔为5秒,在网络环境波动的时候,数据发送延时会比较大;
- 在这个demo中,我能接受的延时发送时长是1分钟,能接受连续3次延时发送时长的失败,所以,T2取值3分钟;
- <3> 取T1 2分钟和T2 3分钟的最大值,最终的喂狗超时时间就是3分钟;
- (3) 确定喂狗时机:
- <1> WebSocket连接中,收到服务器的下发数据时;
- <2> WebSocket连接中,成功发送数据给服务器时;
- 本文件没有对外接口,直接在main.lua中require "network_watchdog"就可以加载运行;
- 外部功能模块喂狗时,直接调用sys.publish("FEED_NETWORK_WATCHDOG")
- ]]
- -- 网络环境检测看门狗task处理函数
- local function network_watchdog_task_func()
- while true do
- --如果等待180秒没有等到"FEED_NETWORK_WATCHDOG"消息,则看门狗超时
- if not sys.waitUntil("FEED_NETWORK_WATCHDOG", 180000) then
- log.error("network_watchdog_task_func timeout")
- -- 等待3秒钟,然后软件重启
- sys.wait(3000)
- rtos.reboot()
- end
- end
- end
- --创建并且启动一个task
- sys.taskInit(network_watchdog_task_func)
|