常用通信协议及数据格式
一、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 格式的命令消息。