相对于GB/T 28181-2016, GB/T28181-2022增加了设备软件升级命令,走的是有应答设备控制流程,流程不复杂,简单概括就是通过SIP MESSAGE(Application/MANSCDP+xml)消息将新版本下载地址下发给国标设备,国标设备下载新版本,完成升级后再向SIP服务器发送升级结果通知命令。
详细定义请参考国标,这里记录下实现时要注意的细节:
1. 接入同一国标系统的多个设备(厂家、型号、固件版本可能都不一样),要保证下发正确的升级版本下载地址,就要在设备信息查询应答时提供下面三个字段:
<!-- 设备生产商(可选)-->
<Manufacturer>xxxxxxxx</Manufacturer>
<!-- 设备型号(可选)-->
<Model>yyyyyyyyy</Model>
<!-- 设备固件版本(可选)-->
<Firmware>zzzzzzzz</Firmware>
2. 设备软件升级走的是应答设备控制流程,按照国标附录A.1描述, 应答命令中的SN值要和请求命令中的SN值一致.
3. 新版本安装之前, 设备要注销登录, 版本安装成功后, 重新进行设备注册,注册成功后再发送设备软件升级成功通知命令.
4. 设备软件升级请求命令中的SessionID要和设备软件升级结果通知命令中的SessionID一致,升级过程中可能要重启APP或者设备, 请求SessionID需要保存到文件或者数据库中。
读文档枯燥乏味, 下面给出一个简单的信令实例, 方便快速上手写代码.
设备软件升级命令:
<?xml version="1.0" ?>
<Control>
<CmdType>DeviceControl</CmdType>
<SN>80267728</SN>
<DeviceID>31020000011310000073</DeviceID>
<DeviceUpgrade>
<Manufacturer>test</Manufacturer>
<Firmware>V3.7.191-b20241227</Firmware>
<FileURL>https://192.168.1.73/upgrade/testv3-7-191-b20241227.apk</FileURL>
<SessionID>A1FBCA20ACF640D8BA317E4DC4620802677281FD</SessionID>
</DeviceUpgrade>
</Control>
设备控制响应命令:
<?xml version="1.0" ?>
<Response>
<CmdType>DeviceControl</CmdType>
<SN>80267728</SN>
<DeviceID>31020000011310000073</DeviceID>
<Result>OK</Result>
</Response>
设备软件升级成功通知命令:
<?xml version="1.0" ?>
<Notify>
<CmdType>DeviceUpgradeResult</CmdType>
<SN>2080267764</SN>
<DeviceID>31020000011310000073</DeviceID>
<SessionID>A1FBCA20ACF640D8BA317E4DC4620802677281FD</SessionID>
<UpgradeResult>OK</UpgradeResult>
<Firmware>V3.7.191-b20241227</Firmware>
</Notify>
设备软件升级失败通知命令:
<?xml version="1.0" ?>
<Notify>
<CmdType>DeviceUpgradeResult</CmdType>
<SN>2081415830</SN>
<DeviceID>31020000011310000073</DeviceID>
<SessionID>A1FBCA20ACF640D8BA317E4DC4620802677281FD</SessionID>
<UpgradeResult>ERROR</UpgradeResult>
<Firmware>V3.7.179-b20231013</Firmware>
<UpgradeFailedReason>03</UpgradeFailedReason>
</Notify>
相关定义接口:
/*
* Copyright (C) 1130758427@qq.com. All rights reserved.
* 问题沟通微信:ldxevt
*/
package com.gb.ntsignalling;
import java.util.List;
public interface DeviceUpgradeInfo {
/*
* 设备固件版本(必选)
*/
String Firmware();
/*
* 升级文件的完整路径(必选)
*/
String FileURL();
/*
* 设备厂家(必选)
*/
String Manufacturer();
/*
* 会话ID(必选)
*/
String SessionID();
/*
* 扩展信息
*/
List<StringPair> Extensions();
}
public interface GBSIPAgentDeviceUpgradeListener {
/*
* 设备软件升级文件地址传输命令
*/
void ntsOnDeviceUpgradeCommand(String from_user_name, String from_user_name_at_domain,
String sn, String device_id, DeviceUpgradeInfo info);
}
public interface GBSIPAgent {
void setDeviceUpgradeListener(GBSIPAgentDeviceUpgradeListener deviceUpgradeListener);
/*
* 设备软件升级结果通知
*/
boolean notifyDeviceUpgradeResult(String fromUserName, String fromUserNameAtDomain, String deviceID, String sessionID,
boolean upgradeResult, String firmware, String upgradeFailedReason);
其他接口省略
}
整个升级流程不是太麻烦,现有代码中加入新的XML解析生成代码就好,其他问题微 信: ldxevt .