GB/T28181无人机行业应用指导

  1. 概述

本文档主要描述大疆无人机应用于行业视频联网场景中,采用GB28181国标与三方云平台对接的接口使用指南。

    1. GB/T28181简介

2015年5月,原中央综治办、发展改革委、公安部等九部委下发了《关于加强公共安全视频监控建设联网应用工作的若干意见》(发改高技[2015]996号),提出到2020年,基本实现“全域覆盖、全网共享、全时可用、全程可控”的总体目标。

2017年9月,中央综治办秘书室、国家发展改革委办公厅、公安部办公厅、国家标准委办公室联合印发《公共安全视频图像信息联网共享应用标准体系(2017版)》,将国家标准《公共安全视频图像信息联网共享应用总体要求》纳入标准体系。

GB/T28181共有3个版本:

  1. GB/T28181-2012(过期,已被2016取代)
  2. GB/T28181-2016(现行,我们当前支持的版本)
  3. GB/T28181-2021(起草中,计划取代2016)
    1. GB/T28181功能

功能分类

功能列表

相关命令

协议文档

是否支持

注册和注销

SIP注册

REGISTER

已支持

SIP注销

REGISTER

已支持

实时视音频点播

开始直播推流

INVITE/SDP/Play

已支持

结束直播推流

BYE

已支持

设备控制

控制命令

MESSAGE/Control/DeviceControl

9.3 A.2.3a

部分支持

设备配置

MESSAGE/Control/DeviceConfig

9.3 A.2.3a

部分支持

设备报警

报警通知

MESSAGE/Notify/Alarm

9.4 A.5.b

不支持

网络设备信息查询

设备目录查询

MESSAGE/Query/Catalog

9.5.3.1 A.2.4

已支持

设备信息查询

MESSAGE/Query/DeviceInfo

已支持

设备状态查询

MESSAGE/Query/DeviceStatus

已支持

设备配置查询

MESSAGE/Query/ConfigDownload

不支持

设备预置位查询

MESSAGE/Query/PresetQuery

不支持

状态信息报送

心跳

MESSAGE/Notify/Keepalive

9.6 A.2.5.a

已支持

设备录像文件操作

设备视音频文件检索

MESSAGE/Query/RecordInfo

9.7 A.2.4.d

不支持

历史视音频回放

INVITE/SDP/Playback

9.8

不支持

历史视音频下载

INVITE/SDP/Download

9.9

不支持

校时

校时(NTP校时)

9.1

不支持

校时(SIP校时)

不支持

订阅和通知

事件订阅

SUBSCRIBE/NOTIFY/Alarm

9.11.1 J.18

不支持

事件通知

SUBSCRIBE/NOTIFY/Alarm

9.11.2 J.19

不支持

目录订阅

SUBSCRIBE/NOTIFY/Catalog

9.11.3 J.20

计划支持

目录通知

SUBSCRIBE/NOTIFY/Catalog

9.11.4 J.21

计划支持

移动位置订阅

SUBSCRIBE/NOTIFY/MobilePosition

9.12.1

计划支持

移动位置通知

SUBSCRIBE/NOTIFY/MobilePosition

9.12.2

计划支持

语音广播和语音对讲

语音广播

MESSAGE/NotifyBroadcast

不支持

语音对讲

INVITE/SDP

不支持

DJI扩展功能

Metadata

安防平台对接接口开发文档

已支持

PinPoint

MESSAGE/DeviceControl/PinCmd

已支持

飞机位置上报

MESSAGE/Notify/MobilePosition

已支持

飞手位置上报

MESSAGE/Notify/RcPosition

已支持

视频码流参数设置

MESSAGE/DeviceControl/VideoParamCmd

已支持

扩展数据上报

MESSAGE/Notify/DataTransfer

已支持

    1. GB/T28181接入准备
      1. 28181注册及点播流程
      1. 确认无人机和遥控器版本
      1. 连接WiFi或4G dongle
      1. 连接VPDN专网(可选)
      1. 配置28181参数

举例,连接华平公网28181服务器:

      1. 开始登录
        1. 在第三方平台打开视频播放

注意,GB/T28181视频推流有主动模式和被动模式,而我们仅支持被动推流,即设备上线成功以后,必须等服务器发起点播请求。

    1. GB/T28181调试方法
      1. 网络抓包

一般情况下,遥控器与服务器进行网络通信,无论在遥控器还是服务器上,抓包分析的效果是一样的。但不排除特殊疑难问题出现时,必须双方同时抓包以“自证清白”,甚至中间经过的网闸等设备也要抓包。

遗憾的是,我们的产品,无论飞机还是遥控器,一旦release之后,就没有root权限和tcpdump工具,想要抓包分析几乎不可能。这种情况下,建议先让第三方厂商服务器抓包,双方共同分析。网络抓包在第三方厂商服务器上是轻而易举就能做到的事,甚至是服务器运维必备的技能之一。

如果问题非常复杂,最后不得不在遥控器上抓包的话,需要将遥控器更新到debug版,具体方法请参考《附录二 如何升级成debug版遥控器》。

        1. Windows服务器WireShark抓包方法
        2. Linux服务器tcpdmp抓包方法
  1. 列出所有网卡

sudo tcpdump –D

  1. 抓包所有5060/UDP的SIP报文

sudo tcpdump –i eth0 –n –nn –v –vv udp port 5060

-n -nn会把端口号用数字打出来,不然只会把协议名称打出来;

-v -vv会把协议内容解析成文本打印出来,不然只会打印报文长度;

eth0 是你的网卡名,不知道的话可以用tcpdump –D列出所有网卡。

  1. 抓包所有5060/UDP的SIP报文并另存到pcap文件

sudo tcpdump –i eth0 –n –nn udp port 5060 –s0 –w /tmp/1.pcap

-w是写入文件的意思,后面跟文件名;

-s0是不要把报文截断的意思;

  1. 查看是否有大量RTP视频流正在传输

sudo tcpdump –i eth0 –n –nn not port 22 and not port 5060

22/TCP通常是SSH协议端口,我们不想看它,过滤掉(not port 22);

5060/UDP是SIP信令的端口,也过滤掉(not port 5060);

依次类推,排除那些已知且容易刷屏的干扰。

检查抓包出的报文,如果有大量1500字节左右的数据在持续发送或接收,基本上就能确定是RTP视频流了。

  1. 查看来自某个固定IP的报文

tcpdump –i eth0 –n –nn src host 192.168.8.100

抓取来自192.168.8.100的报文;

tcpdump –i eth0 –n –nn dst host 192.168.8.100

抓取发往192.168.8.100的报文;

tcpdump –i eth0 –n –nn host 192.168.8.100

去掉src或dst修饰,表示抓取所有跟192.168.8.100有关的报文

        1. 遥控器debug版tcpdump抓包方法

遥控器上运行的是嵌入式linux系统,其tcpdump抓包命令跟linux服务器是一样的。不同的是,遥控器需要更新到debug版,然后用adb shell连接。以下介绍假定你手里拿的是一台debug版遥控器。

  1. ifconfig查看网卡ip地址
  1. 查看遥控器上的网卡名称
  1. 抓取SIP信令

su 切换到root

tcpdump –i wlan0 –n –nn –v –vv udp port 5060

  1. 抓取RTP视频流

tcpdump –i wlan0 –n –nn udp and not port 5060

adb shell 连接遥控器

logcat | grep MRTC 实时查看直播相关日志

logcat | grep MRTC > /blackbox/mrtc.log.1 日志重定向输出到文件

adb pull /blackbox/mrtc.log.1 把输出的文件导出

        1. 遥控器历史日志目录/sdcard/导出方法

adb pull –a /sdcard/dji_logs/

  1. GB/T8181典型网络接入场景
    1. 互联网接入

