安卓GB28181云台控制和预置位查询
多数安卓手机摄像头是支持调焦距的, GB28181标准定义了云台操作, 只要安卓端实现云台XML指令解析, 实时视频回看时远程控制安卓摄像头焦距调整是一个很实用的功能。
GB28181云台控制属于设备控制的一部分,使用SIP Message方法实现,走无应答命令流程。和云台相关的还有预置位查询,要走有应答命令流程。
云台控制和其他设备控制的XML定义差不多, 下面是一个具体的实例:
<?xml version="1.0" encoding="GB2312"?><Control><CmdType>DeviceControl</CmdType><SN>32211</SN><DeviceID>31010000011380000013</DeviceID><PTZCmd>A50F0100000000B5</PTZCmd></Control>
XML中最关键的是PTZCmd元素, PTZCmd在GB28181-2016中有详细定义,总共8个字节,定义格式如下:
字节 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | 字节8 |
含义 | A5H | 组合码1 | 地址 | 指令 | 数据1 | 数据2 | 组合码2 | 校验码 |
8个字节中,最重要的字节4(指令码), 定义了云台各种操作类型。字节5, 6, 7主要用来传递指令相关参数。
字节1是首字节,固定为A5H。
针对PTZ, 字节4的第7和第6位都是0, 第5和第4位用来镜头调焦距, 第3和第2位是云台垂直方向控制, 第1和第0位是云台水平方向控制。解析时需要注意的是镜头焦距调整指令, 云台垂直上下指令、云台水平左右指令三者可以组合, 可能一条控制消息要执行三种类型的云台控制, 实际实现中要处理好。
实际云台操作中,会先发一个云台控制SIP Message, 紧接着再发一个云台停止指令SIP Message,云台停止指令中字节4的每一位都为0。
更详细定义请参考28181-2016文档A.3,指令解析实现还是比较容易的。
预置位查询属于网络设备信息查询的一部分,也使用SIP Message方法实现, 和云台控制不同的是,需要有响应消息, 下面给出一个查询和响应的具体XML实例:
<?xml version="1.0" encoding="GB2312"?><Query><CmdType>PresetQuery</CmdType><SN>7733</SN><DeviceID>31010000011380000021</DeviceID></Query>
<?xml version="1.0" encoding="GB2312"?><Response><CmdType>PresetQuery</CmdType><SN>7733</SN><DeviceID>31010000011380000021</DeviceID><PresetList Num="2"><Item><PresetID>1</PresetID><PresetName>安卓预置位1</PresetName></Item><Item><PresetID>2</PresetID><PresetName>安卓预置位2</PresetName></Item></PresetList></Response>
定义接口和Demo代码:
// Github: https://github.com/daniulive/SmarterStreaming
// Copyright (C) 1130758427@qq.compackage com.gb.ntsignalling;public interface GBSIPAgentDeviceControlListener {/** 收到远程启动控制命令*/void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue);/** 云台控制*/void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue);
}package com.gb.ntsignalling;public interface GBSIPAgentQueryCommandListener {/** 设备预置位查询*/void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId);
}package com.gb.ntsignalling;public interface GBSIPAgent {void addDeviceControlListener(GBSIPAgentDeviceControlListener deviceControlListener);void addQueryCommandListener(GBSIPAgentQueryCommandListener queryCommandListener);/*预置位查询应答*/boolean respondDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId, java.util.List<PresetItem> presetList);
}public class MyAndroidG8181DemoImpl implements GBSIPAgentDeviceControlListener,GBSIPAgentQueryCommandListener {@Overridepublic void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue) {handler_.postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "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));if ((instruction & 0xc0) == 0 ) {if ((instruction & 0x20) != 0) {// Zoom Outint zoom_speed = (combination_code2 >> 4) & 0xf;Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_ + " Zoom Out, speed:" +zoom_speed);cameraZoom(true, zoom_speed);}else if ((instruction & 0x10) != 0) {// Zoom Inint zoom_speed = (combination_code2 >> 4) & 0xf;Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_ + " Zoom In, speed:" +zoom_speed);cameraZoom(false, zoom_speed);}}}int hexStringToInt(String hex) {if (null == hex)return 0;try{int v = Integer.parseInt(hex, 16);return v;}catch (Exception e) {return 0;}}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);}@Overridepublic void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId) {handler_.postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "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", "安卓预置位1"));preset_list.add(new com.gb.ntsignalling.PresetItem("2", "安卓预置位2"));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);}}
上面的代码我只实现了对焦距控制的指令解析,如果想处理其他云台指令,解析代码类似,不难实现,测试安卓机前后摄像头都支持焦距调节,实际测下来,效果还可以。
安卓GB28181云台控制和预置位查询相关推荐
- 宇视摄像机云台控制预置位、巡航如何配置
Q: 宇视摄像机云台控制预置位.巡航如何配置 A: 预置位:设置预置位,或者对云台摄像机进行一些方向控制操作: 巡航:巡航路线是指云台摄像机在预置位之间转动的路线,可以设置云台在每个预置位的停留时间. ...
- Qt编写安防视频监控系统33-onvif云台控制
一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...
- Unity3d C#通过使用大华SDK控制大华摄像头旋转、变焦等云台操作和预置点等控制操作(含源码)
前言 本文的内容和在之前我写过Unity3d C# 接入海康威视摄像头SDK实现接口控制功能(如:控制云台)的文章基本类似,同样是通过官网提供的SDK进行开发,只不过针对的设备不同,和部分实现细节不同 ...
- Qt编写监控Onvif综合示例(支持云台/预置位/抓图/事件订阅等)
一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...
- Android平台GB28181设备接入模块之球机/云台控制探究
技术背景 好多开发者在做GB28181设备接入的时候,问云台控制是否可以处理(亦或拉取外部RTSP摄像头,通过命令中转的方式,控制摄像头),实际上云台控制命令相对来说还是比较好处理的.协议规范有明确说 ...
- SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制
SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...
- 用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁
//用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁 #include<reg52.h> // 包含52单片机寄存器定义的头文件 #def ...
- onvif协议之云台控制
onvif云台控制,还有有点麻烦的,主要是不知道参数如何填写,通过接近一天的摸索,终于有点名目了. 我使用的是ContinuousMove这个api,介绍如下,网址https://www.onvif. ...
- 结合实战,浅析GB/T28181(七)—— 球机云台控制
1 简介说明 28181设备控制包括球机/云台控制.录像控制.报警布放/撤防及复位.设备配置等类型,本节主要介绍球机/云台控制流程.协议规定,及实战对接时碰到的常见问题和排查思路. 依据规范定义,球机 ...
最新文章
- 关于建立智能车竞赛开发资源中心的汇报PPT
- 抓包概念大比较:数据报、数据包、分组
- CentOS7 64位下 MySQL5.7的安装与配置(YUM)
- 汽车销售网页html模板,汽车经销商HTML模板
- 计算机辅助设计与图像学学报 改后发表,几种常见图像二值化方法的结果对比与分析...
- mysql中distinct走索引吗_MySQL中索引优化distinct语句及distinct的多字段操作
- 前端笔记 | CSS进阶
- 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
- hadoop日常维护之问题解决01
- integer判断是否为null_面试常考题JavaScript用七种方式教你判断一个变量是否为数组类型...
- 淘宝店铺装修旺铺基础版全屏轮播代码效果1920PX海报
- pm2开启nuxt项目pm2 start ./node_modules/nuxt/bin/nuxt-start
- 计算机专业自考本需要学哪几门,自考本科都考哪些科目?一次考几门?
- 移动硬盘上安装Ubuntu18.04系统
- Busybox 1.17.4 编译及错误解决方案
- Android 入门宝典 - inflate 生成视图 动态加载视图
- java ctr_分组密码_计数器(CTR)模式_原理及java实现
- 用UltraIso便捷版制作万能隐藏启动U盘
- 软件工程之开发与测试对缺陷重现条件的常见误解
- 赛效:安卓APP移动应用图标一键生成如何实现
热门文章
- 【Vue】 favicon.ico:1 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found)
- MusicPlay播放器
- 利用Java生成二维码
- rebar3编译及发布erlang程序
- 单片机IO口应用-独立按键控制LED以及控制LED灯闪烁
- 2021年全球与中国印刷机行业市场规模及发展前景分析
- Termux安装数据库(手机安装数据库)...
- 通过硬件修改PWLINK2 Lite的VDD电压的方法 V1.0
- 计算机鼠标一直转圈圈 打不开文件,电脑鼠标一直在转圈圈,什么软件也打不开,也关不了机怎么处理...
- 国家知识产权局局长申长雨发言:将打击各种侵权行为,新电商法实施:“无商标,无专利,无版权”产品将会面临侵权强制下架和赔偿等。2022品牌年,拼速度。