LoRaWAN网关设计中UDP链路异常检测

LoRaWAN网关设计中UDP链路异常检测

我们先从应用层来看这个问题,《LoRaWAN Network ServerDemonstration:Gateway to Server InterfaceDefinition》即GWMP协议定义文件

要点

文档很简单,要点如下:

  1.  PULL_DATA可理解为心跳,注意“GW不对于PULL_ACK的缺失做出响应”,但是协议明确说明:NS 应该(SHALL)立即回应PULL_DATA。

  2. 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

  1. 发送后在两个push_timeout_half里检测ACK,如果没有回应总计等待push_timeout_half

  2. meas_up_dgram_sent和meas_up_ack_rcv记录消息数

PULL_DATA

上行

thread_down即sock_down

  1. 每keepalive_time 发送一次心跳,每pull_timeout超时检查一次sock_down中NS发送来的数据

  2. meas_dw_pull_sent 和meas_dw_ack_rcv记录消息数

  3. autoquit_cnt达autoquit_threshol(>0)时退出进程

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

猜你喜欢

转载自blog.csdn.net/quending/article/details/86246665
今日推荐