遥控器可以通过4G dongle或现场共享的WiFi热点连接互联网。服务器一般部署在阿里云,或部署在单位内部,然后通过公网IP端口映射。由于服务器在互联网上,与第三方厂商联调起来相对比较方便。

这一类场景在行业应用上相对较少(尤其是公安行业有自己的专网,不会在互联网上传输)。

    1. 公安VPDN专网接入

在接入公安专网时,很多人搞不清以下概念,现解释如下:

    1. VPN

VPN(Virtual Private Network虚拟专线) 技术是指采用隧道技术以及加密、身份认证等方法,在公众网络上构建专用网络的技术,数据通过安全的 “ 加密管道 ” 在公众网络中传播。

简单来说,就是互联网上的两个网络设备或主机,用加密技术建立一个点对点的安全链路,不需要向网络运营商定制。

如市面上用到的各种翻墙工具,包括DJI上海办公室与深圳办公室能够像局域网一样互相访问,都是基于VPN技术。VPN虚拟专线上所有数据都是链路加密的。

    1. VPDN

VPDN(Virtual Private Dial-Network虚拟专有拨号网络),中国宽带互联上基于拨号方式的虚拟专有网络业务,利用安全的L2TP隧道传输协议,就可以在现有的拨号网络上构建一条虚拟的、不受外界干扰的专用通道,从而安全访问企业内部网资源。

简单来说,就是大型机构或政府单位向运营商申请的特殊网络服务,以拨号方式访问企业内部局域网,通过对网络数据的封包和加密在公网上传输私有数据,与外界完全隔离,可以提供较高的安全性。

    1. APN

APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。

简单来说,就是手机3G/4G/5G上网需要的拨号配置。如果手机访问互联网,则用普通的SIM卡和手机默认的APN配置即可。如果手机访问专网,则需要用运营商给的专用SIM卡和拨号参数,手动创建一个新的APN

TODO:实际使用中有哪些坑?

    1. 前方指挥中心局域网接入

广泛存在于消防应急救援等行业,在灾害救援中,如果现场没有网络覆盖,可借助应急指挥车、自主网基础等设备,在现场共享WiFi热点,手持单兵和无人机等通过WiFi接入前方指挥中心服务器,再由前方指挥中心与后方指挥中心级联,将现场音视频或其它数据回传到后方指挥中心。

这种场景下,我们无人机遥控器与前方指挥中心服务器连接的网络比较简单,相当于局域网互联,与公司内部28181研发测试环境差不多,一般不会有什么疑难问题。

  1. 常见问题分析

为了读者快速理解问题的解决途径,给所有问题添加等级分类,并约定如下:

  1. 使用问题:用户可自行解决
  2. 网络问题:需要一定的网络基础知识和技术手段
  3. 功能问题:需要较强的技术能力和调试手段,必要时可能需要研发分析
    1. 注册登录失败

      1. 参数配置错误

确认服务器IP地址和端口(第三方平台提供)是否正确;

略。

      1. 网络不通

确认本地遥控器是否正确连接WiFi(或正确配置VPDN专网账号);

确认是否能ping通服务器IP地址;

确认防火墙是否开通服务器SIP端口(通常是5060);

TODO: 遥控器网络配置截图;

TODO: 遥控器adb ifconfig截图;

      1. SIP ID或密码错误

国标SIP ID是长度为20个数字的编号,非常容易输错;编号规则解释如下:

举例34020000001310000001

有些服务器(如阿里云视频监控)出于安全考虑,在SIP ID或PASSWORD校验错误的时候不返回任何消息,在Pilot看到的现象就是一直登录超时,网络抓包分析发现只有发出去的注册请求,没有收到任何应答(表现的像网络不通一样)。

      1. 4G dongle不支持VPDN

遥控器v2.2不能接入专网的原因:插上4G dongle以后,接入公安专网DHCP分配IP地址时,没有DNS信息,系统就会向应用层返回网络错误,导致App无法使用。

目前这个问题在中兴dongle上解决了,但华为dongle上没解决。所以如果是专网使用的话,不要用华为dongle,目前只能用中兴的dongle (中兴883U和883V)。

同时,遥控器版本必须升至v2.4及以上。

      1. 服务器查询DeviceInfo或DeviceStatus失败

有些厂商的服务器(如华平)在设备Register成功以后,开始查询设备信息、设备状态、设备目录等信息,所有查询完成以后,才会判定设备正式上线。

  1. 消息流程如下

  1. 消息示范参考附录《GB/T28181协议》
  2. MRTC日志Query消息处理

1 DeviceInfo查询

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_NEW event proc..

[MRTC-I    gbt_agent_EXOSIP_MESSAGE_Proc:  514]: : 28181:EXOSIP_MESSAGE:SEND 200 OK to 34020000002000000001

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Proc:  474]: : 28181:recieve Query cmd

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Query_Proc:  414]: : 28181:Recieve DeviceInfo Query cmd

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_ANSWERED event proc..

[MRTC-I gbt_agent_EXOSIP_MESSAGE_ANSWERED_Proc:  649]: : 28181:RECV 200 OK from [34020000002000000001]

2 DeviceStatus查询

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_NEW event proc..

[MRTC-I    gbt_agent_EXOSIP_MESSAGE_Proc:  514]: : 28181:EXOSIP_MESSAGE:SEND 200 OK to 34020000002000000001

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Proc:  474]: : 28181:recieve Query cmd

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Query_Proc:  418]: : 28181:Recieve DeviceStatus Query cmd

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_ANSWERED event proc..

[MRTC-I gbt_agent_EXOSIP_MESSAGE_ANSWERED_Proc:  649]: : 28181:RECV 200 OK from [34020000002000000001]

    1. 点播视频失败

      1. 服务器Catalog查询失败

Catalog:设备目录,可理解为子设备列表;在我们的Pilot里对应一路视频流,即SIP通道一ID对应的信息。.

设备上线后,服务器会发送Catalog查询请求,获取视频通道列表后才能发起视频点播。

  1. 消息流程如下:

  1. 消息示范参考附录《查询设备列表》。
  2. MRTC日志 Catalog消息处理:

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_NEW event proc..

[MRTC-I    gbt_agent_EXOSIP_MESSAGE_Proc:  514]: : 28181:EXOSIP_MESSAGE:SEND 200 OK to 34020000002000000001

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Proc:  474]: : 28181:recieve Query cmd

[MRTC-I gbt_agent_EXOSIP_MESSAGE_MANSCDP_xml_Query_Proc:  410]: : 28181:Recieve Catalog Query cmd

[MRTC-I gbt_agent_SendMessageCatalogResponse:  966]: : 28181:send catalog: sum=1 i=0 ch1:34020000001310000001

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_MESSAGE_ANSWERED event proc..

[MRTC-I gbt_agent_EXOSIP_MESSAGE_ANSWERED_Proc:  649]: : 28181:RECV 200 OK from [34020000002000000001]

      1. 没有收到服务器Invite请求

这是一种人为操作疏忽,并不多见。通常28181设备上线后,需要在第三方平台手动点播才能打开视频画面。但不排除有些行业第三方平台的用户误以为设备上线后会自动点播(如许昌公安&宇视)。

定位问题的办法是:通过抓包或日志,检查服务器有没有发送Invite请求。

  • 网络抓包服务器发送INVITE请求

114.55.103.238.5060 > 10.98.12.201.7061: [udp sum ok] SIP, length: 673

INVITE sip:34020000001310000001@3402000000 SIP/2.0

Via: SIP/2.0/UDP 114.55.103.238:5060;rport;branch=SrsGbB64126518

From: <sip:34020000002000000001@3402000000>;tag=SrsGbF87430635

