LoRaWAN网关设计中UDP链路异常检测
我们先从应用层来看这个问题,《LoRaWAN Network ServerDemonstration:Gateway to Server InterfaceDefinition》即GWMP协议定义文件
要点
文档很简单,要点如下:
-
PULL_DATA可理解为心跳,注意“GW不对于PULL_ACK的缺失做出响应”,但是协议明确说明:NS 应该(SHALL)立即回应PULL_DATA。
-
PUSH_DATA,同样,“GW不对于PUSH_ACK的缺失做出响应”,但是协议明确说明:NS SHALL立即回应PUSH_DATA
有了上述两个SHALL,对于GW而言,可以用来进行链路状态检测和修复了。
部分重要的参数描述
参数 | 含义 | 默认值 | 配置接口-json |
keepalive_time | 心跳发送间隔,单位秒 | 5s | keepalive_interval
|
stat_interval | 统计信息发送间隔,单位秒 | 30s | keepalive_interval |
push_timeout_half | 在sock_up上用户报文/gw统计信息报文回应时间的一半。系统关键参数 | 50ms | push_timeout_ms |
pull_timeout | 从sock_down收NS下行数据时间片长度 | 200ms | 无 |
autoquit_threshold | autoquit_threshold |
代码里提供了什么?
参数 | 含义 | 使用 |
meas_up_dgram_sent | sock_up发送到server的消息条数 | |
meas_up_ack_rcv | NS针对sock_up UL的回应消息数(去重) | |
meas_dw_pull_sent | PULL条数 | |
meas_dw_ack_rcv | 针对PULL回应ACK条数(去重) | |
autoquit_cnt | 在收到ACK之后清0,在autoquit_threshold(>0时)退出进程 |
GWMP消息类型 | 方向 | lora_pkt_fwd线程 | 描述 |
PUSH_DATA | 上行 | thread_up即sock_up |
|
PULL_DATA | 上行 | thread_down即sock_down |
|
PULL_RESP | 下行 | thread_down即sock_down | DL |
怎么用于链路检测?
1. 为什么在sock_down上有autoquit_cnt,但是sock_up上没有呢?
回答:链路失效时,在sock_down上能够及时感知,因为sock_down上有心跳,检测时间可以控制。在进程退出的处理上,有一个socket检测就够了。
2. 怎么利用?
链路失效时,会造成数据丢失。一般情况下,应该开启autoquit_cnt来检测UDP链路的功能,并且开放接口给用户选择合适的参数(最终效果是取决于心跳间隔*无ack次数)
3. 上面这个机制非常有效。当然,设计网关,可以改进机制,并不是一定要退出进程,udp链路重置就可以了。此外,还需要辅以其它修复机制,例如IP地址变化检测,加快UDP链路失效恢复(毕竟UDP通信特点决定了,IP层通,不代表UDP层通)。