扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development partnership of vehicle manufacturers, suppliers, service providers and companies from the automotive electronics, semiconductor and software industry.
这是一个由整车厂,零配件供应商,以及软件、电子、半导体公司合起来成立的组织,从2003年以来, 致力于汽车电子行业提供一个开放、标准的软件架构。
核心成为有9个,分别为:博世,大陆,大众,丰田,通用,PSA,福特,宝马,奔驰。
SOMEIP : Scalable service-Oriented MiddlewarE over IP
SOMEIP 通信单元理解:
- SOMEIP 面向 service ,和service 相对的就是需要申请服务和订阅需求的client。
- 提供service 服务的 是一个个 servcie instance ,每个servcie instance 有一个 servcie id , 和 client 的client id 相对应。
- service 提供 interface 可以通过 service discover 协议广播出去。
- service interface 包括提供的method,field 和 event服务。 event服务通过eventgroup 进行组订阅,避免event 服务碎片化。
- Field 有 setter 、gettter、notifier 可选组成,至少有一个。
- Setter 、getter 以及 method ,notifier 和一组 message 相对应。
- 一组 messages 里边 对应notifier 只提供单项的event 服务。 setter ,getter 消息组 包括request 和 response message。
- message 中 包括 some/ip header 和 payload。 payload 根据具体情况进行区分。
SOMEIP 协议已经有开源实现, ghub 项目地址 : https://github.com/GENIVI/vsomeip。
SOME/IP HeaderPayLoad 根据不同的应用场景再进行区分。
针对各个字段理解如下:
MessageID 是一个笼统的概念,因为 SOMEIP 是面向service 的, 一般 MessageID 会进一步分解为 service ID 和 method ID 或者 event ID。 如图所示:
Length field shall contain the length in Byte starting from Request ID/Client ID until the end of the SOME/IP message.
Request IDPRS_SOMEIP_00043: The Request ID shall be unique for a provider- and subscriber-combination ,这一句应该是说对于 provider,针对同一个 subscriber 针对不通的method 类请求,要使用不同的 request ID,这个ID 是 subscriber 自己生成的。 包括请求里边的session ID 也是 subscriber 自己生成的。 对于 subscriber 它不关系 这个request ID,response的时候,直接copy 对应的字段,填进去即可。
那么 有没有 可能provider 收到两个 request_ID 是一样的消息呢? 有可能, 收到,反正它也不关注。 PRS_SOMEIP_00704 做了response 的说明。只是copy 过来,填进去。 区分不同的client 实体,是通过 udp 或tcp 的通信协议地址来的。 针对同一个client 中不通进程的请求,应该是通过udp或 tcp 的port 进去分析, 不同线程的请求,是通过 client_id 来区分的。 我是这样理解的。
Request ID 是 Client 用来请求 method 时区分不通的 method ,同时也要能区分不同的 client.
在 AUTOSAR 中 将Request ID 分成两部分。
The Protocol Version identifies the used SOME/IP Header format
针对SOMEIP 头的版本定义,方便对头进行解析。
针对 Service 做的版本定义,一般应该都是1。用来做,针对service 的的向后兼容。
Interface Version shall be an 8 Bit field that contains the Major
Version of the Service Interface
用来定义不通的Message ,如是Request 还是 Response,是正常response 还是异常 Response。Request 是否需要 Response等。
SOME/IP-TP: 非tcp 的 在SOMEIP 栈解决的分段协议, 全称: Transporting large SOME/IP messages of UDP.
TP header OFFSET 的理解
PayLoadTP header ,放在 SOMEIP header之后, payload 之前, 包括 一个 offerset value, 由于offset 占用的是高28位,第二个字节的高四位协议要求填0, 所以 第一个字节 的值的单位 是 16个字节 。 比如 协议上列举的1392 ,第一个字节 是 0x57. 加上第二个字节高四位 ,就是 “0101 0111 0000” 。 0x57 就是 协议上说的 87。
PayLoad 大不超过1400字节, 是为了后续 header 变化做了预留。
The size of the SOME/IP payload field depends on the transport protocol used. With UDP the SOME/IP payload shall be between 0 and 1400 Bytes. The limitation to 1400 Bytes is needed in order to allow for future changes to protocol stack (e.g. changing to IPv6 or adding security means).
PayLoad 主要是解决parameter的序列化问题。核心就是序列化的规则(要考虑到解析效率,所以一般都需要进行对齐)。
对齐的意义:
There are processor architectures which can access data more efficiently (i.e. master) when they start at addresses which are multiples of a certain number (e.g multiples of 32 Bit).
要对齐进行 Padding,padding的东西一般都要丢弃,解析一般只管自己要的,其他都丢弃(前提是message 相关字段检查没问题)。
Paramter 可以分为 固定长度考虑和非固定长度考虑,固定长度的,可以考虑不用长度前缀,非固定长度的必须要有长度前缀,方便进行数据分割解析。
The serialization of a struct shall be close to the in-memory layout. This means, only the parameters shall be serialized sequentially into the buffer. Especially for structs it is important to consider the correct memory alignment.
Struct 由于嵌套存在嵌套,尤其是内部有array 或者 strings 类型的,长度不固定。 当前也有固定长度的struct ,但是大部分可能不太固定。
Wire Type 协议描述如下:
wire type 4 ensures the compatibility with the current approach where the size of length fields is statically configured. This approach has the drawback that changing the size of the length field during evolution of interfaces is always incompatible. Thus, wire types 5, 6 and 7 allow to encode the size of the used length field in the transferred byte stream. A serializer may use this, if the statically configured size of the length field is not sufficient to hold the current size of the data struct.
String 分为 fixed 和 dynamic 的。 String 一般序列化结构是 BOM(Byte order Mark)+ content + 结束符。 结束符根据是否 UTF-8 可以分为 “\0” 或者 “\0\0”,动态的String 需要在BOM 之前加上 length 字段。
ArrayArray 不管是否fixed ,都要带 length 。
枚举定义使用 unsigned int 序列化。
BitfieldBitfield 转化为 UNIT8,UNIT16,UNIT32等完成。
UnionUnion 结构如下:
Pading Like this:
Someip-SD 是SOMEIP 的一个子协议,是在SOMEIP 协议层实现的一个 Discover 协议,主要解决 service 发现 ,事件订阅管理等服务区。 有了SD 协议, SOMEIP的应用场景更加灵活。
SOMEIP-SD Header
Flags 字段定义:
Entry 可以分为两类,一类是 Service Entry ,另外一类是 EventGroup 订阅。
Type: 用来区分 ServiceEntry 类型; encodes FindService (0x00), OfferService (0x01) and StopOfferService (0x01) 。
Index of 1st options:这个值表示的是后续options 中的索引。
service entry 中包含的主要是一些ID 管理和识别类消息,其他entry content 需要通过options 进行存放。 这个是用来描述1st 在options 中的位置。 不用看,options 也是一个数据,数据长度通过option 中的length来控制。(entry 大小固定为16个字节,所以前边+length 就可以知道 optional 的起始位置)。
#of opt 1: 定义 index of 1st options index 以后用了多少个option。0 表示没有option。 and Index of 1st Options 要设置为0。
TTL: entry 的 lifetime ,不是太理解?
Value | Type Name |
---|---|
1 | Configuration Option |
2 | Load Balancing Option |
4 | IPv4 Endpoint Option |
6 | IPv6 Endpoint Option |
AutoSAR 官网连接: https://www.autosar.org
wireshark SOMEIP: https://www.cnblogs.com/fll0601/p/16058136.html
Git hub 地址
https://github.com/COVESA/vsomeip
windows: doxygen+graphviz生成工程中的类继承树及函数调用图
http://t.zoukankan.com/chenyang920-p-5730149.html
graphviz 下载:
https://graphviz.org/download/
doxygen 下载:
https://www.doxygen.nl/download.html
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流