To: <sip:34020000001310000001@10.98.12.201:7061>

Call-ID: 202033389138

CSeq: 103 INVITE

Content-Type: Application/SDP

Contact: <sip:34020000001310000001@10.98.12.201:7061>

Max-Forwards: 70

User-Agent: SRS/5.0.1(Leo)

Subject: 34020000001310000001:0000010004,34020000002000000001:0

Content-Length: 180

v=0

o=34020000002000000001 0 0 IN IP4 114.55.103.238

s=Play

c=IN IP4 114.55.103.238

t=0 0

m=video 10004 RTP/AVP 96

i=primary

a=recvonly

a=rtpmap:96 PS/90000

y=0000010004

  • MRTC日志INVITE消息的解析及处理日志

[MRTC-I        gbt_agent_eXosipEventProc:  122]: : 28181:EXOSIP_CALL_INVITE event proc..

[MRTC-I gbt_agent_EXOSIP_CALL_INVITE_Proc:   63]: : 28181:EXOSIP_CALL_INVITE

[MRTC-I gbt_agent_EXOSIP_CALL_INVITE_Proc:   72]: : 28181:gbt_agent_ExosipPlayProc() start: INVITE PLAY

[MRTC-I         gbt_agent_ExosipPlayProc:  978]: : 28181:[channel=34020000001310000001][cid=1][did=2] start process invite play

[MRTC-I  gbt_agent_parse_call_invite_sdp:  755]: : 28181:sdp_message_o_sess_id_get:0

[MRTC-I  gbt_agent_parse_call_invite_sdp:  756]: : 28181:sdp_message_o_sess_version_get:0

[MRTC-I  gbt_agent_parse_call_invite_sdp:  757]: : 28181:sdp_message_o_nettype_get:IN

[MRTC-I  gbt_agent_parse_call_invite_sdp:  758]: : 28181:sdp_message_o_addrtype_get:IP4

[MRTC-I  gbt_agent_parse_call_invite_sdp:  759]: : 28181:sdp_message_o_addr_get:114.55.103.238

[MRTC-I  gbt_agent_parse_call_invite_sdp:  761]: : 28181:sdp_message_s_name_get:Play

[MRTC-I  gbt_agent_parse_call_invite_sdp:  763]: : 28181:sdp_connection_video->c_nettype=IN

[MRTC-I  gbt_agent_parse_call_invite_sdp:  764]: : 28181:sdp_connection_video->c_addrtype=IP4

[MRTC-I  gbt_agent_parse_call_invite_sdp:  765]: : 28181:sdp_connection_video->c_addr=114.55.103.238

[MRTC-I  gbt_agent_parse_call_invite_sdp:  767]: : 28181:sdp_media_video->m_media=video

[MRTC-I  gbt_agent_parse_call_invite_sdp:  768]: : 28181:sdp_media_video->m_port=10004

[MRTC-I  gbt_agent_parse_call_invite_sdp:  769]: : 28181:sdp_media_video->m_proto=RTP/AVP

[MRTC-I  gbt_agent_parse_call_invite_sdp:  802]: : 28181:sdp_attribute->a_att_field=recvonly

[MRTC-I  gbt_agent_parse_call_invite_sdp:  781]: : 28181:sdp_attribute->a_att_value=96 PS/90000

[MRTC-I  gbt_agent_parse_call_invite_sdp:  798]: : 28181:rtpmap parse result: payload=96 codec=PS clock_rate=90000

[MRTC-I  gbt_agent_parse_call_invite_sdp:  885]: : 28181:sdp y=ssrc=0000010004

[MRTC-I         gbt_agent_ExosipPlayProc: 1059]: : 28181:[channel=34020000001310000001 ssrc=0000010004 i=0 a:codec=PS pt=96 clock_rate=90000] sdp attr

[MRTC-I         gbt_agent_ExosipPlayProc: 1071]: : 28181:[channel=34020000001310000001 i=0 a:codec=PS pt=96 clock_rate=90000] sdp attr is selected

[MRTC-I      gbt_agent_get_rtp_rtcp_port:  364]: : 28181:get rtp_rtcp_port=10000,10001

[MRTC-I         gbt_agent_ExosipPlayProc: 1105]: : 28181:local rtp-port=10000 addr=10.98.12.201:7061 name=agent id=34020000001310000001

[MRTC-I         gbt_agent_ExosipPlayProc: 1207]: : 28181:[channel=34020000001310000001 ssrc=0000010004 pt=96 PS src=10.98.12.201:10000 dst=114.55.103.238:10004]200 ok with sdp

      1. 服务器Invite SDP音视频格式不支持

SDP用于服务器与客户端之间流媒体协商,包含网络地址(IP/Port)、推流协议(TCP/UDP)、音视频格式等。

某些服务器厂商可能点播了我们不支持的音视频格式,或者我们回复的格式他们不支持,导致点播失败。

  • SDP定义

Session description:

v= (protocol version)

o= (owner/creator and session identifier).

s= (session name)

u=* (URI of description)

c=* (connection information -not required if included in all media)

Time description:

t= (time the session is active)

Media description

m= (media name and transport address)

c=* (connection information -optional if included at session-level)

b=* (bandwidth information)

a=* (zero or more media attribute lines)

y=*(SSRC)

f=*(媒体描述)

  • 正确SDP示范

v=0

o=34020000001310100000 1599029345 1599029345 IN IP4 68.65.0.12

s=Play

i=Play to Pu

u=rtsp://190.192.31.30:15696/647633f8ece811ea80009c713a5f86c8.sdp

c=IN IP4 68.65.0.12

t=0 0

m=video 15696 RTP/AVP 96 97 98 99

a=rtpmap:96 PS/90000

a=rtpmap:97 MPEG4/90000

a=rtpmap:98 H264/90000

a=rtpmap:99 SVAC/90000

a=control:trackID=1

a=recvonly

  • 错误SDP示范

v=0

o=34020000001310100000 1599029345 1599029345 IN IP4 68.65.0.12

s=Play

i=Play to Pu

u=rtsp://190.192.31.30:15696/647633f8ece811ea80009c713a5f86c8.sdp

c=IN IP4 68.65.0.12

t=0 0

m=video 15696 RTP/AVP 96 97 98 99

a=rtpmap:96 TS/90000

a=rtpmap:97 MPEG4/90000

a=rtpmap:98 VP9/90000

a=rtpmap:99 SVAC/90000

a=control:trackID=1

a=recvonly

TODO: 错误SDP情况下的处理日志示范

      1. 未收到ACK

再看一下上面这个点播消息流程,服务器发起点播要经过3次握手,Pilot在收到“3:ACK”这个消息才会开始发流。如果第3步的ACK没收到,则Pilot端和服务器端同时出现点播超时。

造成ACK消息丢失的原因,主要是由于SIP通信需要跨越NAT网络,如果推流端没有正确识别到NAT映射的外网IP地址,就有可能发生ACK丢失(这时候完全取决于服务器的实现)。(SIP协议考虑了信令服务器与流媒体服务器分开的场景)。如下面的拓扑结构:

TODO:分布式拓扑结构

TODO:SIP Contact字段示范

TODO:ACK丢失的MRTC日志示范

      1. 内部错误没有视频流

假设SIP点播流程完全正确,抓包和日志观察信令处理是成功的,但依然没有视频流,那么不排除推流端存在某些未知Bug,导致没有发送rtp视频流。

验证方法是通过抓包或者日志,判断我们有没有持续向外发送rtp包,并检查发送目的IP:Port是否正确。

TODO:Pilot send RTP抓包

TODO: MRTC日志码流状态统计

      1. 服务器拒绝RTP视频流

