首先說明幾個協議頭:
(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的協議頭
激光雷達幀頭的一個主要作用是進行獲取幀的過濾,特別是在多個激光雷達的應用場景中。