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

news2024/11/18 13:56:16

之前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技术规范书上对应的预置位指令如下:

 我们以设置预置位为例:

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

    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设备接入端,也可以针对预置位这块,做技术层面的扩展,通过技术拉通,让设备测接入端更灵活,更能满足客制化需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

F3--FPGA读写EEPROM实例2022-12-12

1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入式控制系统中常常用来保存设备初始化所需数据。发展过程&#xff1a;ROM – > PROM –> EPROM –> EEPROM&…

移动Web基础知识点大全

移动Web基础知识点大全移动Web1、字体图标2、平面转换3、渐变4、空间转换5、动画6、移动端特点7、百分比布局8、Flex布局9、移动适配9.1 rem9.2 less9.3 vw/vh10、媒体查询11、BootStrap移动Web 1、字体图标 目标&#xff1a;使用字体图标实现网页中简洁的图标效果字体图标 字…

数据技术篇之实时技术

第5章 实时技术 在大数据系统中&#xff0c;离线批处理技术可以满足非常多的数据使用场景需求&#xff0c;但在 DT 时代&#xff0c; 每天面对的信息是瞬息万变的&#xff0c;越来越多的应用场景对数据的时效性提出了更高的要求。数据价值是具有时效性的&#xff0c;在一条数据…

霸榜,这本《程序员如何向架构师转型》在Github已持续置顶两月

前言 企业架构在过去十年中取得了长足的进步。随着越来越多新技术出现&#xff0c;充分利用这些因素来将企业架构创建得更好十分重要。通过将新技术集成到企业架构中&#xff0c;即使在困难时期&#xff0c;也能取得丰硕的成果。 现代企业架构师的 5 个特征&#xff1a; 1. …

移动端插件-IScroll列表滑动、区块滑动

iScrol l是一个高性能&#xff0c;资源占用少&#xff0c;无依赖&#xff0c;多平台的javascript滚动插件(4kb)。 官方&#xff1a; iScroll 访问不了 (iscrolljs.com) iScroll github (https://github.com/cubiq/iscroll) -> build 文件夹 包含各个版本 iScroll 中文…

国内智能手表行业数据浅析

大家好&#xff0c;这里是小安说网控。 智能手表&#xff0c;作为智能穿戴的一种&#xff0c;大大方便了人们的生活。 2022年9月份&#xff0c;我国智能手表产量当期值695.6万个&#xff0c;同比增长21.4%&#xff1b;10月份当期值为552.6万个&#xff0c;同比下滑16.5%。1-10月…

宝塔面板打不开怎么登录进入宝塔页面

浏览器新建标签页&#xff0c;输入服务器公网地址ip&#xff0c;后面加:8888&#xff0c;例如 1.2.3.4:8888 &#xff08;服务器公网地址IP可在云服务器 → 实例→公网IP 查看&#xff09; 删除默认用户名&#xff0c;创建设置你的用户名和密码&#xff0c;确定&#xff0c;登陆…

基于不可否认技术的珍贵古籍线上交易系统设计与实现(JavaWeb的图书商城系统)

目 录 摘 要 I ABSTRACT I 引言 1 1 绪论 1 1.1 课题背景与意义 1 1.2 本文的总体结构 1 2 开发工具及技术 2 2.1 开发工具 2 2.1.1 前台使用技术 2 2.1.2 后台使用技术 2 2.1.3 后端使用技术 3 2.2 B/S架构 3 2.3 软硬件需求 3 3 系统的需求分析和概要设计 3 3.1 可行性分析 3…

IPv6升级转换最新消息,全在这一篇了!-中科三方

工信部部长苗圩&#xff1a;加快“双千兆”建设&#xff0c;提升IPv6网络服务能力 工信部部长苗圩在第19届中国互联网大会上指出&#xff0c;过去一年&#xff0c;互联网行业扎实推进各项工作&#xff0c;在基础设施建设、产业实力提升、融合应用深化等方面不断取得新的…

JavaSE03