和上面“未到ACK” 的原理是一样的,通常Pilot处于NAT内部局域网,没有办法拿到NAT映射到外网的IP地址和端口。导致SDP描述的IP:Port(本地ifconfig)在服务器判断为目标不可达或非法网络地址。

这个问题通常只出现在UDP推流场景,好在Pilot目前支持TCP推流,所以解决办法是在第三方厂商的服务器上,把点播协议改成TCP即可。(回顾一下SDP的知识,点播协议是靠SDP协商的,并且由服务器Invite时决定,所以不需要在我们Pilot上改配置)

TODO: Pilot send rtp抓包。

TODO: Server UDP抓包。

      1. 服务器解析RTP视频流失败
  • H264视频帧会被分成N多个RTP包(不大于MTU=1500B)发送

如上面的原理图所示,一个H264帧,会被“切分”成多个RTP在网络上发送;接收端会缓存多个RTP,然后尝试“拼接”成一个完整的H264。

那么服务器如何确定哪些RTP组成一个H264呢?

  • Rtp header

RTP Header中有sequence number序号和timestamp时戳,先按sequence number对RTP排序,再把timestamp相同的RTP分成一组,即可“还原”出H264。

但有些服务器(如东方网力)并不按这个逻辑解析,他们只看最后一个RTP的M位(Marker)是否等于1,来确定一组RTP是否完整了。

遗憾的是我们所采用的开源RTP库并不会设置RTP的M位(包括我抓包了很多第三方RTP也没有)。这样就会在服务器虽然缓存了很多的RTP,但一直没有解出H264视频。

这个建议推动第三方厂商按照timestamp时戳的方式去解析。(后面我们会分析一下RFC的规定,再决定这算不算一个bug)

      1. 服务器解码H264视频流失败

虽然国标中规定了视频的编码标准,但各厂商在H264编码仍可能存在细节差异。

如DJI的H264视频中有自己的SEI扩展(Metadata),这些标准扩展从原理上讲是不会影响播放的,但就是有些播放器的兼容性差(如海康NVR不支持多于1个SEI的H264)。

再如我们测试发现SRS服务器不支持多Slice的H264码流。

      1. 网络质量差

网络质量差的情况下,通过UDP传输的RTP包,存在严重丢包和乱序等问题,导致接收端难以解析出一个完整视频I帧,导致点播超时失败或卡花严重。

甚至像深圳公安VPDN这种专用的网络,即使带宽充足,仍然存在3%-5%的固定丢包率。

解决方法就是通过测试带宽定位问题或者换成TCP点播再测。

TODO:

      1. 国标老版本v2012

现行的国标是2016年发布的GB/T28181-2016,可能有此平台由于投入开发较早,仍然是GB/T28181-2012。点播上最大的区别就是视频流打包方式不同:

  • 2012版:
    1. H264裸流直接打包成RTP (payload_type=98)
    2. 仅支持UDP
  • 2016版:
    1. H264先打包成PS,再打包成RTP (payload_type=96)
    2. 支持UDP/TCP
    1. Pilot App崩溃
  1. 附录一 GB/T28181协议
    1. 链路框图

    1. 术语定义

SIP服务器:接入第三方的应用服务器,通常分为SIP信令服务器和流媒体服务器,二者也可能部署在同一台物理机器上。

SIP Agent:GB/T28181协议的代理模块,负责与服务器SIP信令通信和视频回传功能,一般运行在无人机的遥控器或者大疆图传基站。

metadata:非音视频数据,无人机的飞行参数,云台相机参数等一些实时性和精度都比较高的数据,通常扩展打包到视频码流H264帧中一起传输和存储。

PinPoint:静止目标;用户在视频或地图页面中,选中一个目标进行打点,如消防栓,大楼等,无人机会实时计算该点的视频坐标并以一定频率回传到SIP服务器,在客户端叠加显示;

SmartTrack:动态目标;用户在遥控器开启识别功能,无人机开始识别画面中的人/车/船,遥控器手动选中画面中的目标进行激活,无人机会实时计算跟踪激活目标的位置和视频坐标,并以一定频率回传到SIP服务器,在客户端叠加显示;

LookAt:当视频或地图页面中有Pin点时,用户可以针对PinPoint执行【LookAt】操作,执行后会触发云台会转向该Pin点或命令飞机飞向该Pin点;

NAT:网络地址转换,在IPv4地址资源有限的情况下,一种局域网访问公网的技术;通常SIP Agent和SIP服务器都可能在NAT局域网内,部署时需要解决NAT互联互通问题。

    1. 注册注销
      1. 命令流程

      1. 消息示范

1:REGISTER sip:34020000002000000001@127.0.0.1:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK351404078

From: <sip:34020000001320000002@10.98.12.201:7060>;tag=1321462466

To: <sip:34020000001320000002@10.98.12.201:7060>

Call-ID: 1495813806

CSeq: 1 REGISTER

Contact: <sip:34020000001320000002@10.98.12.201:7060;line=e12a2353f6aba97>

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Expires: 3600

Content-Length: 0

2:SIP/2.0 401 Unauthorized

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=7060;branch=z9hG4bK351404078;received=127.0.0.1

From: <sip:34020000001320000002@10.98.12.201:7060>;tag=1321462466

To: <sip:34020000001320000002@10.98.12.201:7060>;tag=1250533930

Call-ID: 1495813806

CSeq: 1 REGISTER

WWW-Authenticate: Digest realm="dji.com", nonce="1019949516", algorithm=MD5

User-agent: GB/T28181 SERVER

Content-Length: 0

3:REGISTER sip:34020000002000000001@127.0.0.1:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK2005111008

From: <sip:34020000001320000002@10.98.12.201:7060>;tag=1321462466

To: <sip:34020000001320000002@10.98.12.201:7060>

Call-ID: 1495813806

CSeq: 2 REGISTER

Contact: <sip:34020000001320000002@10.98.12.201:7060;line=e12a2353f6aba97>

Authorization: Digest username="34020000001320000002", realm="dji.com", nonce="1019949516", uri="sip:34020000002000000001@127.0.0.1:5060", response="87a52b6f16b313e61de09f87376037ef", algorithm=MD5

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Expires: 3600

Content-Length: 0

4:SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=7060;branch=z9hG4bK2005111008;received=127.0.0.1

From: <sip:34020000001320000002@10.98.12.201:7060>;tag=1321462466

To: <sip:34020000001320000002@10.98.12.201:7060>;tag=1422064934

Call-ID: 1495813806

CSeq: 2 REGISTER

User-agent: GB/T28181 SERVER

Content-Length: 0

    1. 在线心跳
      1. 命令流程

      1. 消息示范

1:MESSAGE sip:34020000002000000001@114.55.103.238:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK998766967

From: P1 <sip:34020000001310000007@10.98.12.201:7060>;tag=533545394

To: S1 <sip:34020000002000000001@114.55.103.238:5060>

Call-ID: 416394637

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Content-Length:   168

<?xml version="1.0" encoding="gb2312"?>

<Notify>

<CmdType>Keepalive</CmdType>

<SN>0</SN>

<DeviceID>34020000001310000007</DeviceID>

<Status>OK</Status>

</Notify>

2:SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=27571;branch=z9hG4bK998766967;received=180.168.60.98

From: P1 <sip:34020000001310000007@10.98.12.201:7060>;tag=533545394

To: S1 <sip:34020000002000000001@114.55.103.238:5060>;tag=1821740291

Call-ID: 416394637

CSeq: 20 MESSAGE

User-Agent: GB/T28181 SERVER

Content-Length: 0

    1. 查询设备列表
      1. 命令流程

      1. 消息示范

1:MESSAGE sip:34020000001310000004@180.168.60.98:7060 SIP/2.0

Via: SIP/2.0/UDP 101.230.200.164:5060;rport;branch=z9hG4bK900007346

