文章目录

  • 一、看协议文档
  • 二、具体代码实现

一、看协议文档

网上资料挺少的,求人不如求己,打铁还需自身硬,啃文档是最直接的学习方式。国标28181对ptz信令这块,有确切的描述。



其实文档里已经说的很清楚了,就是一些字节方面的移位操作,当然实现方式很多种。我下面列出我实现的一种方式。

二、具体代码实现

云台请求相关接口:

bool GB28181Srv::RequestPTZ(stuDev *pDev, ePTZCmd eCmd, int iSpeed, int iSpeed2)
{if (pDev == NULL)return false;QString sCmd = GetStrFromPTZCmd(eCmd, iSpeed, iSpeed2);QString sBody;sBody.sprintf("<?xml version=\"1.0\"?>\r\n""<Control>\r\n""  <CmdType>DeviceControl</CmdType>\r\n""  <SN>%d</SN>\r\n""  <DeviceID>%s</DeviceID>\r\n""  <PTZCmd>%s</PTZCmd>\r\n""</Control>\r\n", ++m_iRequestMessageSN, pDev->m_sDevCode.toStdString().data(), sCmd.toStdString().data());int ret = SendRequestMessage(pDev->m_sDevCode, pDev->m_sDevIp, pDev->m_iDevPort, "Application/MANSCDP+xml", sBody);return !ret;
}

关键部分,写的比较挫,各位看官将就看下:

