常用通信协议及数据格式

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 常用通信协议和格式总结

常用通信协议及数据格式

一、MAVLink协议

1.协议结构

| Header | Payload | Footer |

2.结构拆分

协议头(Header)

  • 起始字节(1字节):通常为十六进制0xFE

  • 有效载荷长度(1字节):消息体长度

  • 通信协议版本(1字节):协议版本号

  • 系统ID(1字节):发送者系统ID,1-255

  • 组件ID(1字节):发送者组件ID,1-255

  • 消息序列号(1字节):消息顺序

  • 消息类型(1字节):消息类型

  • 通信标志(2字节):CRC校验码

载荷(Payload)

2.1姿态信息消息 (ATTITUDE):用于传输飞行器的姿态信息,包括姿态角度、角速度等。

float roll; // 横滚角(单位:弧度)

float pitch; // 俯仰角(单位:弧度)

float yaw; // 偏航角(单位:弧度)

float rollspeed; // 横滚角速度(单位:弧度/秒)

float pitchspeed; // 俯仰角速度(单位:弧度/秒)

float yawspeed; // 偏航角速度(单位:弧度/秒)

2.2 GPS位置信息消息 (GLOBAL_POSITION_INT):用于传输飞行器的 GPS 位置信息,包括经度、纬度、海拔高度等。

int32_t lat; // 纬度(单位:度 * 1E7)

int32_t lon; // 经度(单位:度 * 1E7)

int32_t alt; // 海拔高度(单位:毫米)

int16_t vx; // X轴速度(单位:厘米/秒)

int16_t vy; // Y轴速度(单位:厘米/秒)

int16_t vz; // Z轴速度(单位:厘米/秒)

2.3 传感器原始数据消息 (RAW_IMU):用于传输飞行器的传感器原始数据,如加速度计、陀螺仪、磁力计等。

int16_t xacc; // X轴加速度计原始值

int16_t yacc; // Y轴加速度计原始值

int16_t zacc; // Z轴加速度计原始值

int16_t xgyro; // X轴陀螺仪原始值

int16_t ygyro; // Y轴陀螺仪原始值

int16_t zgyro; // Z轴陀螺仪原始值

int16_t xmag; // X轴磁力计原始值

int16_t ymag; // Y轴磁力计原始值

int16_t zmag; // Z轴磁力计原始值

尾部(Footer)

在 MAVLink 中,尾部通常包含了 CRC(Cyclic Redundancy Check)校验码,用于检测消息在传输过程中是否发生了错误或损坏。CRC 校验码可以用来验证消息的完整性,确保消息在传输过程中没有被篡改或损坏。

注:Footer中校验CRC是对整条数据进行校验,Header中的通信标识CRC是对有效载荷中的数据进行校验。

二、RTP协议

1.协议结构

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|V=2|P|X| CC |M| PT | sequence number |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| timestamp |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| synchronization source (SSRC) identifier |

+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

| contributing source (CSRC) identifiers |

| .... |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| RTP payload (audio/video data) |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.协议拆解

  • V (Version):2位。标识RTP版本号。当前版本为2。

  • P (Padding):1位。指示RTP数据包末尾是否包含了填充字节。

  • X (Extension):1位。指示RTP头部后是否跟随一个扩展头部。

  • CC (CSRC Count):4位。指示CSRC标识符的数量。

  • M (Marker):1位。用于指示RTP数据包的最后一个数据包或者一组相关的数据包。

  • PT (Payload Type):7位。指示RTP载荷的类型,例如音频、视频等。

  • Sequence Number:16位。用于标识RTP数据包的序列号,从0开始递增。

  • Timestamp:32位。用于标识RTP数据包的时间戳,单位为采样时钟频率的时间单位。

  • SSRC (Synchronization Source):32位。标识数据源,用于实现同步。

  • CSRC (Contributing Source):32位。包含了一系列贡献源(通常是一组参与混音的源)的标识符。

  • RTP Payload:变长。包含了RTP数据包的有效载荷,可以是音频、视频或其他类型的数据。

三、RTSP协议

1.协议结构

1.1请求

\<方法> \ RTSP/\<版本号>

\<头部1>: \<值1>

\<头部2>: \<值2>

...

\<头部n>: \<值n>

\<消息体>

1.2 响应

RTSP/\<版本号> \<状态码> \<状态文本>

\<头部1>: \<值1>

\<头部2>: \<值2>

...

\<头部n>: \<值n>

\<消息体>

2.协议拆解

2.1 请求

  • \<方法>:表示客户端希望服务器执行的操作,如 DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN 等。
  • \:表示服务器上的资源的URL路径。
  • RTSP/\<版本号>:表示协议版本,如 RTSP/1.0。
  • \<头部>:包含了一系列请求的元数据信息,如 CSeq(命令序列号)、User-Agent(客户端标识)、Session(会话标识)等。
  • \<消息体>:可选,用于传输请求的主体数据,例如在 SETUP 请求中包含的媒体流描述。