From: <sip:34020000002000000001@3402000000>;tag=1165390674

To: <sip:34020000001310000004@180.168.60.98:7060>

Call-ID: 1117773654

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: eXosip/4.0.0

Content-Length:   126

<?xml version="1.0"?>

<Query>

<CmdType>Catalog</CmdType>

<SN>20</SN>

<DeviceID>34020000001310000004</DeviceID>

</Query>

2:SIP/2.0 200 OK

Via: SIP/2.0/UDP 101.230.200.164:5060;rport=5060;branch=z9hG4bK900007346

From: <sip:34020000002000000001@3402000000>;tag=1165390674

To: <sip:34020000001310000004@180.168.60.98:7060>;tag=18350212

Call-ID: 1117773654

CSeq: 20 MESSAGE

User-Agent: GB/T28181 AGENT

Content-Length: 0

3:MESSAGE sip:34020000002000000001@101.230.200.164:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK1111075975

From: P1 <sip:34020000001310000004@10.98.12.201:7060>;tag=963100192

To: S1 <sip:34020000002000000001@101.230.200.164:5060>

Call-ID: 2076745037

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Content-Length:   553  

<?xml version="1.0" encoding="gb2312"?>

<Response>

<CmdType>Catalog</CmdType>

<SN>20</SN>

<DeviceID>34020000001310000004</DeviceID>

<SumNum>1</SumNum>

<DeviceList Num="1">

<Item>

<DeviceID>34020000001310000004</DeviceID>

<Name>C1</Name>

<Manufacturer>DJI</Manufacturer>

<Model>Camera</Model>

<Owner>Owner</Owner>

<CivilCode>CivilCode</CivilCode>

<Address>10.98.12.201</Address>

<Parental>0</Parental>

<SafetyWay>0</SafetyWay>

<RegisterWay>1</RegisterWay>

<Secrecy>0</Secrecy>

<Status>ON</Status>

</Item>

</DeviceList>

</Response>

4:SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=7060;branch=z9hG4bK1111075975

From: P1 <sip:34020000001310000004@10.98.12.201:7060>;tag=963100192

To: S1 <sip:34020000002000000001@101.230.200.164:5060>;tag=1967178802

Call-ID: 2076745037

CSeq: 20 MESSAGE

User-Agent: eXosip/4.0.0

Content-Length: 0

    1. 查询设备信息
      1. 命令流程

      1. 消息示范

1:MESSAGE sip:34020000001310000007@180.168.60.98:27571 SIP/2.0

Via: SIP/2.0/UDP 192.168.12.248:5060;rport;branch=z9hG4bK1660019858

From: <sip:34020000002000000001@192.168.12.248>;tag=1276360137

To: <sip:34020000001310000007@180.168.60.98:27571>

Call-ID: 22766339

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 SERVER

Content-Length:   143

<?xml version="1.0" encoding="utf-8"?>

<Query>

<CmdType>DeviceInfo</CmdType>

<SN>1</SN>

<DeviceID>34020000001310000007</DeviceID>

</Query>

2:SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.12.248:5060;rport=5060;branch=z9hG4bK453703006;received=114.55.103.238

From: S1 <sip:34020000002000000001@192.168.12.248>;tag=1124722065

To: 34020000001310000007 <sip:34020000001310000007@180.168.60.98:27571>;tag=34221046

Call-ID: 1833232105

CSeq: 20 MESSAGE

User-Agent: GB/T28181 AGENT

Content-Length: 0

3:MESSAGE sip:34020000002000000001@114.55.103.238:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK1206118992

From: <sip:34020000001310000007@10.98.12.201:7060>;tag=349255874

To: <sip:34020000002000000001@114.55.103.238:5060>

Call-ID: 1084995988

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Content-Length:   339

<?xml version="1.0" encoding="gb2312"?>

<Response>

<CmdType>DeviceInfo</CmdType>

<SN>1</SN>

<DeviceID>34020000001310000007</DeviceID>

<Result>OK</Result>

<DeviceType>UAV</DeviceType>

<Manufacturer>DJI</Manufacturer>

<Model>PM430</Model>

<Firmware>V10.0.0</Firmware>

<MaxCamera>1</MaxCamera>

<MaxAlarm>0</MaxAlarm>

</Response>

4:SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=27571;branch=z9hG4bK1206118992;received=180.168.60.98

From: <sip:34020000001310000007@10.98.12.201:7060>;tag=349255874

To: <sip:34020000002000000001@114.55.103.238:5060>;tag=67397758

Call-ID: 1084995988

CSeq: 20 MESSAGE

User-Agent: GB/T28181 SERVER

Content-Length: 0

    1. 查询设备状态
      1. 命令流程

      1. 消息示范

1:MESSAGE sip:34020000001310000007@180.168.60.98:27571 SIP/2.0

Via: SIP/2.0/UDP 192.168.12.248:5060;rport;branch=z9hG4bK227343410

From: <sip:34020000002000000001@192.168.12.248>;tag=1508986517

To: <sip:34020000001310000007@180.168.60.98:27571>

Call-ID: 243288359

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 SERVER

Content-Length:   145

<?xml version="1.0" encoding="utf-8"?>

<Query>

<CmdType>DeviceStatus</CmdType>

<SN>3</SN>

<DeviceID>34020000001310000001</DeviceID>

</Query>

2:SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.12.248:5060;rport=5060;branch=z9hG4bK227343410;received=114.55.103.238

From: <sip:34020000002000000001@192.168.12.248>;tag=1508986517

To: <sip:34020000001310000007@180.168.60.98:27571>;tag=1033545332

Call-ID: 243288359

CSeq: 20 MESSAGE

User-Agent: GB/T28181 AGENT

Content-Length: 0

3:MESSAGE sip:34020000002000000001@114.55.103.238:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport;branch=z9hG4bK1151038231

From: <sip:34020000001310000007@10.98.12.201:7060>;tag=1368660882

To: <sip:34020000002000000001@114.55.103.238:5060>

Call-ID: 1204955900

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 AGENT

Content-Length:   347

<?xml version="1.0" encoding="gb2312"?>

<Response>

<CmdType>DeviceStatus</CmdType>

<SN>3</SN>

<DeviceID>34020000001310000001</DeviceID>

<Result>OK</Result>

<Online>ONLINE</Online>

<Status>OK</Status>

<Encode>ON</Encode>

<Record>OFF</Record>

<DeviceTime>2020-06-30T17:58:11</DeviceTime>

<Alarmstatus Num=0>

</Alarmstatus>

</Response>

4:SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=27571;branch=z9hG4bK1151038231;received=180.168.60.98

From: <sip:34020000001310000007@10.98.12.201:7060>;tag=1368660882

To: <sip:34020000002000000001@114.55.103.238:5060>;tag=26612286

Call-ID: 1204955900

CSeq: 20 MESSAGE

User-Agent: GB/T28181 SERVER

Content-Length: 0

    1. 视频点播
      1. 命令流程

      1. 消息示范

v=0                                                 /*vesion=0*/

o=34020000002000000001 0 0 IN IP4 192.168.1.200     /*origin=username sessionid version net_type ip_type ip_addr*/

s=Play                                              /*session=name*/

c=IN IP4 192.168.1.200                              /*connection=net_type ip_type ip_addr*/

t=0 0                                               /*time=start_time end_time*/

m=video 10000 RTP/AVP 96                            /*media=port ip_proto media_list*/

a=rtpmap:96 PS/90000                                /*mode*/

a=recvonly                                          /*mode*/

y=0000010000                                        /*payload codec clock_rate*/

    1. 强制发送关键帧
      1. 命令流程

      1. 消息示范