QString GB28181Srv::GetStrFromPTZCmd(ePTZCmd eCmd, quint8 iSpeed, quint8 iSpeed2)
{QString sCmd = "A50F00";switch (eCmd){case ePTZUp:case ePTZUpStop:sCmd += eCmd == ePTZUp ? "0800" : "0000";sCmd += eCmd == ePTZUp ? GetHexFromInt(iSpeed) : "00";sCmd += "00";sCmd += eCmd == ePTZUp ? GetCrcFromPTZCmd(165 + 15 + 0 + 8 + 0 + iSpeed + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZDown:case ePTZDownStop:sCmd += eCmd == ePTZDown ? "0400" : "0000";sCmd += eCmd == ePTZDown ? GetHexFromInt(iSpeed) : "00";sCmd += "00";sCmd += eCmd == ePTZDown ? GetCrcFromPTZCmd(165 + 15 + 0 + 4 + 0 + iSpeed + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZLeft:case ePTZLeftStop:sCmd += eCmd == ePTZLeft ? "02" : "00";sCmd += eCmd == ePTZLeft ? GetHexFromInt(iSpeed) : "00";sCmd += "0000";sCmd += eCmd == ePTZLeft ? GetCrcFromPTZCmd(165 + 15 + 0 + 2 + iSpeed + 0 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZRight:case ePTZRightStop:sCmd += eCmd == ePTZRight ? "01" : "00";sCmd += eCmd == ePTZRight ? GetHexFromInt(iSpeed) : "00";sCmd += "0000";sCmd += eCmd == ePTZRight ? GetCrcFromPTZCmd(165 + 15 + 0 + 1 + iSpeed + 0 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZUpLeft:case ePTZUpLeftStop:sCmd += eCmd == ePTZUpLeft ? "0A" : "00";sCmd += eCmd == ePTZUpLeft ? GetHexFromInt(iSpeed) : "00";sCmd += eCmd == ePTZUpLeft ? GetHexFromInt(iSpeed2) : "00";sCmd += "00";sCmd += eCmd == ePTZUpLeft ? GetCrcFromPTZCmd(165 + 15 + 0 + 10 + iSpeed + iSpeed2 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZUpRight:case ePTZUpRightStop:sCmd += eCmd == ePTZUpRight ? "09" : "00";sCmd += eCmd == ePTZUpRight ? GetHexFromInt(iSpeed) : "00";sCmd += eCmd == ePTZUpRight ? GetHexFromInt(iSpeed2) : "00";sCmd += "00";sCmd += eCmd == ePTZUpRight ? GetCrcFromPTZCmd(165 + 15 + 0 + 9 + iSpeed + iSpeed2 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZDownLeft:case ePTZDownLeftStop:sCmd += eCmd == ePTZDownLeft ? "06" : "00";sCmd += eCmd == ePTZDownLeft ? GetHexFromInt(iSpeed) : "00";sCmd += eCmd == ePTZDownLeft ? GetHexFromInt(iSpeed2) : "00";sCmd += "00";sCmd += eCmd == ePTZDownLeft ? GetCrcFromPTZCmd(165 + 15 + 0 + 6 + iSpeed + iSpeed2 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZDownRight:case ePTZDownRightStop:sCmd += eCmd == ePTZDownRight ? "05" : "00";sCmd += eCmd == ePTZDownRight ? GetHexFromInt(iSpeed) : "00";sCmd += eCmd == ePTZDownRight ? GetHexFromInt(iSpeed2) : "00";sCmd += "00";sCmd += eCmd == ePTZDownRight ? GetCrcFromPTZCmd(165 + 15 + 0 + 5 + iSpeed + iSpeed2 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZZoomIn:case ePTZZoomInStop:sCmd += eCmd == ePTZZoomIn ? "100000" : "000000";sCmd += eCmd == ePTZZoomIn ? GetHexFromInt(iSpeed * 16) : "00";sCmd += eCmd == ePTZZoomIn ? GetCrcFromPTZCmd(165 + 15 + 0 + 16 + 0 + 0 + iSpeed * 16) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZZoomOut:case ePTZZoomOutStop:sCmd += eCmd == ePTZZoomOut ? "200000" : "000000";sCmd += eCmd == ePTZZoomOut ? GetHexFromInt(iSpeed * 16) : "00";sCmd += eCmd == ePTZZoomOut ? GetCrcFromPTZCmd(165 + 15 + 0 + 32 + 0 + 0 + iSpeed * 16) : GetCrcFromPTZCmd(165 + 15 + 0 + 0 + 0 + 0 + 0);break;case ePTZFocusFar:case ePTZFocusFarStop:sCmd += eCmd == ePTZFocusFar ? "41": "40";sCmd += eCmd == ePTZFocusFar ? GetHexFromInt(iSpeed) : "00";sCmd += "0000";sCmd += eCmd == ePTZFocusFar ? GetCrcFromPTZCmd(165 + 15 + 0 + 65 + iSpeed + 0 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 64 + 0 + 0 + 0);break;case ePTZFocusNear:case ePTZFocusNearStop:sCmd += eCmd == ePTZFocusNear ? "42" : "40";sCmd += eCmd == ePTZFocusNear ? GetHexFromInt(iSpeed) : "00";sCmd += "0000";sCmd += eCmd == ePTZFocusNear ? GetCrcFromPTZCmd(165 + 15 + 0 + 66 + iSpeed + 0 + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 64 + 0 + 0 + 0);break;case ePTZIrisIn:case ePTZIrisInStop:sCmd += eCmd == ePTZIrisIn ? "4400" : "4000";sCmd += eCmd == ePTZIrisIn ? GetHexFromInt(iSpeed) : "00";sCmd += "00";sCmd += eCmd == ePTZIrisIn ? GetCrcFromPTZCmd(165 + 15 + 0 + 68 + 0 + iSpeed + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 64 + 0 + 0 + 0);break;case ePTZIrisOut:case ePTZIrisOutStop:sCmd += eCmd == ePTZIrisOut ? "4800" : "4000";sCmd += eCmd == ePTZIrisOut ? GetHexFromInt(iSpeed) : "00";sCmd += "00";sCmd += eCmd == ePTZIrisOut ? GetCrcFromPTZCmd(165 + 15 + 0 + 72 + 0 + iSpeed + 0) : GetCrcFromPTZCmd(165 + 15 + 0 + 64 + 0 + 0 + 0);break;default:break;}return sCmd;
}

先这样,该睡了。不懂的再联系

国标28181之服务端下发云台PTZ命令浅谈相关推荐

  1. Android模拟服务端下发消息的Socket通讯工具

    Android模拟服务端下发消息的Socket通讯工具 1. 背景简介 背景简介: 有些场景需要依赖服务端下发消息到客户端,比如PowerMsg,服务端下发消息Type,客户端解析Type做出相应动作 ...

  2. 【罗开传奇】传奇服务端调整人物属性脚本命令ChangeHumAbility

    [罗开传奇]传奇服务端调整人物属性脚本命令ChangeHumAbility 功能: 调整人物属性 格式: ChangeHumAbility 属性(1-20) 操作符(+ = -) 效果(1-65535 ...

  3. 传奇服务端常见gameofblue脚本命令代码详解

    传奇服务端常见gameofblue脚本命令代码详解 gameofblue脚本命令详解 [@段] ;段用英文或数字表示 goto @段 ;跳转到指定段,开始执行相当于B中的goto语句 #say 语句 ...

  4. 暴ol登录001服务器无响应,925科技幻姬传说单机服务端(更新部分GM命令)

    925科技,幻姬传说单机服务端(更新部分GM命令) ========================================================================== ...

  5. Android动态加载dex文件/jar包的纯原生代码实现(dex文件由服务端下发)

    介绍原理的文章有很多,我就不再多说,直奔主题: 一.生成dex文件(源码下载地址:https://download.csdn.net/download/wanggangyanqing/18658862 ...

  6. 有关AudioTrack播放服务端传过来的音频有强电流声的问题

    最近一直接调国标28181协议,有关音频的也调了很久,发现服务端下发的音频,在Android端用AudioTrack播放,过了好几秒后就渐渐地出现电流声,而且电流声也越来越强.... 其实这个问题,之 ...

  7. 国标28181:IPC信号检索设备目录查询

    待IPC客户端注册了服务端之后,服务端就应该查询设备 设备目录查询 设备目录查询是国标平台对国标设备接入的目录查询,目的是查询该设备带有的监控点和报警设备信息以及语音设备信息. 使用场景: 比如平台国 ...

  8. 服务端构架干货:快节奏多人游戏的技术实现

    stanleyluo编译 一.简介 序 本文是探索如何制作快节奏多人游戏相关技术和算法的系列文章中的第一章.如果你熟悉多人游戏背后的概念,可以放心跳过本章 - 接下来是一些介绍性的讨论. 作弊问题 一 ...

  9. spring webscoket服务端使用记录

    记录spring4中websocket的使用方式 pom jar包配置 <dependency> <groupId>org.springframework</groupI ...

最新文章

  1. 366万常用的中 txt 网盘_推荐三款我常用于备份文件的网盘,堪称精品中的精品,建议收藏!...
  2. 开发75条(写的不错) 选择自 churujianghu 的 Blog
  3. mybatis 时间_开发工具:Mybatis.Plus.插件三种方式的逆向工程
  4. 反思沟通交流对象:与善人居 不明着懒 更不暗着懒
  5. python函数定义和调用_函数定义和调用
  6. [转载]监控 Linux 性能的 18 个命令行工具
  7. 华人、华侨、华裔之间究竟有什么区别?
  8. sql如何粘贴一列不同的数值_原来Excel的复制粘贴有这么多不为人知的用法
  9. 出现类似于 ”IDD_DLG_WAIT 未声明的标识符“ 这样的错误怎么办
  10. sping加载bean都发生了些什么
  11. 美图大咖-电商图片处理软件
  12. springAop遇到的问题
  13. Android 自定义View
  14. 使用ajax报405错误
  15. iOS中开发者账号分类
  16. 化学计算机模拟计算,计算机化工辅助计算
  17. 电动汽车的N种充电方式
  18. 广州app开发:移动app排行榜出炉
  19. 通信算法之九十七:4G LTE通信系统 PHICH信道处理流程
  20. MVVC 框架的介绍

热门文章

  1. svn切换账号的问题
  2. 磁盘使用率达到80%报警
  3. 判断四个点是否能形成正方形
  4. photoshop cs6 简体中文正式版下载
  5. 什么是VMOS功率场效应管,工作原理是什么
  6. 手机上如何传图识字?
  7. 神秘电影质感开场预告pr视频模板 PR开场视频模板
  8. 存储芯片行业信息汇总
  9. sql 纵向求和_【IT专家】SQL2000 动态行转列+ 横向纵向合计的问题
  10. flash计算机基础实验,计算机应用基础实验报告(flash).pdf