车载以太网之SomeIP-SD协议
1、SomeIP-SD简介
Service Discovery (SD)用于定位服务实例,检测服务实例是否正在运行,以及实现Publish/Subscribe 处理的一种应用层协议,该协议只能运行在UDP之上,服务发现报文格式与SOME/IP标准协议一致。
在车内网络中,服务实例的位置一般是已知的;因此,服务实例的状态是主要关注点。服务的位置(即ip地址、传输协议和端口号)是次要关注点。
1)SomeIP-SD主要以多播的形式发送。其中Service Entry 三种服务支持多播传输;offer Service也可以单播传输。Event Group Entry 只支持单播传输
2)SomeIP-SD主要是通过UDP进行数据传输安的。
3)Option是Entry的附属信息
2、Client与Server的交互过程
如下图的交互过程,提供服务,订阅服务,该过程如果用专业术语来讲可称为Subcribe/Publish模型,该模型涉及到Client与Server两方。
1)对于需要服务的Client而言,通过FindService来发现当前网络中存在的Service;
2)如果Server存在服务就会通过Offer Service方式来广播通知自身存在的Service;
Client根据已发现的服务中通过Subcribe EventGroup的方式来订阅相关事件,同时、
3)在Server端发现Client端的订阅满足条件则会回复正确的肯定响应否则回复否定响应;
4)当Client订阅成功后,Server端便会按照服务的基本属性来事件型或者周期性提供Client端相关的服务(当Client订阅成功后,会发送Notify(field))。
3、SD报文的格式
如果没有特别要求,在SD报文格式中的内容均按照大端方式传输。
SOME/IP-SD报文也是SOME/IP报文的一种,只是在SOME/IP标准协议的基础上扩展了Entry,Option等字段,其中Entry用于同步服务实例的状态以及发布/订阅关系的管理,Options则用于传输Entry的附加信息。
SD 报文的 Service ID 是 0xFFFF 。
SD 报文的 Method ID 是 0x8100。
即MessageID 0xFFFF8100是固定值。
SD 报文的 Length 是包含 Length之后内容的长度。
SD 报文的 Client ID:16bits 区分请求同一服务 Service 的不同客户端。。
SD 报文的 Session ID :16bits ,同一客户端请求同一服务 Service 的次数;从 0x0001 开始,达到 0xFFFF 后,重新从 0x0001 开始循环。
Request ID:32 位( Client ID+Session ID ),其作用是区分区分不同的调用 Client 。
SD 报文的 Protocol Version 应设置为 0x01 。
SD 报文的 Interface Version 应设置为 0x01 。( Interface Version 和 Major Version要保持一致)
SD 报文的 Message Type 应设置为 0x02 Notification )。
SD 报文的 Return Code 应设置为 0x00 E_OK )。
下图是SD的报文格式:
3.1 Flags
SOME/IP SD Header 的开始。
Flags 字段用于指示全局的 SD 信息,包括 最近一次重新启动的状态以及接收单播报文的能力。
Flags字段占 8bits ;最高位是 Reboot Flag ,次高位是 Unicast Flag 。
Reboot Flag 在重启或上电时设置为“ 1 ”。
Reboot Flag 在 Session ID 完成从 0x0001~0xFFFF 的一个循环,再次从 0x0001 开始之后,设置为
0 ”。
对于 unicast 和 multicast SD 应分别记录最后接收到的 Session ID 值和 Reboot Flag 值;因此通过
multicast 接收到的值,不能通过接收到 unicast 报文更新。
SD 可基于连续的 Session ID 变化和 Reboot Flag 的值检测通信对端是否重启( new 表示当前报文种的值, old 表示之前收到的最后一个值):
if old.reboot0 and new.reboot1 then Reboot detected
if old.reboot1 and new.reboot1 and old.session_id>=new.session_id then Reboot detected
使用 Session ID 和 Reboot Flag 检测到的重新启动,将导致该通信对端控制的本地状态过期。