1: MESSAGE sip:34020000001320000002@10.98.12.201:7060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:5060;rport;branch=z9hG4bK771024005

From: <sip:34020000002000000001@10.98.12.201>;tag=459020801

To: <sip:34020000001320000002@10.98.12.201:7060>

Call-ID: 709513678

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 SERVER

Content-Length:   177

<?xml version="1.0" encoding="utf-8"?>

<Control>

<CmdType>DeviceControl</CmdType>

<SN>3</SN>

<DeviceID>34020000001320000002</DeviceID>

<IFameCmd>Send</IFameCmd>

</Control>

2: SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:5060;rport=5060;branch=z9hG4bK771024005

From: <sip:34020000002000000001@10.98.12.201>;tag=459020801

To: <sip:34020000001320000002@10.98.12.201:7060>;tag=612836278

Call-ID: 709513678

CSeq: 20 MESSAGE

User-agent: GB/T28181 AGENT

Content-Length: 0

    1. 云台控制
      1. 命令流程

      1. 消息示范

1:MESSAGE sip:34020000001320000001@192.168.1.200:7060 SIP/2.0

Via: SIP/2.0/UDP 192.168.1.20:5060;rport;branch=z9hG4bK183869066

From: <sip:34020000002000000001@3402000000.spvmn.cn>;tag=1034290156

To: <sip:34020000001320000001@192.168.1.200:7060>

Call-ID: 1445549187

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: Embedded Net DVR/NVR/DVS

Content-Length:   164

<?xml version="1.0"?>

<Control>

<CmdType>DeviceControl</CmdType>

<SN>4</SN>

<DeviceID>34020000001320000001</DeviceID>

<PTZCmd>a50f4d0800800089</PTZCmd>

</Control>

2:SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.1.20:5060;rport=5060;branch=z9hG4bK183869066

From: <sip:34020000002000000001@3402000000.spvmn.cn>;tag=1034290156

To: <sip:34020000001320000001@192.168.1.200:7060>;tag=488197392

Call-ID: 1445549187

CSeq: 20 MESSAGE

User-Agent: GB/T28181 AGENT

Content-Length: 0

3:MESSAGE sip:34020000001320000001@192.168.1.200:7060 SIP/2.0

Via: SIP/2.0/UDP 192.168.1.20:5060;rport;branch=z9hG4bK2032303627

From: <sip:34020000002000000001@3402000000.spvmn.cn>;tag=1946344381

To: <sip:34020000001320000001@192.168.1.200:7060>

Call-ID: 415915923

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: Embedded Net DVR/NVR/DVS

Content-Length:   164

<?xml version="1.0"?>

<Control>

<CmdType>DeviceControl</CmdType>

<SN>5</SN>

<DeviceID>34020000001320000001</DeviceID>

<PTZCmd>a50f4d0000000001</PTZCmd>

</Control>

4:SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.1.20:5060;rport=5060;branch=z9hG4bK2032303627

From: <sip:34020000002000000001@3402000000.spvmn.cn>;tag=1946344381

To: <sip:34020000001320000001@192.168.1.200:7060>;tag=808298991

Call-ID: 415915923

CSeq: 20 MESSAGE

User-Agent: GB/T28181 AGENT

Content-Length: 0

    1. 视频码流参数设置
      1. 命令流程

      1. 消息示范

1: MESSAGE sip:34020000001320000002@10.98.12.201:7060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:5060;rport;branch=z9hG4bK605928310

From: <sip:34020000002000000001@10.98.12.201>;tag=551961093

To: <sip:34020000001320000002@10.98.12.201:7060>

Call-ID: 2010271529

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 SERVER

Content-Length: 330

<?xml version="1.0" encoding="utf-8"?>

<Control>

<CmdType>DeviceControl</CmdType>

<SN>4</SN>

<DeviceID>34020000001320000002</DeviceID>

<VideoParamCmd>Set</VideoParamCmd>

<Info>

 <! -- 分辨率,可选 -->

 <Resolution>1280x720</Resolution>

 <! -- 帧率,可选 -->

 <FrameRate>25</FrameRate>

 <! -- 码率,单位:kbps,可选 -->

 <BitRate>1000</BitRate>

 <! -- 是否自适应码率,ON、OFF,MSDK默认OFF,可选 -->

 <AdaptiveBitRate>OFF</AdaptiveBitRate>

</Info>

</Control>

2: SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:5060;rport=5060;branch=z9hG4bK605928310

From: <sip:34020000002000000001@10.98.12.201>;tag=551961093

To: <sip:34020000001320000002@10.98.12.201:7060>;tag=1311330980

Call-ID: 2010271529

CSeq: 20 MESSAGE

User-agent: GB/T28181 AGENT

Content-Length: 0

    1. GIS调度命令下发
      1. 命令流程

      1. 消息示范

1: MESSAGE sip:34020000001320000002@10.98.12.201:7060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:5060;rport;branch=z9hG4bK1291726400

From: <sip:34020000002000000001@10.98.12.201>;tag=815532297

To: <sip:34020000001320000002@10.98.12.201:7060>

Call-ID: 725214966

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: GB/T28181 SERVER

Content-Length: 1454

<? xml version="1.0"?>

<Control>

 <CmdType>DeviceControl</CmdType>

 <SN>11</SN>

 <DeviceID>64010000041310000345</DeviceID>

 <! -- 可选值:Add、Delete -->

 <PinCmd>Add</PinCmd>

 <! -- 设置点的设备名字,可自定义,UTF-8字符,最大128个字符 -->

 <SourceName>AVCON-client</SourceName>

 <PinList Num=2>

 <Item>

 <Index>0</Index>

 <! -- 类型:PinPoint,LookAt, -->

 <Type>PinPoint</Type>

 <! -- 经(单位度,double类型) -->

 <Longitude>115.34768890</Longitude>

 <! -- 纬(单位度,double类型) -->

 <Latitude>34.55678890</Latitude>

 <! -- WGS84坐标系下的椭球高(GPS高度)单位米,float类型) -->

 <Height>116.7</Height>

 <! -- 二维地图上,打点信息没有高度信息,此时HeightValid就设为0,然后飞机侧忽略Height字段具体值。如果Height要生效,该字段需要填1 -->

 <HeightValid>0</HeightValid>

 <! -- 备注,UTF-8字符,最大128个字符 -->

 <CmdComment>飞到该点</CmdComment>

 </Item>

 <Item>

 <Index>1</Index>

 <! -- 类型:PinPoint,LookAt, -->

 <Type>LookAt</Type>

 <! -- 经(单位度,double类型) -->

 <Longitude>115.34768890</Longitude>

 <! -- 纬(单位度,double类型) -->

 <Latitude>34.55678890</Latitude>

 <! -- WGS84坐标系下的椭球高(GPS高度)单位米,float类型) -->

 <Height>116.7</Height>

 <! -- 二维地图上,打点信息没有高度信息,此时HeightValid就设为0,然后飞机侧忽略Height字段具体值。如果Height要生效,该字段需要填1 -->

 <HeightValid>0</HeightValid>

 <! -- 备注,UTF-8字符,最大128个字符 -->

 <CmdComment>看向该点</CmdComment>

 </Item>

 </PinList>

</Control>

2: SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:5060;rport=5060;branch=z9hG4bK1291726400

From: <sip:34020000002000000001@10.98.12.201>;tag=815532297

To: <sip:34020000001320000002@10.98.12.201:7060>;tag=318574995

Call-ID: 725214966

CSeq: 20 MESSAGE

User-agent: GB/T28181 AGENT

Content-Length: 0

    1. 扩展数据上报
      1. 命令流程

      1. 消息示范

