本文档主要描述大疆无人机应用于行业视频联网场景中,采用GB28181国标与三方云平台对接的接口使用指南。
2015年5月,原中央综治办、发展改革委、公安部等九部委下发了《关于加强公共安全视频监控建设联网应用工作的若干意见》(发改高技[2015]996号),提出到2020年,基本实现“全域覆盖、全网共享、全时可用、全程可控”的总体目标。
2017年9月,中央综治办秘书室、国家发展改革委办公厅、公安部办公厅、国家标准委办公室联合印发《公共安全视频图像信息联网共享应用标准体系(2017版)》,将国家标准《公共安全视频图像信息联网共享应用总体要求》纳入标准体系。
GB/T28181共有3个版本:
功能分类 | 功能列表 | 相关命令 | 协议文档 | 是否支持 |
注册和注销 | 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 | 已支持 |
举例,连接华平公网28181服务器:
-
-
- 开始登录
-
-
- 在第三方平台打开视频播放
-
-
注意,GB/T28181视频推流有主动模式和被动模式,而我们仅支持被动推流,即设备上线成功以后,必须等服务器发起点播请求。
一般情况下,遥控器与服务器进行网络通信,无论在遥控器还是服务器上,抓包分析的效果是一样的。但不排除特殊疑难问题出现时,必须双方同时抓包以“自证清白”,甚至中间经过的网闸等设备也要抓包。
遗憾的是,我们的产品,无论飞机还是遥控器,一旦release之后,就没有root权限和tcpdump工具,想要抓包分析几乎不可能。这种情况下,建议先让第三方厂商服务器抓包,双方共同分析。网络抓包在第三方厂商服务器上是轻而易举就能做到的事,甚至是服务器运维必备的技能之一。
如果问题非常复杂,最后不得不在遥控器上抓包的话,需要将遥控器更新到debug版,具体方法请参考《附录二 如何升级成debug版遥控器》。
-
-
-
- Windows服务器WireShark抓包方法
- Linux服务器tcpdmp抓包方法
-
-
- 列出所有网卡
sudo tcpdump –D
- 抓包所有5060/UDP的SIP报文
sudo tcpdump –i eth0 –n –nn –v –vv udp port 5060
-n -nn会把端口号用数字打出来,不然只会把协议名称打出来;
-v -vv会把协议内容解析成文本打印出来,不然只会打印报文长度;
eth0 是你的网卡名,不知道的话可以用tcpdump –D列出所有网卡。
- 抓包所有5060/UDP的SIP报文并另存到pcap文件
sudo tcpdump –i eth0 –n –nn udp port 5060 –s0 –w /tmp/1.pcap
-w是写入文件的意思,后面跟文件名;
-s0是不要把报文截断的意思;
- 查看是否有大量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视频流了。
- 查看来自某个固定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有关的报文
-
-
-
- 遥控器debug版tcpdump抓包方法
-
-
遥控器上运行的是嵌入式linux系统,其tcpdump抓包命令跟linux服务器是一样的。不同的是,遥控器需要更新到debug版,然后用adb shell连接。以下介绍假定你手里拿的是一台debug版遥控器。
- ifconfig查看网卡ip地址
- 查看遥控器上的网卡名称
- 抓取SIP信令
su 切换到root
tcpdump –i wlan0 –n –nn –v –vv udp port 5060
- 抓取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 把输出的文件导出
-
-
-
- 遥控器历史日志目录/sdcard/导出方法
-
-
adb pull –a /sdcard/dji_logs/
遥控器可以通过4G dongle或现场共享的WiFi热点连接互联网。服务器一般部署在阿里云,或部署在单位内部,然后通过公网IP端口映射。由于服务器在互联网上,与第三方厂商联调起来相对比较方便。
这一类场景在行业应用上相对较少(尤其是公安行业有自己的专网,不会在互联网上传输)。
在接入公安专网时,很多人搞不清以下概念,现解释如下:
-
- VPN
VPN(Virtual Private Network虚拟专线) 技术是指采用隧道技术以及加密、身份认证等方法,在公众网络上构建专用网络的技术,数据通过安全的 “ 加密管道 ” 在公众网络中传播。
简单来说,就是互联网上的两个网络设备或主机,用加密技术建立一个点对点的安全链路,不需要向网络运营商定制。
如市面上用到的各种翻墙工具,包括DJI上海办公室与深圳办公室能够像局域网一样互相访问,都是基于VPN技术。VPN虚拟专线上所有数据都是链路加密的。
-
- VPDN
VPDN(Virtual Private Dial-Network虚拟专有拨号网络),在中国宽带互联网上基于拨号方式的虚拟专有网络业务,利用安全的L2TP隧道传输协议,就可以在现有的拨号网络上构建一条虚拟的、不受外界干扰的专用通道,从而安全访问企业内部网资源。
简单来说,就是大型机构或政府单位向运营商申请的特殊网络服务,以拨号方式访问企业内部局域网,通过对网络数据的封包和加密在公网上传输私有数据,与外界完全隔离,可以提供较高的安全性。
-
- APN
APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。
简单来说,就是手机3G/4G/5G上网需要的拨号配置。如果手机访问互联网,则用普通的SIM卡和手机默认的APN配置即可。如果手机访问专网,则需要用运营商给的专用SIM卡和拨号参数,手动创建一个新的APN。
TODO:实际使用中有哪些坑?
广泛存在于消防应急救援等行业,在灾害救援中,如果现场没有网络覆盖,可借助应急指挥车、自主网基础等设备,在现场共享WiFi热点,手持单兵和无人机等通过WiFi接入前方指挥中心服务器,再由前方指挥中心与后方指挥中心级联,将现场音视频或其它数据回传到后方指挥中心。
这种场景下,我们无人机遥控器与前方指挥中心服务器连接的网络比较简单,相当于局域网互联,与公司内部28181研发测试环境差不多,一般不会有什么疑难问题。
为了读者快速理解问题的解决途径,给所有问题添加等级分类,并约定如下:
确认服务器IP地址和端口(第三方平台提供)是否正确;
略。
确认本地遥控器是否正确连接WiFi(或正确配置VPDN专网账号);
确认是否能ping通服务器IP地址;
确认防火墙是否开通服务器SIP端口(通常是5060);
TODO: 遥控器网络配置截图;
TODO: 遥控器adb ifconfig截图;
国标SIP ID是长度为20个数字的编号,非常容易输错;编号规则解释如下:
举例34020000001310000001
有些服务器(如阿里云视频监控)出于安全考虑,在SIP ID或PASSWORD校验错误的时候不返回任何消息,在Pilot看到的现象就是一直登录超时,网络抓包分析发现只有发出去的注册请求,没有收到任何应答(表现的像网络不通一样)。
遥控器v2.2不能接入专网的原因:插上4G dongle以后,接入公安专网DHCP分配IP地址时,没有DNS信息,系统就会向应用层返回网络错误,导致App无法使用。
目前这个问题在中兴dongle上解决了,但华为dongle上没解决。所以如果是专网使用的话,不要用华为dongle,目前只能用中兴的dongle (中兴883U和883V)。
同时,遥控器版本必须升至v2.4及以上。
-
-
- 服务器查询DeviceInfo或DeviceStatus失败
-
有些厂商的服务器(如华平)在设备Register成功以后,开始查询设备信息、设备状态、设备目录等信息,所有查询完成以后,才会判定设备正式上线。
- 消息流程如下
- 消息示范参考附录《GB/T28181协议》
- 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]
Catalog:设备目录,可理解为子设备列表;在我们的Pilot里对应一路视频流,即SIP通道一ID对应的信息。.
设备上线后,服务器会发送Catalog查询请求,获取视频通道列表后才能发起视频点播。
- 消息流程如下:
- 消息示范参考附录《查询设备列表》。
- 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]
这是一种人为操作疏忽,并不多见。通常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
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情况下的处理日志示范
再看一下上面这个点播消息流程,服务器发起点播要经过3次握手,Pilot在收到“3:ACK”这个消息才会开始发流。如果第3步的ACK没收到,则Pilot端和服务器端同时出现点播超时。
造成ACK消息丢失的原因,主要是由于SIP通信需要跨越NAT网络,如果推流端没有正确识别到NAT映射的外网IP地址,就有可能发生ACK丢失(这时候完全取决于服务器的实现)。(SIP协议考虑了信令服务器与流媒体服务器分开的场景)。如下面的拓扑结构:
TODO:分布式拓扑结构
TODO:SIP Contact字段示范
TODO:ACK丢失的MRTC日志示范
假设SIP点播流程完全正确,抓包和日志观察信令处理是成功的,但依然没有视频流,那么不排除推流端存在某些未知Bug,导致没有发送rtp视频流。
验证方法是通过抓包或者日志,判断我们有没有持续向外发送rtp包,并检查发送目的IP:Port是否正确。
TODO:Pilot send RTP抓包
TODO: MRTC日志码流状态统计
和上面“未到ACK” 的原理是一样的,通常Pilot处于NAT内部局域网,没有办法拿到NAT映射到外网的IP地址和端口。导致SDP描述的IP:Port(本地ifconfig)在服务器判断为目标不可达或非法网络地址。
这个问题通常只出现在UDP推流场景,好在Pilot目前支持TCP推流,所以解决办法是在第三方厂商的服务器上,把点播协议改成TCP即可。(回顾一下SDP的知识,点播协议是靠SDP协商的,并且由服务器Invite时决定,所以不需要在我们Pilot上改配置)
TODO: Pilot send rtp抓包。
TODO: Server UDP抓包。
如上面的原理图所示,一个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)
-
-
- 服务器解码H264视频流失败
-
虽然国标中规定了视频的编码标准,但各厂商在H264编码仍可能存在细节差异。
如DJI的H264视频中有自己的SEI扩展(Metadata),这些标准扩展从原理上讲是不会影响播放的,但就是有些播放器的兼容性差(如海康NVR不支持多于1个SEI的H264)。
再如我们测试发现SRS服务器不支持多Slice的H264码流。
网络质量差的情况下,通过UDP传输的RTP包,存在严重丢包和乱序等问题,导致接收端难以解析出一个完整视频I帧,导致点播超时失败或卡花严重。
甚至像深圳公安VPDN这种专用的网络,即使带宽充足,仍然存在3%-5%的固定丢包率。
解决方法就是通过测试带宽定位问题或者换成TCP点播再测。
TODO:
-
-
- 国标老版本v2012
-
现行的国标是2016年发布的GB/T28181-2016,可能有此平台由于投入开发较早,仍然是GB/T28181-2012。点播上最大的区别就是视频流打包方式不同:
- 2012版:
- H264裸流直接打包成RTP (payload_type=98)
- 仅支持UDP
- 2016版:
- H264先打包成PS,再打包成RTP (payload_type=96)
- 支持UDP/TCP
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: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: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: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: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: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
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: 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: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: 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: 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: 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
了解更多内容 关注公众号