Android平台GB28181设备接入端预置位查询(PresetQuery)探讨和技术实现

简介: 之前blog介绍了GB28181云台控制(PTZCmd)相关,本文主要是介绍下GB28181预置位查询。

之前blog介绍了GB28181云台控制(PTZCmd)相关,本文主要是介绍下GB28181预置位查询。


预置位这块,在处理带云台的设备非常必要,我们主要是做Android平台的GB28181的设备接入端,也可以转发RTSP摄像头接入到国标平台,如果摄像头带云台,这块的处理就非常必要。


废话不多说,我们先看看GB/T28181规范里面,是怎么说的:

请求命令消息体

Message消息头 Content-type头域为 Content-type:Application/MANSCDP+xml。


设备预置位查询命令采用 MANSCDP协议格式定义,详细描述见 A.2.4预置位查询请求。

用设备预置位查询请求命令应包括命令类型(CmdType)、命令序列号(SN)、设备编码(DeviceID),采

IETFRFC3428的 Message方法的消息体携带。

相关设备在收到 Message消息后,应立即返回200OK 应答,200OK 应答均无消息体。

应答命令消息体

Message消息头 Content-type头域为 Content-type:Application/MANSCDP+xml。

设备预置位查询应答命令采用 MANSCDP 协议格式定义,详细描述见 A.2.6 设备预置位查询

应答。

设备预置位查询应答命令应包括目标设备编码(DeviceID)、命令类型(CmdType)、命令序列号

(SN)、设备预置位列表(PresetList)等,设备预置位列表应包括预置位编码(PresetID)、预置位名称(PresetName),采用 Message方法的消息体携带。

相关设备在收到 Message消息后,应立即返回200OK 应答,200OK 应答均无消息体。

查询命令

国标平台侧发来RresetQuery:

MESSAGE sip:34020000001380000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.103:15060;rport;branch=z9hG4bK86811279
From: <sip:34020000002000000001@3402000000>;tag=373811279
To: <sip:34020000001380000001@3402000000>
Call-ID: 633811279
CSeq: 707 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: GBS Agent
Content-Length: 161
<?xml version="1.0" encoding="GB2312"?>
<Query>
  <CmdType>PresetQuery</CmdType>
  <SN>777811279</SN>
  <DeviceID>34020000001380000001</DeviceID>
</Query>

Android平台GB28181接入端先回个200 OK:

SIP/2.0 200 OK
CSeq: 707 MESSAGE
Call-ID: 633811279
From: <sip:34020000002000000001@3402000000>;tag=373811279
To: <sip:34020000001380000001@3402000000>
Via: SIP/2.0/UDP 192.168.0.103:15060;rport=15060;branch=z9hG4bK86811279;received=192.168.0.103
Content-Length: 0

Android平台GB28181接入端准备发设备预置位查询应答:


大牛直播SDK针对PresetQuery处理如下:

    @Override
    public void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId) {
        handler_.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "DaniuSDK ntsOnDevicePresetQueryCommand from_user_name:" + from_user_name_ + ", sn:" + sn_ + ", device_id:" + device_id_);
                List<com.gb.ntsignalling.PresetItem> preset_list = new LinkedList<>();
                preset_list.add(new com.gb.ntsignalling.PresetItem("1", "Android PreSet1"));
                preset_list.add(new com.gb.ntsignalling.PresetItem("2", "Android PreSet2"));
                if (gb28181_agent_ != null )
                    gb28181_agent_.respondDevicePresetQueryCommand(this.from_user_name_, this.from_user_name_at_domain_, this.sn_, this.device_id_, preset_list);
            }
            private String from_user_name_;
            private String from_user_name_at_domain_;
            private String sn_;
            private String device_id_;
            public Runnable set(String from_user_name, String from_user_name_at_domain,String sn, String device_id) {
                this.from_user_name_ = from_user_name;
                this.from_user_name_at_domain_ = from_user_name_at_domain;
                this.sn_ = sn;
                this.device_id_ = device_id;
                return this;
            }
        }.set(fromUserName, fromUserNameAtDomain, sn, deviceId),0);
    }

