技术背景
好多开发者在用我们Android平台GB28181设备接入模块的时候,更希望跟我们探讨一些协议规范方面,以便在现场对接时,可以知其然知其所以然。比如,有开发者提到,GB28181的状态消息报送这块到底要怎么实现?希望我们能做个基础的普及。本文结合大牛直播SDK的模块,抛砖引玉,做个基础的讲解。
先看GB/T281810-2016规范针对状态消息报文基本要求:
当源设备(包括网关、SIP设备、SIP客户端或联网系统)发现工作异常时,应立即向本 SIP监控域的SIP服务器发送状态信息;无异常时,应定时向本SIP监控域的SIP服务器发送状态信息。
SIP设备 29 GB/T28181—2016宜在状态信息中携带故障子设备描述信,状态信息报送采用IETFRFC 3428中定义的方法 Message实现。
通过周期性的状态信息报送,实现注册服务器与源设备之间的状态检测即心跳机制。 心跳发送方、接收方需统一配置“心跳间隔”参数,按照“心跳间隔”定时发送心跳消息,默认心跳间隔60s。
心跳发送方、接收方需统一配置“心跳超时次数”参数,心跳消息连续超时达到“心跳超时次数” 则认为对方下线,默认心跳超时次数3次。
为此,我们在Android平台GB28181设备接入模块(SmartGBD)设置的参数如下:
GB28181设备接入侧初始化initGB28181Agent()的时候,把心跳参数投递下去:
心跳接收方在心跳发送方上线状态下检测到心跳消息连续超时达到商定次数则认为心跳发送方离 线;心跳发送方在心跳接收方上线状态下检测到心跳消息响应消息连续超时达到商定次数则认为心跳接收方离线。
状态信 息 报 送 命 令 应 包 括 命 令 类 型 (CmdType)、设 备/系 统 编 码 (DeviceID)、是 否 正 常 工 作 (Status)等,采用 Message方法的消息体携带。 Message消息的成功和错误应答均无消息体。
周期性的心跳示例
心跳异常处理
基础的心跳,大多数开发者弄的明白,心跳异常处理,需要格外注意,以下是我们针对心跳异常,做的逻辑实现,感兴趣的开发者可以参考:
总结
以上是GB28181状态信息报送流程,相对其他逻辑实现,比如视频回传、语音广播、历史视音频下载回放等,这块难度不达,需要注意的是心跳异常处理这块,感兴趣的开发者,可以单独跟我沟通。