首先说明几个协议头:
(1)14字节的EthernetHeader
typedef struct _EthernetHeader {
u_char DestMAC[ETHER_ADDR_LEN]; //目的MAC地址 6字节
u_char SourMAC[ETHER_ADDR_LEN]; //源MAC地址 6字节
u_short EthType; //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp协议 2字节
} EthernetHeader
(2)20字节IPv4的协议头
typedef struct _IpHeader{
u_char VerIhl; // 版本4 + 首部长度4Version (4 bits) + Internet header length (4 bits)
u_char Tos; // 服务类型Type of service
u_short Tlen; // 总长度Total length,包括IP20字节的头
u_short Identification; // 标识Identification
u_short FlagsFo; // 标志(4 bits)+片偏移(12 bits)Flags (3 bits) + Fragment offset (13 bits)
u_char Ttl; // 生存时间Time to live
u_char Proto; // 协议类型:TCP(6)、UDP(17)、ICMP(1)
u_short Crc; // 首部校验和Header checksum
u_char SourceIpAdd[4]; // 源地址Source address
u_char DestIpAdd[4]; // 目标地址Destination address
}IPHeader;
(3)8字节UDP header
typedef struct _UDPHeader{
u_short SrcPort; // Source port
u_short DestPort; // Destination port
u_short Len; // Datagram length
u_short Crc; // Checksum
}UDPHeader;
velodyne64的一个帧头的原始数据如下:
解析如下:
HDL 42字节帧头(14+20+8,按照前面的三个协议帧头排列,也可以参看HDL的参考手册)
255 255 255 255 255 255
//FF FF FF FF FF FF
96 118 136 64 18 69
// 60 76 88 40 12 45 源MAC地址 6字节,见器件标签
08 00
//0x0800代表上一层是IP协议
===========================
69
00
04 210
00 01
00 00
128
17
// UDP
177 138
192 168 1 64
//源地址
192 168 1 255
//目标地址
//以上为IPv4的协议头
==========================
1 187
9 64
4 190
0 0
//以上为UDP的协议头
激光雷达帧头的一个主要作用是进行获取帧的过滤,特别是在多个激光雷达的应用场景中。