Idea中自动生成构造器和get,set的快捷键&#xff1a;altinsert 关于继承的访问&#xff1a; this和super的用法&#xff1a; 子类中的所有构造方法默认都会访问父类中无参构造方法 重写&#xff1a; 重写注意&#xff1a;1.父类中的私有方法&#xff0c;子类不能重写。2.子…

火遍全网的chatGPT(文末有彩蛋)

最近网上非常火爆的CHATGPT&#xff0c;它是OpenAI开发的一款开源的自然语言处理 (NLP) 模型&#xff0c;用于实现对话生成和语言模型预测。CHATGPT 模型基于 GPT-3 (Generative Pretrained Transformer 3) 模型构建&#xff0c;拥有语言理解和文本生成能力。CHATGPT 模型可以用…

分库分表、Memory引擎、代理逐渐、主从复制、IP直连问题

文章目录几千万数据量大表做MySQL主从崩了&#xff0c;该如何优化&#xff1f;为啥禁用IP直连为啥主键使用代理主键&#xff0c;而不是业务主键报表分析使用ESExplain 可视化Visual_Explain一致性Hash解决MySQL分库库容问题不建议在 Docker 中跑 Mysql优雅地进行数据归档倒排索…

《自己动手写CPU》学习记录(8)——第7章/Part 1

目录 引言 致谢 指令说明 add、addu、sub、subu、slt、sltu addi、addiu、slti、sltiu clo、clz multu、mult、mul 设计 宏定义 译码模块 指令执行模块 仿真 仿真程序 仿真结果 引言 随章节进度继续推进&#xff0c;本章继续实现 算术运算 指令等其他操作指令。…

CVPR2020-Meshed-Memory Transformer for Image Captioning

论文地址&#xff1a;Meshed-Memory Transformer for Image Captioning (thecvf.com) Background 本文在transformer的基础上&#xff0c;对于Image Caption任务&#xff0c;提出了一个全新的fully-attentive网络。在此之前大部分image captioning的工作还是基于CNN进行特征提…

error: (-215:Assertion failed) !ssize.empty() in function ‘cv::resize‘

网上以及说来很多方法了&#xff0c; 1.图片路径写成了如下形式&#xff1a;C:\Users\Desktop\test 正确的应该为&#xff1a;C:/Users/Desktop/test/ &#xff08;在程序中斜杠‘\’有转义字符含义&#xff09; 2.图片路径少写了一个斜杠&#xff08;图片存放在test文件夹中&…

深度强化学习

参考1. 引言 — 动手学深度学习 2.0.0 documentation 深度强化学习&#xff08;deep reinforcement learning&#xff09;将深度学习应用于强化学习的问题&#xff0c;是非常热门的研究领域。 突破性的深度Q网络&#xff08;Q-network&#xff09;在雅达利游戏中仅使用视觉输入…

easy-jenkins自动化部署

项目简介 easy-jenkins是一款可以对本地项目进行一键自动化部署的一款简易工具,可以很方便地将平常我们java开发中的springboot项目自动打包成jar包以及vue等前端项目也进行一键构建上传服务器进行部署,更加简化了jenkins的繁琐配置,对于使用者来说更加友好与方便 我们在使用时…

五面阿里巴巴拿offer后定级P6:分享Java面经及答案总结

一面(电话) 说说对JVM的理解 treemap和hashmap有什么区别&#xff1f; Java多线程的的5大状态图流转 mysql主键和唯一索引的区别 说说最近的项目 如何实现session共享&#xff0c;用redis如何实现 缓存击穿的概念和解决方案 说说微服务&#xff0c;微服务之间如何管理 二…

Python tkinter -- 第18章 画布控件之线段(line)

**18.2.17 create_line(coords, options) 根据 coords 给定的坐标&#xff0c;在画布上创建一条或多条线段。 如果给定的坐标超过两个点&#xff0c;则会首尾相连变成一条折线。 #直线 import tkinter as tk roottk.Tk() root.geometry(320x240) b1tk.Canvas(root) b1.create_…