对应的MESSAGE信令:

MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Call-ID: 1b5a50faff369b89c45a5f212a1d45ee@192.168.0.101
CSeq: 1524938865 MESSAGE
From: <sip:31011500991320000069@3402000000>;tag=15640a33
To: <sip:34020000002000000001@3402000000>
Via: SIP/2.0/UDP 192.168.0.101:5060;rport;branch=z9hG4bK-393533-93979b9fc4dcf1edee6742c861522fb4
Max-Forwards: 70
User-Agent: NT GB UserAgent V1.9-20221027
Content-Type: Application/MANSCDP+xml
Content-Length: 364
<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>PresetQuery</CmdType>
<SN>777811279</SN>
<DeviceID>34020000001380000001</DeviceID>
<PresetList Num="2">
<Item>
<PresetID>1</PresetID>
<PresetName>Android PreSet1</PresetName>
</Item>
<Item>
<PresetID>2</PresetID>
<PresetName>Android PreSet2</PresetName>
</Item>
</PresetList>
</Response>

国标平台侧回个200 OK:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.101:5060;rport=5060;received=192.168.0.101;branch=z9hG4bK-393533-93979b9fc4dcf1edee6742c861522fb4
From: <sip:31011500991320000069@3402000000>;tag=15640a33
To: <sip:34020000002000000001@3402000000>;tag=578811338
CSeq: 1524938865 MESSAGE
Call-ID: 1b5a50faff369b89c45a5f212a1d45ee@192.168.0.101
User-Agent: GBS Agent
Content-Length: 0

国标平台侧拿到预置位信息后,可以针对预置位进行设置、调用或删除,GB/T28181-2016技术规范书上对应的预置位指令如下:

bc4435809931487998362dec8226c09d.png

我们以设置预置位为例:


国标平台侧发来设置指令:

    MESSAGE sip:34020000001380000001@3402000000 SIP/2.0
    Via: SIP/2.0/UDP 192.168.0.103:15060;rport=15060;branch=z9hG4bK615818572;received=192.168.0.103
    From: <sip:34020000002000000001@3402000000>;tag=696818572
    To: <sip:34020000001380000001@3402000000>
    Call-ID: 578818572
    CSeq: 709 MESSAGE
    Content-Type: Application/MANSCDP+xml
    Max-Forwards: 70
    User-Agent: GBS Agent
    Content-Length: 267
    <?xml version="1.0" encoding="GB2312"?>
    <Control>
      <CmdType>DeviceControl</CmdType>
      <SN>347818572</SN>
      <DeviceID>34020000001380000001</DeviceID>
      <PTZCmd>A50F018100010037</PTZCmd>
      <Info>
        <ControlPriority>5</ControlPriority>
      </Info>
    </Control>

Android平台GB28181设备接入端处理如下:

    @Override
    public void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue) {
        handler_.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "DaniuSDK ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_);
                if (null == ptz_type_)
                    return;
                ptz_type_ = ptz_type_.trim();
                if (ptz_type_.length() != 16)
                    return;
                int instruction = hexStringToInt(ptz_type_.substring(6, 8));
                int combination_code2 = hexStringToInt(ptz_type_.substring(12, 14));
                //Android平台GB28181设备接入端,针对性的解析处理即可,这里不再赘述
            private String device_id_;
            private String ptz_type_;
            public Runnable set(String device_id, String ptz_type) {
                this.device_id_ = device_id;
                this.ptz_type_ = ptz_type;
                return this;
            }
        }.set(deviceId, typeValue),0);
    }

预置位调用、删除也是上述类似处理。

总结

