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层通)。