1: MESSAGE sip:34020000002000000001@127.0.0.1:5060 SIP/2.0

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=7060;branch=z9hG4bK2127704608;received=127.0.0.1
From: P1 <sip:34020000001320000002@10.98.12.201:7060>;tag=1507772752
To: S1 <sip:34020000002000000001@127.0.0.1:5060>
Call-ID: 1478198544
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-forwards: 70
User-agent: GB/T28181 AGENT
Content-Length: 2045

<? xml version="1.0"?>

<Notify>
 <CmdType>DataTransfer</CmdType>

 <SN>14</SN>
 <DeviceID>34020000001320000001</DeviceID>
 <! -- (必选)产生时间,type="string"-->
 <Time>2020-05-26T20:39:10</Time>

<! -- (必选)metadata格式版本信息,type="string"-->

<MetaVersion>v2</MetaVersion>
 <! –- (可选)飞机信息 -- >
 <UAV>
<! -- 表示飞机的数量-- >
<UAVList Num="2">
<Item>
<! -- UAVID用于判断数据属于哪一架飞机 -- >
<UAVID>01</UAVID>

<! -- (可选)设备型号,type="string"-->
<Model>M300</Model>
<! -- (可选)固件版本,type="string"-->
<Firmware>V10.0.0.0 </Firmware>
<! -- (可选)厂商代码,type="string"-->
<Manufactor>DJI</Manufactor>

<! -- (可选)自定义设备名称,type="string"-->

<CustomDevice>dji’s UAV</CustomDevice>
<! -- (可选)飞行记录标号,type="string"-->
<RecordLabel>1141180456123000047</RecordLabel>
<! –- (可选)飞机位置 -- >
<Pos>
<! -- (可选)经度,type="double",取值=[0,180]-->
<Longitude>114.118047</Longitude>
<! -- (可选)纬度,type="double",取值=[0,90]-->
<Latitude>22.595855</Latitude>
<! -- (可选)椭球高,单位:mm,type="int32_t",取值:变量全部范围-->
<Altitude>100000</Altitude>
<! -- (可选)GPS状态,NORMAL=0/INVALID=1/RTK=2,type="int32_t"-->
<GPSStatus>0</GPSStatus>
<! -- (可选)GPS高度类型,PRESSURE=0/GPS_FUSION=1/RTK=2,        type="int32_t"-->

<GPSAltType>0</GPSAltType>
<! -- (可选)GPS坐标类型,WGS84=0/CGCS2000=1,type="int32_t"-->
<GPSCoorType>0</GPSCoorType>
<! –- 注意:RTK状态的GPS的经度和纬度精确到小数点后8位、厘米级
普通状态的GPS的经度和纬度精确到小数点后5位、5米级

RTK状态的GPS的高度精确到10mm,厘米级
普通状态的GPS的高度精确到5000mm,5米级 -- >
</Pos>
<! –- (可选)飞机速度 -- >
<Speed>
<! -- (可选)飞机大地坐标系X轴速度,单位:0.1m/s,type="int32_t",取值:变量全部范围-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际速度:10.3-->
<X>23</X>
<! -- (可选)飞机大地坐标系Y轴速度,单位:0.1m/s,type=" int32_t ",取值:变量全部范围-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际速度:10.3-->
<Y>0</Y>
<! -- (可选)飞机大地坐标系Z轴速度,单位:0.1m/s,type=" int32_t ",取值:变量全部范围-->

<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际速度:10.3-->

<Z>0</Z>

</Speed>
<! –- (可选)飞机姿态 -- >
<Attitude>
<! --(可选)pitch角度,单位:0.1度,type="int32_t",取值:[-1800,1800]-->
<! - 此处int类型数据表示到小数点后一位,例:传输值103,实际度数:10.3-->
<Pitch>23</Pitch>
<! --(可选)roll角度,单位:0.1度,type=" int32_t ",取值:[-1800,1800]-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际度数:10.3-->
<Roll>103</Roll>
<! -- (可选)yaw角度,单位:0.1度,type=" int32_t ",取值:[-1800,1800]-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际度数:10.3-->
<Yaw>103</Yaw>
<! -- (可选)航向角,单位:0.1度,type="int16_t",取值:[-1800,1800]-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际度数:10.3-->
<Heading>103</Heading>
</Attitude>
<! –- (可选)飞机周围风速风向 -- >
<Wind>
<! -- (可选)飞机周围风速,单位:0.1m/s,type="float",取值:变量全部正数范围-->
<Speed>5</Speed>
<! -- (可选)飞机周围风向,Reversed=0/NORTH=1/northeast=2 /east=3/southeast=4/south=5/southwest=6/west=7/northwest=8,type="int32_t"-->
<Direction>1</Direction>
</Wind>
<! –- (可选)返航点数据 -- >
<HomePoint>
 <! -- (可选)经度,type="double",取值=[0,180]-->
 <Longitude>114.118047</Longitude>
 <! -- (可选)纬度,type="double",取值=[0,90]-->
 <Latitude>22.595855</Latitude>
 <! -- (可选)椭球高,单位:mm,type="int32_t",取值:变量全部范围-->

 <Altitude>100000</Altitude>
 <! -- (可选)GPS状态,NORMAL=0/INVALID=1/RTK=2,type="int32_t"-->
 <GPSStatus>0</GPSStatus>
 <! -- (可选)GPS高度类型,PRESSURE=0/GPS_FUSION=1/ RTK=2 ,type="int32_t"-->
 <GPSAltType>0</GPSAltType>
 <! -- (可选)GPS坐标类型,WGS84=0/CGCS2000=1,type="int32_t"-->

 <GPSCoorType>0</GPSCoorType>
 <! –- 注意:RTK状态的GPS的经度和纬度精确到小数点后8位、厘米级
普通状态的GPS的经度和纬度精确到小数点后5位、5米级
RTK状态的GPS的高度精确到10mm,厘米级
普通状态的GPS的高度精确到5000mm,5米级 -- >
 </HomePoint>
 </Item>
 <Item>
...
 </Item>
     </UAVList>

</UAV>

<! –- (可选)遥控器信息 -- >
  <RC>
<! -- 表示遥控器的数量-- >
<RCList Num="2">
<Item>
<! -- RCID用于判断数据属于哪一个遥控器 -- >
<RCID>01</RCID>

<! --(可选)设备型号,type=string“” -- >

<Model>RM500</Model>

<! --(可选)固件版本,type=string“” -- >
<Firmware>V10.0.0.0</Firmware>
<! -- (可选)厂商代码,type="string"-->
<Manufactor>DJI</Manufactor>

<! -- (可选)自定义设备名称,type="string"-->

<CustomDevice>dji’s RC</CustomDevice>
<! -- (可选)表示A控还是B控,0表示A控,1表示B控,type="int32_t"-- >
<RcType>1</RcType>
<! –- (可选)遥控器位置 -- >
<Pos>
<! -- (可选)经度,type="double",取值:[0,180]-->
<Longitude>114.118047</Longitude>
<! -- (可选)纬度,type="double",取值:[0,90]-->
<Latitude>22.595855</Latitude>
<! -- (可选)椭球高,单位:mm,type="int32_t",取值:变量全部范围-->
<Altitude>100.3</Altitude>
<! -- (可选)GPS状态,NORMAL=0/INVALID=1/RTK=2,type="int32_t"-->
<GPSStatus>0</GPSStatus>

<! -- (可选)GPS高度类型,PRESSURE=0/GPS_FUSION=1/RTK=2,type="int32_t"-->
<GPSAltType>0</GPSAltType>
<! -- (可选)GPS坐标类型,WGS84=0/CGCS2000=1,type="int32_t"-->
<GPSCoorType>0</GPSCoorType>
</Pos>
</Item>
<Item>

...

</Item>
</RCList>
 </RC>
 <! –- (可选)云台信息 -- >