Android平台GB28181设备接入端,特别是针对RTSP转GB28181的场景下,如摄像头带云台,预置位的查询、调用设置可酌情考虑添加。当然,单纯地Android平台GB28181设备接入端,也可以针对预置位这块,做技术层面的扩展,通过技术拉通,让设备测接入端更灵活,更能满足客制化需求。

相关文章
|
1天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比:选择适合你的平台
【7月更文挑战第26天】在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文将深入探索这两个平台的软件开发环境,从编程语言、工具集到用户界面设计,全方位比较它们的差异与优势。无论你是初涉移动开发的新手,还是寻求转型的资深开发者,这篇文章都将为你提供宝贵的参考信息,助你做出明智的选择。
|
8天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第19天】在移动开发的广阔天地中,安卓与iOS两大阵营各据一方,它们在开发环境、用户界面设计、性能优化等方面展现出独特的魅力与挑战。本文旨在深入探讨这两个平台在技术开发和用户体验上的根本差异,并分析这些差异如何影响开发者的策略和最终用户的选择。通过比较两者的编程语言、工具、框架以及设计理念,我们将揭示各自平台的优势与局限,为开发者提供实用的参考,并为消费者呈现一个更加清晰的平台选择视角。
|
1天前
|
Android开发 数据安全/隐私保护 iOS开发
探索未来:安卓与iOS在智能穿戴设备领域的较量
随着科技的飞速发展,智能穿戴设备已逐渐成为我们日常生活的一部分。从健康监测到通讯交流,它们正以惊人的速度改变着我们的生活方式。本文将深入探讨安卓和iOS这两大操作系统在智能穿戴领域的现状、竞争以及未来发展趋势,揭示它们如何通过创新技术满足用户需求,并预测未来可能的发展方向。
5 0
|
2天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析:选择适合自己的编程平台
移动应用开发的两大阵营——安卓和iOS,各自拥有不同的开发环境和工具集。本文通过深入比较这两个平台的编程语言、集成开发环境(IDE)、用户界面设计、测试框架以及部署流程,旨在为开发者提供一个全面的视角来选择最符合个人或项目需求的开发环境。
|
8天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,安卓与iOS两大阵营各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、编程语言、用户界面设计以及性能优化方面的差异,并分析这些差异如何影响最终的用户体验。通过数据支持的案例分析和最新的市场研究,我们将揭示开发者如何在这两个不同的生态系统中做出战略决策,以及这些决策对应用成功的潜在影响。
|
16天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼,各自拥有独特的开发生态和用户群体。本文将深入分析这两个平台的显著差异,从技术架构到开发工具,再到市场定位,揭示它们之间的异同。通过比较,我们不仅能够更好地理解各自的优势和局限,还能洞察未来移动应用开发的趋势。
|
19天前
|
Java Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【7月更文挑战第8天】在移动应用开发的广阔天地中,Android与iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场覆盖等方面的根本差异,并分析这些差异如何影响项目的成功。通过比较和分析,旨在为开发者在选择平台时提供更全面的视角,帮助他们根据项目需求和目标市场做出更明智的决策。
|
12天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
57 15
|
4天前
|
前端开发 Android开发 iOS开发
探索安卓与iOS开发的差异性与互补性
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统各据一方,引领着市场潮流。它们在技术架构、开发环境及用户群体等方面展现出独特的差异性,同时也存在着潜在的互补性。本文将深入剖析这两种平台的开发细节,从不同角度揭示其各自优势及相互之间的协同潜力,为开发者提供全面而深刻的视角。
10 2
|
10天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异性与互操作性
【7月更文挑战第17天】在移动应用开发的广阔天地中,安卓和iOS这两大操作系统如同双子星座般璀璨夺目。它们各自拥有独特的开发环境、编程语言和用户群体,为开发者提供了不同的挑战和机遇。本文将从多个维度深入剖析安卓与iOS开发的差异性,并探讨它们之间的互操作性如何实现,以期为开发者们提供一份实用的指南。
24 7