5.1 SOME/IP-SD协议头
首先,依照惯例我们先来看下SOME/IP-SD的报文格式如下图11所示:
图11 SOME/IP-SD Message Format
一般而言,如果没有特别要求,在SD报文格式中的内容均按照大端方式传输。
由于SOME/IP-SD报文实际上也只是SOME/IP报文的一种,只不过是在SOME/IP标准协议的基础上扩展了Entry,Option等字段,其中Entry用于同步服务实例的状态以及发布/订阅关系的管理,Options则用于传输Entry的附加信息。
接下来,我们将针对上述的协议中各种字段为大家一一解释如下表3:
表3 SOME/IP-SD 协议内字段解释
5.2 Entry Array
如上表1中所述,Entry Array按照SD的定义可分为以下两种:
- Service Type:用于FindService,OfferService,StopOfferService这几种场景;
- EventGroup Type: 用于 SubscribeEventgroup, StopSubscribeEventgroup,SubscribeEventgroupAck,SubscribeEventgroupNack这几类场景。
5.2.1 Service Entry Array
如下图12所示,首先我们介绍下为Service Entry Array中定义的各个字段内容:
图12 Service Entry Array定义
对上述Service Entry Array定义的各个Field解释说明如下表4所示:
表4 Service Entry Array字段解释说明
5.2.2 EventGroup Entry Array
介绍完Service Entry Array,相比之下EventGroup Entry Array又存在哪些差异呢?如下图13为EventGroup Entry Array的各个字段内容的定义:
图13 EventGroup Entry Array定义
相比Service Entry Array,EventGroup Entry少了Minor Version,但是多出了Counter以及EventGroup ID内容,接下来我们将对上述EventGroup Entry Array定义的各个Field解释说明如下表5所示:
表5 EventGroup Entry Array字段解释说明
- Type:当Client收到服务OfferService之后,Client可以发送Subscribe报文主动跟Service订阅感兴趣的事件组;当Client订阅某个事件组之后,后续发现不再需要改事件组的数据了,可以通过StopSubscribe报文来通知Service,避免不必要的数据交互;当Service收到Client的Subscribe报文之后,需要先行判断是否符合可订阅的条件,如果该Client满足事件组订阅条件,则返回SubscribeAck,告知Client订阅成功,当事件组内的事件准备就绪之后,Service会以某种约定好的形式发送相关事件给成功订阅的Client,如果该Client不符合事件组订阅条件,Service就会直接回复SubscribeEventgroupNack,告知订阅失败。
- InitialDataRequested Flag:如初始值由服务发送,须置为1
- Counter:区分相同订阅者的订阅请求
- EventgroupID:事件组ID,也就是说SOME/IP事件订阅和取消订阅的颗粒度到一个事件组,而不是一个事件
5.3 Option Array
Option Array作为SOME/IP-SD报文最后的部分,其主要作用就是为了提供在通信的过程中提供下附加信息,如配置信息,IP地址,端口号等。不过其作为SD报文的一部分也存在着自身的字段内容。
AUTOSAR将Option Array主要分为以下三种:
- Configuration Options:用于配置通信过程的必要的信息;
- Endpoint Options(IPV4/IPV6):用于传递IPV4或者IPV6的Endpoint信息(IP地址+Port号)以及使用的传输层协议;
- Multicast Options(IPV4/IPV6):用于广播IPV4或者IPV6的IP地址及Port号,其中传输层协议只能使用UDP协议。
5.3.1 Configuration Options
接下来我们来对这三种Option进行一一解读。首先来看看Configuration Option的字段定义:
图14 Configuration Option字段定义
注意:configuration options仅适用于任意Service ID的Service Entry Array以及Service ID为0xFFFE的EventGroup Entry Array。
针对上述字段解释如下表6所示:
表6 Configuration Option Array字段解释说明
对于那些非标准的SOME/IP服务,由于不能够被Service ID进行标识,此时就需要通过一个key“otherserv”的值来进行标识,这类服务则可通过使用0xFFFE作为Service ID同时附带otherserv的value的configuration option来完成双方的通信。
5.3.2 Endpoint Options(IPV4/IPV6)
5.3.2.1 IPV4 Endpoint Option
如下图15为IPV4 Endpoint Option的字段定义:
图15 IPV4 Endpoint Option字段定义
5.3.2.2 IPV6 Endpoint Option
如下图16为IPV6 Endpoint Option的字段定义:
图16 IPV6 Endpoint Option字段定义
5.3.2.3 IPV4 SD Endpoint Option
如下图17为IPv4 SD Endpoint Option的字段定义:
图17 IPV4 Endpoint Option字段定义
5.3.2.4 IPV6 SD Endpoint Option
如下图18为IPv6 SD Endpoint Option的字段定义:
图18 IPv6 SD Endpoint Option定义
5.3.3 Multicast Options(IPV4/IPV6)
5.3.3.1 IPv4 Multicast Option
如下图19为IPv4的Multicast Option各字段内容定义:
图19 IPv4 Multicast Option
5.3.3.2 Ipv6 Multicast Option
如下图20为IPv6的Multicast Option各字段内容定义:
图20 IPv6 Multicast Option定义
由于上述六种IPV4与IPV6字段内容大体结构一致,因此我们将该两者放在一起来对各字段内容进行解释说明:
表7 IPv4/IPv6六类Option字段解释说明
5.4 SD状态机
不管是客户端还是服务端,都有同样的状态机,但是他们的状态机具有不同的行为。
状态 | 服务端行为 | 客户端行为 |
Down | Service不可用 | 服务未被应用请求,则停留在该状态; 收到OfferService,启动TTL计时器,此时服务若被应用请求,进入Main; |
Init | 进入条件: 当服务准备完毕(Available)后; During: 收到Find Service报文,服务端忽略此消息; 退出条件: 若服务不可用了,将进入Down ; INITIAL_DELAY,当定时器超时后,进入Repetition。 | 进入条件: 服务被请求后,进入此阶段; During: 等待INITIAL_DELAY时间; 退出条件: 如果此时收到Offer Service,则取消计时器,直接进入Main ; 如果服务请求被释放,进入Down ; 计时器超时后,发送第一个Find service,进入Repetition。 |
Repetition | 作用: 为了让客户端快速找到有哪些Service, During: 如果收到某客户端的FindService,延迟一定时间后,单独发送单播OfferService给服务请求端; 如果收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器; 如果收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器; 退出条件: 如果服务不可用,离开此阶段进入Down ,并发送StopOfferService通知所有客户端。 | 作用: 重复发送Find service; 退出条件: 收到Offer Service,停止发送计数和计时,立即进入Main 触发发送SubscribeEventgroup; 如果服务请求被释放,进入Down ,若有订阅,则发送StopSubscribeEventgroup。 |
Main | 作用: 此阶段将周期性发送OfferService; During: 如果收到某客户端的FindService,不影响发送计数,发送单播OfferService给服务请求端; 如果收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器; 收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器; 退出条件: 如果服务不可用,离开此阶段进入Down,并发送StopOfferService。 | 作用: 不再周期发送Find Service,不必要负载; During: 收到Offer Service,触发发送SubscribeEventgroup; 如果收到StopOfferService,则停止所有计时器; 退出条件: 如果服务请求被释放,进入Down Phase;若有订阅,则发送StopSubscribeEventgroup。 |