<PTZ>
<! -- 表示云台的数量-- >
<PTZList Num="2">
<Item>
<! -- PTZID用于判断数据属于哪一个云台 -- >
<PTZID>01</PTZID>
<! -- (可选)设备型号,type="string"-->
<Model>H20T</Model>

<! -- (可选)固件版本,type="string"-->
<Firmware>V1.0.0.0</Firmware>
<! -- (可选)厂商代码,type="string"-->
<Manufactor>DJI</Manufactor>

<! -- (可选)自定义设备名称,type="string"-->

<CustomDevice>dji’s PTZ</CustomDevice>

<! –- (可选)云台姿态 -- >
<Attitude>
<! -- (可选)云台姿态-pitch,单位:0.1度,type="int16_t",取值:[364,1684],1024为停止-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际:10.3-->
<Pitch>150</Pitch>
<! -- (可选)云台姿态-roll,单位:0.1度type=" int16_t ",取值:[364,1684],1024为停止-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际值:10.3-->
<Roll>60</Roll>
<! -- (可选)云台姿态-yaw,单位:0.1度,type=" int16_t ",取值:[364,1684],1024为停止-->
<! – 此处int类型数据表示到小数点后一位,例:传输值103,实际值:10.3-->
<Yaw>90</Yaw>
<! -- (可选)云台位置-NORMAL = 0/REVERSE = 1,type=" int16_t "-->
<Position>0</Position>

<! -- (可选)云台模式-FREE = 0/FPV = 1/FOLLOW = 2,type=" int16_t "-->
<Mode>0</Mode>
</Attitude>
</Item>
<Item>
...
</Item>
</PTZList>
 </PTZ>
 <! –- (可选)智能功能数据 -- >

<SmartFunction>

     <! –- (可选)target point数据 -- >

 <TargetPoint>
 <! -- (可选)数据来源,type="string"-->
 <PointSource>DJI Pilot APP</PointSource>
 <! -- (可选)索引,type="uint32_t"-->
 <Index>1</Index>
 <! -- (可选)经度,type="double",取值:[0,180]-->
 <Longitude>114.118047</Longitude>
 <! -- (可选)纬度,type="double",取值:[0,90]-->
 <Latitude>22.595855</Latitude>
 <! -- (可选)海拔高度,单位:米,type="float",取值:变量全部范围-->
 <AltitudeElli>100.3</AltitudeElli>
 <! -- (可选)相对高度,单位:米,type="float",取值:变量全部范围-->
 <AltitudeRelative>100.3</AltitudeRelative>
 <! -- (可选)视频流窗口x, type="float",取值:[0,1]-->
 <VideoStreamWinX>100.3</VideoStreamWinX>
 <! -- (可选)视频流窗口y, type="float",取值:[0,1]-->
 <VideoStreamWinY>100.3</VideoStreamWinY>
 </TargetPoint>
 </SmartFunction>
</Notify>

2: SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.98.12.201:7060;rport=7060;branch=z9hG4bK1988393141;received=127.0.0.1

From: P1 <sip:34020000001320000002@10.98.12.201:7060>;tag=36185913

To: S1 <sip:34020000002000000001@127.0.0.1:5060>;tag=839879266

Call-ID: 360351973

CSeq: 20 MESSAGE

User-agent: GB/T28181 SERVER

Content-Length: 0

解更多内容 关注公众号

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uC/OS-II是一种常见的实时操作系统,特别适用于嵌入式系统应用。以下是一些嵌入式系统中使用uC/OS-II的常见应用: 1. 通信设备:uC/OS-II可以帮助控制通信设备的操作,包括传输数据、管理缓冲区和处理错误。 2. 汽车电子系统:现代汽车中有许多电子设备需要管理,包括引擎控制、车载娱乐系统和车载导航系统。uC/OS-II可以帮助管理这些设备,使它们能够协同工作。 3. 工业自动化:在工业自动化应用中,uC/OS-II可以协调多个任务,从而提高系统的吞吐量和响应速度。这种操作系统可以管理复杂的工业过程,并提供实时控制和监控。 4. 医疗设备:在医疗设备中,uC/OS-II可以管理多个任务和处理程序,从而确保设备能够及时、准确地响应患者的需要。 5. 智能家居:智能家居设备需要管理多个任务,包括控制照明、温度和安全系统。uC/OS-II可以帮助这些设备实现实时响应和协调。 总的来说,uC/OS-II在嵌入式系统中的应用非常广泛,可以帮助嵌入式系统实现实时响应、多任务管理和复杂操作。 ### 回答2: uC/OS-II是一个广泛应用于嵌入式系统的实时操作系统(RTOS)。 嵌入式系统是一种特殊的计算机系统,通常是嵌入到其他设备中的计算机系统。嵌入式系统广泛应用于各种领域,如汽车、航空航天、医疗、家电、通讯等。而uC/OS-II作为嵌入式系统的操作系统,具有以下应用: 首先,uC/OS-II提供了实时任务调度和管理功能。嵌入式系统通常需要同时处理多个任务,如控制、通信、显示等。而uC/OS-II能够根据任务的优先级进行实时调度,确保高优先级任务能够及时响应,保证系统的实时性能。 其次,uC/OS-II提供了多任务之间的通信和同步机制。在嵌入式系统中,不同任务之间需要进行信息交换和共享资源。uC/OS-II提供了消息队列、信号量、互斥量等机制,确保不同任务之间的协同工作。 此外,uC/OS-II提供了中断管理和时钟服务功能。嵌入式系统通常需要对各种硬件设备进行中断处理,如按键、定时器、通信设备等。uC/OS-II能够及时响应中断事件,并进行相应的处理。同时,它还提供了时钟服务,用于定时触发定时器、任务延时等功能。 最后,uC/OS-II还具备可移植性和可扩展性。它可以运行在不同的硬件平台上,支持多种处理器架构。此外,它还提供了丰富的组件和功能模块,可以方便地进行系统定制和扩展。 综上所述,uC/OS-II作为嵌入式系统中的操作系统,具有广泛的应用。它能够提供实时任务调度和管理、任务之间的通信和同步、中断管理和时钟服务等功能,使得嵌入式系统能够高效可靠地运行。 ### 回答3: 嵌入式系统中uC/OS-II是一个非常流行和广泛应用的实时操作系统。嵌入式系统是指专门设计用于特定应用领域的计算机系统,例如汽车电子、医疗器械和工业自动化等。这些系统通常具有实时性、可靠性和高效性的需求。而uC/OS-II就是为满足这些需求而开发的一款实时操作系统。 在嵌入式系统中,uC/OS-II可以应用于各种各样的领域。首先,它可以用于控制和监控系统。嵌入式系统需要对外部环境进行实时的监测和控制,以保证系统的正常运行。通过使用uC/OS-II,可以轻松实现传感器数据的采集和实时控制,从而实现自动化控制系统。 其次,uC/OS-II也是无人机和机器人控制系统的理想选择。无人机和机器人通常需要高效的任务调度和实时响应能力。uC/OS-II提供了灵活的任务管理和实时调度机制,可以帮助开发人员快速构建高性能的无人机和机器人控制系统。 此外,uC/OS-II还适用于网络通信系统。现代嵌入式系统通常需要与外部系统进行通信,以实现数据传输和远程控制。通过使用uC/OS-II提供的网络通信功能,可以轻松实现与外部设备的数据交互和通信连接。 总的来说,uC/OS-II在嵌入式系统中的应用非常广泛。它可以支持实时控制、任务调度、网络通信和数据交互等功能,满足各种不同领域嵌入式系统的需求。同时,uC/OS-II还具有可移植性和可扩展性,使得开发人员可以更加灵活地进行系统设计和开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值