相对于GB/T 28181-2016, GB/T28181-2022增加了设备软件升级命令,走的是有应答设备控制流程,流程不复杂,简单概括就是通过SIP MESSAGE(Application/MANSCDP+xml)消息将新版本下载地址下发给国标设备,国标设备下载新版本,完成升级后再向SIP服务器发送升级结果通知命令。

  详细定义请参考国标,这里记录下实现时要注意的细节:

  1. 接入同一国标系统的多个设备(厂家、型号、固件版本可能都不一样),要保证下发正确的升级版本下载地址,就要在设备信息查询应答时提供下面三个字段:
<!-- 设备生产商(可选)-->
<Manufacturer>xxxxxxxx</Manufacturer>
 <!-- 设备型号(可选)-->
<Model>yyyyyyyyy</Model>
 <!-- 设备固件版本(可选)-->
<Firmware>zzzzzzzz</Firmware>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. 设备软件升级走的是应答设备控制流程,按照国标附录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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

  设备控制响应命令:

<?xml version="1.0" ?>
<Response>
<CmdType>DeviceControl</CmdType>
<SN>80267728</SN>
<DeviceID>31020000011310000073</DeviceID>
<Result>OK</Result>
</Response>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

    设备软件升级成功通知命令:

<?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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

    设备软件升级失败通知命令:

<?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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

  相关定义接口:

/*
 * 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);


  //// 其他接口省略
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

  整个升级流程不是太麻烦,现有代码中加入新的XML解析生成代码就好.