SOME/IP SD的通信行为
SD(Service Discovery)属于SOME/IP协议中非常核心的内容,主要提供检测和提供可用服务的功能。
SD的优点如下:
- 上电启动时,车内各ECU的启动电压和启动时间各不相同,ECU通过SD就可以灵活的官宣其Service的可用状态
- 车辆变形(可以是同款车型的不同配置,或者是车型沿用)时,可以灵活的适应功能/配置的变化,减少前期的配置工作
- 错误处理,当提供的Service出现问题时,可以通过SD即刻了解Service的不可用状态,接收方就可以做出相应的处理了
- 能源效率,需要的时候才会提供/订阅服务,减少能力消耗
SD通信主要涉及到3类报文:Find Service、Offer Service和Subscribe报文。
服务端和客户端的通信行为包含以下几个阶段:
服务端的通信行为
Down Phase
在这个阶段,Service是不可用的,即服务端无法提供服务。
Initial Wait Phase
当服务准备完毕(Available)后,进入此阶段;
如果此阶段收到Find Service报文,服务端忽略此消息,不做任何处理;
如果服务不可用了,将返回进入Down Phase;
此阶段需要定义时间参数INITIAL_DELAY_Min和INITIAL_DELAY_Max,初始化时间取其之间的随机值,当定时器超时后,发送第一帧Offer Service,标志着进入下一个阶段。
Repetition Phase
为了让客户端快速找到有哪些Service,此阶段重复发送Offer Service,重复次数由REPETITIONS_MAX决定;
发送间隔以REPETITIONS_BASE_DELAY为基本时间,每发送一次,间隔是前一间隔的2倍;
如果收到某客户端的Find Service,不影响当前阶段的发送计数和计时,延迟一定时间(REQUEST_RESPONSE_DELAY)后,单独发送单播Offer Service给服务请求端;
如果收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器;
如果收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器;
如果服务不可用,离开此阶段进入Down Phase,并发送StopOfferService通知所有客户端。
Main Phase
此阶段将周期性发送Offer Service,周期时间为CYCLIC_OFFER_DELAY;
如果收到某客户端的Find Service,不影响发送计数,延迟一定时间(REQUEST_RESPONSE_DELAY)后,发送单播Offer Service给服务请求端;
如果收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器;
收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器;
如果服务不可用,离开此阶段进入Down Phase,并发送StopOfferService。
客户端的通信行为
Down Phase
服务未被应用请求;
收到Offer Service,存储当前服务实例状态,启动TTL计时,此时服务若被应用请求,直接进入Main Phase。
Initial Wait Phase
服务被请求后,进入此阶段;
等待INITIAL_DELAY时间(最大和最小值之间的随机值);
如果此时收到Offer Service,则取消计时器,直接进入Main Phase;
如果服务请求被释放,进入Down Phase;
计时器超时后,发送第一个Find Service,进入下一阶段。
Repetition Phase
重复发送Find service,重复次数由REPETITIONS_MAX决定;
发送间隔以REPETITIONS_BASE_DELAY为基时间,每发送一次间隔加倍;
收到Offer Service,停止发送计数和计时,立即进入Main Phase;触发发送SubscribeEventgroup(延迟一定时间);
如果服务请求被释放,进入Down Phase;若有订阅,则发送StopSubscribeEventgroup。
Main Phase
不再周期发送Find Service;
收到Offer Service,触发发送SubscribeEventgroup(延迟一定时间);
如果收到StopOfferService,则停止所有计时器;
如果服务请求被释放,进入Down Phase;若有订阅,则发送StopSubscribeEventgroup。
文章参考上海怿星科技。