SOME/IP学习随笔
1. mcal模块和someip的关系?
SOMEIP位于AutoSar的服务层,和应用打交道
MCAL位于Autosar的底层,和硬件微控制器打交道
SOMEIP依赖MCAL的以太网控制器模块的以太网驱动对外进行通信
2. someip和CAN之间的联系?
SOMEIP的HEADER有ServiceID(16bit) + Method(16bit)
可以将ServiceID+Methoid这32bit(4字节)映射到CANID上
其中ServiceID仍然可以保留,表示后面的CANID是属于哪一块业务的(例如车身,底盘,控制域等)
后面的MethodID这16bit(2字节)需要重新划分
a. 表示CAN报文属于通知还是方法 (1bit)
b. CAN通道ID (4bit)
c. CANID (11bit)
然后CAN报文的payload就放在SOMEIP的payload部分就可以了
当使用Someip的域和使用CAN的域之间想要互相通信,一般需要一个网关来做中转,类似的使用DDS和CAN之间的域也需要一个网关模块来做中转,这个网关可以是一个独立的硬件模块。
3. field中的notifier是否也要包含在eventgroup中?
是的,field中的notifier和event一样,都需要在eventgroup中
4. 订阅的Subscriber报文中是否需要指定要订阅的eventgroup
需要指定eventgroup
5. 什么是TLV格式结构?
TLV结构是一种常见的数据序列化格式,这种格式将数据分为三个部分:
a. 标签(tag):用于标识字段的类型(例如ID, NAME, AGE这种,相当于KEY)
b. 长度(length):用于表示字段的长度,不同字段类型的长度所占字节数是不一样的
c. 值(value):用于存储字段值
6. vsomeip配置文件中的单播地址的作用是什么?
单播地址出现在配置文件的最开始位置,是用来对外发布offer报文的时候,填写在service的option中的
7. 如果客户端只是request了service,没有request event,那么routingmanagerd还会发送subscribe报文吗?
A: 1. 从协议规范上判断
2. 从实际vsomeip实现和测试结果来看
8.Session ID的设置规则是怎样的?
因为Session ID都是SOME/IP消息的发送方设置在SOME/IP的Header中的,
如果该SOME/IP消息是发给组播地址的,不管是几个组播地址,都是共用一个Session ID计数器。
如果该SOME/IP消息是发送给单播地址的,那么应当根据(src ip / src port / dst ip / dst port)四元组维护Session ID计数器。
9. SD消息Header部分的Reboot Flag的作用是什么?
SOME/IP-SD消息的SD Header中的Reboot Flag在整个SOME/IP协议栈重启后设置为1,当且仅当已发送的SOME/IP-SD消息的Session ID已经完成一次循环从1重新开始的时候,才会将Reboot Flag设置为0。
SOME/IP-SD消息的SD Header中的Reboot Flag的复位(从1变为0)是根据SD消息的发送目标地址而分开设置的。
因此,针对Reboot Flag,发送端和接收端都需要维护一个计数器
对于发送端:
对组播地址维护一个定时器
对每一对单播地址的通信对(src IP/src Port/dst IP/dst Port)维护一个定时器
对于接收端:
对每个组播地址维护一个定时器
对每一对单播地址的通信对(src IP/src Port/dst IP/dst Port)维护一个定时器
如下两种情况可以判断SD消息的发送端发生了重启
a. 该发送端上一包SD消息中的Reboot Flag=0,本次收到的SD消息中Reboot Flag=1
b. 本次收到的SD消息Reboot Flag没有变化,还是1,但是Session ID变小了
10. 如何处理Reboot的情况?
对于服务的提供方,收到服务订阅方的SD消息(Subscribe)中有Reboot的情况,则服务的提供方应当按收到订阅方UnSubscribe消息的方式进行处理
对于服务的订阅方,收到服务提供方的SD消息(OFFER)中有Reboot的情况, 则服务的订阅方应当按照收到提供方StopOffer消息的方式进行处理
11. 如何找到Offer报文中的ServiceEntry的Option?
每个SOME/IP Service Instance的ServiceEntry都有两个重要的成员
a. index of option1(2)
b. number of option1(2)
index代表option1(2) 在Options中的序号
number代表option1(2)有几个option(通常是0或者1个)
例如:
代表ServiceID=0x2004的实例0x0001只有Option1(因为Number Of Opts 2 = 0,说明Option2中没有内容),然后Option1的起始索引为0x04(在下方的Options中从上往下数第五个),总共有两个Option Entry