• GB28181设备控制和TeleBoot远程启动命令探究


    设备控制

    设备控制基本要求

    源设备向目标设备发送设备控制命令,控制命令的类型包括球机/云台控制、远程启动、录像控制、 报警布防/撤防、报警复位、强制关键帧、拉框放大、拉框缩小、看守位控制、设备配置等。

    设备控制采用 IETFRFC3428中的 Message方法实现。

    源设备包括SIP客户端、网关或者联网系统,目标设备包括SIP设备、网关或者联网系统。

    源设备向目标设备发送球机/云台控制命令、远程启动命令、强制关键帧、拉框放大、拉框缩小命令后,目标设备不发送应答命令

    源设备向目标设备发送录像控制、报警布防/撤防、 报警复位、看守位控制、设备配置命令后,目 标设备应发送应答命令表示执行的结果。

    命令流程

    无应答命令流程

     命令流程描述如下:

    a) 1:源设备向SIP服务器发送设备控制命令,设备控制命令采用 Message方法携带;

    b) 2:SIP服务器收到命令后返回200OK;

    c) 3:SIP服务器向目标设备发送设备控制命令,设备控制命令采用 Message方法携带;

    d) 4:目标设备收到命令后返回200OK。

    有应答命令流程

     

    命令流程描述如下:
    a) 1:源设备向SIP服务器发送设备控制命令,设备控制命令采用 Message方法携带;
    b) 2:SIP服务器收到命令后返回200OK;
    c) 3:SIP服务器向目标设备发送设备控制命令,设备控制命令采用 Message方法携带;
    d) 4:目标设备收到命令后返回200OK;
    e) 5:目标设备向SIP服务器发送设备控制响应命令,设备控制响应命令采用 Message方法携带;
    f) 6:SIP服务器收到命令后返回200OK;
    g) 7:SIP服务器向源设备转发设备控制响应命令,设备控制响应命令采用 Message方法携带;
    h) 8:源设备收到命令后返回200OK。

    TeleRoot技术实现

    本文以我们实现的Android平台GB28181设备对接模块为例,如果GB平台端支持远程启动,发送的信令如下:
    1. MESSAGE sip:34020000011310000038@183.192.2.222:11589 SIP/2.0
    2. Via: SIP/2.0/UDP 152.100.10.22:5063;branch=z9hG4bK3ee5503300e5503344e55033c,SIP/2.0/UDP 152.100.10.22:5060;branch=z9hG4bKc75e3979f95e3979bd5e39793
    3. Call-ID: 262de6fd182de6fd5c2de6fddd2de6fda82de@152.100.10.22
    4. From: ;tag=1eb40c8f20b40c8f64b40c8fe5b40c8f
    5. To:
    6. CSeq: 777 MESSAGE
    7. Max-Forwards: 70
    8. Expires: 90
    9. User-Agent: GbAgent
    10. Contact:
    11. Content-Type: application/MANSCDP+xml
    12. Content-Length: 161
    13. "1.0"?>
    14. <Control>
    15. <CmdType>DeviceControlCmdType>
    16. <SN>30SN>
    17. <DeviceID>34020000011310000038DeviceID>
    18. <TeleBoot>BootTeleBoot>
    19. Control>

    对应的Android处理如下:

    如果在进行语音广播,先停掉广播数据接收和播放,重置目前状态,重新注册或有针对性的做其他处理即可。

    1. /*
    2. * MainActivity.java
    3. *
    4. * WebSite: https://daniusdk.com
    5. * Github: https://github.com/daniulive/SmarterStreaming
    6. *
    7. */
    8. @Override
    9. public void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue) {
    10. handler_.postDelayed(new Runnable() {
    11. @Override
    12. public void run() {
    13. Log.i(TAG, "ntsOnDeviceControlTeleBootCommand device_id:" + device_id_ + " tele_boot_value:" + tele_boot_value_);
    14. stopAudioPlayer();
    15. destoryRTPReceiver();
    16. if ( gb28181_agent_ != null) {
    17. if (gb_broadcast_source_id_ != null && gb_broadcast_target_id_ != null)
    18. gb28181_agent_.byeAudioBroadcast(gb_broadcast_source_id_, gb_broadcast_target_id_);
    19. }
    20. gb_broadcast_source_id_ = null;
    21. gb_broadcast_target_id_ = null;
    22. btnGB28181AudioBroadcast.setText("GB28181语音广播");
    23. btnGB28181AudioBroadcast.setEnabled(false);
    24. stopGB28181Stream();
    25. destoryRTPSender();
    26. if (gb28181_agent_ != null ) {
    27. gb28181_agent_.terminateAllPlays(true);
    28. gb28181_agent_.stop();
    29. }
    30. // 发送注销消息后,等待2000毫秒, 再释放资源
    31. handler_.postDelayed(new Runnable() {
    32. @Override
    33. public void run() {
    34. if (gb28181_agent_ != null ) {
    35. Log.i(TAG, " gb28181_agent_.unInitialize++");
    36. gb28181_agent_.unInitialize();
    37. gb28181_agent_.unBindLocalPort();
    38. gb28181_agent_.releaseSipStack();
    39. Log.i(TAG, " gb28181_agent_.unInitialize--");
    40. gb28181_agent_ = null;
    41. }
    42. // 200毫秒后再重启
    43. handler_.postDelayed(new Runnable() {
    44. @Override
    45. public void run() {
    46. Log.i(TAG, "restart gb sip agent.");
    47. if (null==gb28181_agent_) {
    48. if (!initGB28181Agent()) {
    49. Log.e(TAG, "init gb sip agent failed.");
    50. return;
    51. }
    52. }
    53. if (!gb28181_agent_.isRunning()) {
    54. if ( !gb28181_agent_.start() ) {
    55. Log.e(TAG, "restart gb sip agent failed.");
    56. }
    57. }
    58. }
    59. },200);
    60. }
    61. },2000);
    62. }
    63. private String device_id_;
    64. private String tele_boot_value_;
    65. public Runnable set(String device_id, String tele_boot_value) {
    66. this.device_id_ = device_id;
    67. this.tele_boot_value_ = tele_boot_value;
    68. return this;
    69. }
    70. }.set(deviceId, teleBootValue),0);
    71. }

    需要注意的是,由于国标平台虽有统一标准,但是实现细节并不统一,在做GB28181平台对接的时候,还是尽量以官网spec和其他相关规范为准。

  • 相关阅读:
    解决删除凭据管理器后仍然可以访问问题
    改进的DBSCAN算法(附open3d python代码)
    谷歌浏览器无法翻译已解决
    C++左移运算符重载、浅拷贝、深拷贝
    leetcode 139. 单词拆分
    文献 | 教师主观幸福感变迁:横断历史研究的视角
    Python爬虫何如抓包?这三个案例手把手教会你,非常详细...
    算法分析与设计 | 递归(数的计数)
    springboot毕设项目成长档案管理平台jf6j5(java+VUE+Mybatis+Maven+Mysql)
    剑指Offer--LeetCode刷题篇_day02
  • 原文地址:https://blog.csdn.net/renhui1112/article/details/126919057