2.2 响应 

  • RTSP/\<版本号>:表示协议版本,如 RTSP/1.0。

  • \<状态码>:表示服务器对请求的处理结果,如 200 OK、404 Not Found 等。

  • \<状态文本>:表示状态码的简要描述。

  • \<头部>:包含了一系列响应的元数据信息,如 CSeq(命令序列号)、Content-Type(内容类型)等。

  • \<消息体>:可选,用于传输响应的主体数据,例如在 DESCRIBE 响应中包含的媒体流描述。

四、WebScoket协议

1.协议格式

1.1握手请求(http)

GET /path/to/resource HTTP/1.1

Host: host.domain

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: \

Sec-WebSocket-Version: 13

1.2 握手响应(http)

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: \

1.3 传输格式

FIN (1 bit) | RSV1 (1 bit) | RSV2 (1 bit) | RSV3 (1 bit) | Opcode (4 bits) | Mask (1 bit) | Payload Length (7 bits or 7+16 bits or 7+64 bits) | Masking Key (0 or 4 bytes) | Payload Data (variable length)

2.协议拆解

2.1 握手请求

GET /path/to/resource HTTP/1.1:表示请求的资源路径,通常是 WebSocket 服务器的 URL。

Host: host.domain:表示服务器的主机名。

Upgrade: websocket:表示要升级到 WebSocket 连接。

Connection: Upgrade:表示要升级到新的连接协议。

Sec-WebSocket-Key: \:表示一个随机生成的 Base64 编码的密钥,用于验证握手请求的合法性。

Sec-WebSocket-Version: 13:表示 WebSocket 协议的版本号。

2.2 握手响应

HTTP/1.1 101 Switching Protocols:表示握手成功,正在切换协议。

Upgrade: websocket:表示升级到 WebSocket 连接。

Connection: Upgrade:表示连接已升级。

Sec-WebSocket-Accept: \:表示服务器根据客户端发送的密钥生成的一个验证密钥,用于确认握手请求的合法性。\

2.3 数据传输

FIN:1 位,表示消息是否已经结束。 RSV1, RSV2, RSV3:各占 1 位,保留位,用于扩展协议。
Opcode:4 位,指定数据帧的类型,如文本帧、二进制帧、Ping 帧、Pong 帧等。
Mask:1 位,表示是否对数据进行掩码处理。
Payload Length:7 位,表示负载数据的长度,可以是 7 位长度、16 位长度或 64 位长度。
Masking Key:4 字节,如果数据帧被掩码处理,包含用于解码数据的密钥。
Payload Data:变长,表示负载数据。

五、RTMP协议

1.协议格式

|Header|Body|

2.协议拆解

2.1消息头

消息类型(Message Type):占用 8 位,指示消息的类型,如音频消息、视频消息、命令消息等。

消息长度(Message Length):占用 24 位,表示消息体的长度,以字节为单位。

时间戳(Timestamp):占用 24 位或 32 位,表示消息的时间戳,通常以毫秒为单位。时间戳的精度取决于消息头中的时间戳格式字段。

时间戳格式(Timestamp Format):占用 8 位,表示时间戳的格式,可能是相对时间戳、绝对时间戳或扩展时间戳等。

消息流 ID(Message Stream ID):占用 32 位,用于标识消息所属的消息流。在某些情况下,消息流 ID 可以为 0 表示共享的命令消息。\

2.2 消息体

消息体是可变长度的,包含了实际的音频、视频数据或命令数据。

2.3 消息类型

Chunk Size Control Message:用于设置块大小。
Abort Message:中止当前消息。
Acknowledgement Message:确认接收到的消息数量。
User Control Message:用户控制消息,如流的开始、停止等。
Window Acknowledgement Size Message:设置接收端的窗口大小。
Set Peer Bandwidth Message:设置对端的带宽。
Audio Message:音频数据消息。
Video Message:视频数据消息。
AMF0/AMF3 Command Message:AMF0 或 AMF3 格式的命令消息。

目录
相关文章
|
2月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
157 1
|
2月前
|
监控 Java 开发工具
Springboot秒集成-视频推拉流
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
248 10
|
2月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
221 3
|
2月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
212 1
|
2月前
|
IDE Java 开发工具
IntelliJ IDEA 使用技巧与插件推荐
IntelliJ IDEA 是一个功能强大、扩展性丰富的开发工具。通过掌握常用的快捷键和技巧,结合合适的插件,可以大幅提升你的开发效率。
115 1
|
2月前
|
前端开发 Java 应用服务中间件
快速解决Nginx跨域问题
项目场景:在集成nginx代理反向代理时,出现的跨域问题的解决方法。
266 1
|
2月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
118 4
|
2月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
626 13
|
2月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
82 5
|
2月前
|
安全 Java 数据安全/隐私保护
Springboot应用开发-SpringBootSecurity
Spring Boot Security 是 Spring 提供的安全框架,集成了身份认证和授权功能,帮助开发者快速构建安全的应用程序。本篇博客将从功能介绍到配置和实践,带您全面了解 Spring Boot Security。
645 1
Springboot应用开发-SpringBootSecurity

热门文章

最新文章