1 SOME/IP 消息的布局
前面两篇文章「SOME/IP概述【分层结构及要实现的需求】」、「SOME/IP概述2【SOME/IP的主要中间件功能+SOME/IP报文PDU的封装】 」讲述了SOME/IP的基本概念/需求及架构在以太网的4层模型。这一篇我们研究一下SOME/IP 消息报文的帧格式是什么?我们要按照这个格式才能让发送和接收的双方心领神会,知道对方说了什么?先看代码,大概理解一下:
typedef struct someip_header_s { uint32_t msg_id; uint32_t length; uint32_t req_id; uint8_t protocol_ver; uint8_t interface_ver; uint8_t msg_type; uint8_t ret_code; uint8_t payload[0]; } __attribute__((packed)) someip_t;
注意 payload[0]可变零长度数组经常以变长结构体的形式。在一个变长结构体中,零长度数组不占用结构体的存储空间,但是我们可以通过使用结构体的成员 payload去访问内存,非常方便,其本质是一块可变字节长度缓存的首地址。
根据SOME/IP 需求,SOME/IP 协议应定义SOME/IP 消息的报文头的布局。下图定义了SOME/IP 消息的布局(报文头+Payload的布局)。
SOME/IP报文头 长 为16 个字节,包含以下部分:
- (1)第一个 4 字节包含消息标识符,可以是服务ID或方法ID
- (2)第二个 4 字节包含消息长度
- (3)第三个 4 字节包含请求标识符
- (4)第 12 字节包含 SOME/IP 协议版本
- (5)第 13 字节包含服务接口版本
- (6)第 14 个字节包含消息类型,它是SOME/IP功能实现的重要部分,其长度为8 bit,有以下五种取值:
- ① REQUEST(期待响应的请求)
- ② REQUEST_NO_RETURN(不期待响应的请求)
- ③ NOTIFICATION(事件通知)
- ④ RESPONSE(响应消息)
- ⑤ ERROR(报错消息)
- (7)第 15 个字节包含可能的消息错误代码
SOME/IP有效Payload是可变长度的字节缓存,包含以下部分:
- 包含已经序列化的Event/Field/Method的内容
。。。。。。。。。。。