6. SD服务
SOME/IP-SD协议是SOME/IP协议的一种, 基于服务的通信需要Server/Client共同完成,在服务创建并且可用之后,Server和Client需要通过SOME/IP-SD动态创建两者之间的连接。Client在订阅服务之前,需要知道Server提供的服务列表;这个过程是通过“服务发现”来实现的。
SOME/IP-SD是服务的信息清单及管理机制,主要实现服务寻址及事件订阅两种功能。对服务进行寻址时,服务提供者(Server)通知Client某服务可用,并间接通知该服务的地址信息(Server端IP地址,端口号,协议),Client了解到某服务状态后,能够调用该服务的相关内容。
6.1 功能
-
应用之间传达自己的服务或获取对方的服务是否可用。
-
向其他应用程序订阅服务。
6.2 帧格式
SOME/IP标准协议的基础上扩展了Entry,Option等字段
-
发现服务FindService&OfferService
-
订阅服务Subscribe&SubscribeACK

-
MessageID(32bit)
固定为0xFFFF8100(Service ID为0xFFFF,Method ID为0x8100)
-
Length(32bit)
表示Request ID至Payload的字节长度;
-
RequestID(32bit)
用来响应特定的数据请求和发送
-
ClientID(16bit)
一般固定为0x0000
-
SessionID(16bit)
初始化配置为0x0001,在每发送一次数据后便加1
-
-
ProtocolVersion
固定为0x01
-
InterfaceVersion
固定为0x01
-
Messagetype
固定为0x02
-
ReturnCode(8bit)
主要用来指明通信中的相关错误的信息
-
Flags
-
Bit7 RebootFlag:是否发生重启
-
Bit6 UnicastFlag:是否支持单播
-
-
EntriesArray
理解为“入口”,包含了服务实例以及需要订阅的事件组的信息
-
Service(服务Entry类型)
-
Type: 区分Service不同的场景;FindService(0x00),OfferService(0x01)和StopOfferService(0x01)
-
Index 1st options:表示first option run的第一个option索引值
-
Index 2nd options:表示second option run的第二个option索引值
-
#of opt 1:first option run使用的option总数目
-
#of opt 2:second option run使用的option总数目
-
ServiceId:用于表示涉及的服务的Id,通过SdServerServiceID/SdClientServiceID静态设置
-
InstanceId:注的服务实例的ID,设置为0xFFFF,表示一个服务的所有服务实例
-
MajorVersion:用于识别服务主体的主版本,通过SdClientServiceMajorVersion/SdServerServiceMajorVersion设置,0xFF表示任意版本
-
TTL:Entry的生命周期,通过SdServerTimer/SdClientTimer静态设置
-
Minor: 用于识别服务实体的次版本,通过SdClientServiceMinorVersion/SdServerServiceMinorVersion设置,0xFFFFFFFF表示任意版本
-
FindService
-
TypeID: 0x00
-
ServiceId: 设置为被发现的ServiceId
-
InstanceId: 0xFFFF,所有服务实例返回;指定InstanceId,单一指定返回
-
Major Version: 0xFF,任意版本的服务实体返回;指定MajorVersion,单一指定返回
-
SdVersionDrivenFindBehavioral:
如果设置为EXACT-OR-MINOR-VERSION, minor version需设置为OxFFFFFFFF,如果不是OxFFFFFFFF,必须特定minor version返回;
如果设置为MINIMUM_MINOR_VERSION,最小版本应设置为可接收的版本,如果为OxFFFFFFFF,则任意minor version的服务实体则返回;
-
TTL:不能设置为0。设置成0xFFFFFF,则在下一次启动前一直有效
-
-
OfferService
-
TypeID: 0x01
-
ServiceId: 设置为被发现的ServiceId
-
InstanceId: 设置为被发现的InstanceId
-
Major Version: 设置为Service Instance的Major Version。见参数SdServerServiceMajorVersion,其最大值只能配置成OxFE
-
Minor version: 设置为Service Instance的Minor Version
-
TTL: Service Instance的生命周期,超时之后则为无效;设置成0xFFFFFF,则在下一次启动前一直有效
-
-
StopOfferService
-
TypeID: 与OfferService中保持一致
-
ServiceId: 与OfferService中保持一致
-
InstanceId: 与OfferService中保持一致
-
Major Version: 与OfferService中保持一致
-
Minor version: 与OfferService中保持一致
-
TTL: 应设置为0x00
-
-
-
EventGroup(事件组Entry类型)
-
Type: 区分Service不同的场景;Subscribe(0x06),StopSubscribeEventgroup(0x06),SubscribeAck(0x07)和SubscribeEventgroupNack(0x07)
-
Index 1st options:表示first option run的第一个option索引值
-
Index 2nd options:表示second option run的第二个option索引值
-
#of opt 1:first option run使用的option总数目
-
#of opt 2:second option run使用的option总数目
-
ServiceId:用于表示服务的Id,通过SdServerServiceID/SdClientServiceID静态设置
-
MajorVersion:用于识别服务主体的主版本,通过SdClientServiceMajorVersion/SdServerServiceMajorVersion设置
-
TTL:Entry的生命周期,通过SdServerTimer/SdClientTimer静态设置
-
Counter: 用于区分同一订阅者的相同订阅事件组。 如果不使用,设置为0x0
-
EventGroupId:用于标识某个特定EventGroup的ID,通过SdConsumedEventGroupID静态设置
-
SubscribeEventgroup
-
TypeID: 0x06
-
Counter:区分不同的SubscribeEventgroup
-
-
StopSubscribeEventgroup
-
TypeID: 0x06
-
TTL: 应设置为0x00
-
-
SubscribeEventgroupAck
-
TypeID: 0x07
-
TTL: 与SubscribeEventgroup设置一致
-
-
SubscribeEventgroupNack
-
TypeID: 0x07
-
TTL: 应设置为0x00
-
-
-
-
OptionsArray
Option类型主要是Entry的附属信息,主要包括:
-
配置信息,可以用来配置服务的名称等;
-
在Offer服务中定义服务的优先级;
-
声明服务实例(offer引用,Request的目的地址,表明使用它所服务的终端地址)或者订阅端(SubscribeEventgroup引用,Request的源地址)的IP、端口号、传输协议等;
-
声明服务端发送多播协议数据传达的终端的IP、端口号等,只能被SubscribeEventgroupAckEntry引用;
-
声明发送SD信息的IP、端口号、传输协议,接收端使用该地址代替源地址等。
-
Configuration Options:用于配置通信过程的必要的信息
-
Length: Configuration options所占用的字节
-
Type:固定0x01
-
Configuration: [len]key=value[len]key=value[0]
-
-
Endpoint Options(IPV4/IPV6):用于传递IPV4或者IPV6的Endpoint信息(IP地址+Port号)以及使用的传输层协议;
-
IPV4 Endpoint Option
-
Length:固定为0x09
-
Type:固定为0x04
-
L4-Protocal: UDP, 0x11; TCP, 0x06
-
-
IPV6 Endpoint Option
-
Length:固定为0x15
-
Type:固定为0x06
-
L4-Protocal: UDP, 0x11; TCP, 0x06
-
-
IPV4 SD Endpoint Option
-
Length:固定为0x09
-
Type:固定为0x24
-
L4-Protocal: UDP, 0x11; TCP, 0x06
-
-
IPV6 SD Endpoint Option
-
Length:固定为0x15
-
Type:固定为0x26
-
L4-Protocal: UDP, 0x11; TCP, 0x06
-
-
-
-
Multicast Options(IPV4/IPV6):用于广播IPV4或者IPV6的IP地址及Port号,其中传输层协议只能使用UDP协议;
-
IPV4 Multicast Option
-
Length:固定为0x09
-
Type:固定为0x014
-
L4-Protocal: 固定为UDP, 0x11
-
-
IPV6 Multicast Option
-
Length:固定为0x15
-
Type:固定为0x16
-
-
6.3 状态机
6.3.1 总览
-
Down State:在这个阶段,服务是不可用的,即可以理解为服务没准备好。作为服务端的时候,不向外提供服务,作为客户端时,也不具备消费端的能力。
-
Available State:在这个阶段,Service已经上线,已经可以提供/消费服务。
-
Initial Wait Phase:当服务准备完毕后,进入此阶段。
-
Repetition Phase:为了快速找到客户端或者服务端,将在此阶段快速发送Offer或者Find报文。
-
Main Phase:在此阶段意味着服务已经进入了稳定状态,将周期性发送Find或者Offer报文。
-
6.3.2 服务端状态
Down
软件初始化后,状态机的默认状态为服务不可用Down状态。
-
During动作:在此阶段,服务端将不发送offer报文,即客户端将感知该服务的不可用状态。
-
Down迁移至Available条件:Service服务被请求。ECU可以根据自定义需求请求服务上线,无论是根据网络管理状态还是服务的功能需求,在软件实现中,本质上就是调用一个函数接口使服务上线。
Init Wait Phase
当SD 服务端状态机进入Aavailbale状态机后,默认先进入Init Wait状态。
-
Entry动作:进入Init waiy Phase状态机后,将开启一个Init Delay计时器,该定时器的值为时间参数INITIAL_DELAY_Min和INITIAL_DELAY_Max之间的随机值,上述参数在CP或者AP的协议栈中都是可以自定义配置的。
-
During动作:
-
在Init Wait Phase阶段,如果收到Find报文,服务端将不做任何处理,即为初始化Offer报文。
-
Init Delay计时器完成时,发送一帧Offer报文
-
-
Init Wait Phase迁移至Repetition Phase条件:Init Delay计时器超时。
Repetition Phase
-
Entry动作:在进入状态机后,先判断参数REPETITIONS_MAX的值。
-
REPETITIONS_MAX==0,则直接进入Main Phase。
-
REPETITIONS_MAX > 0,则开启值为REPETITIONS_MAX计数器。
-
-
During动作
-
计数器开启后,将以REPETITIONS_BASE_DELAY为基本发送间隔时间发送Offer 报文,每发送一次,时间间隔为上一次的两倍。
-
如果收到某客户端的FindService,不影响当前阶段的发送计数和计时,延迟一定时间(REQUEST_RESPONSE_DELAY)后,单独发送单播OfferService给服务请求端。
-
收到客户端的SubscribeEventgroup报文后,发送ACK/NACK,并启动属于该客户端的TTL计时器。
-
收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器
-
-
Repetition Phase迁移至Main Phase条件:Init Delay计时器超时。
-
REPETITIONS_MAX==0
-
发送完REPETITIONS_MAX次Offer Service报文。
-
Main Phase
-
Entry动作:进入Main hase后,开启时间为CYCLIC_OFFER_DELAY的定时器,以CYCLIC_OFFER_DELAY为周期发送Offer报文。
-
During动作
-
如果收到某客户端的FindService,不影响当前阶段的发送计数和计时,延迟一定时间(REQUEST_RESPONSE_DELAY)后,单独发送单播OfferService给服务请求端。
-
在此阶段,收到客户端的SubscribeEventgroup报文后,发送ACK/NACK,并启动属于该客户端的TTL计时器。
-
收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器
-
6.3.3 客户端状态机

Down
- 软件初始化后,状态机的默认状态为服务不可用Down状态。
- During动作:在此阶段,客户端将不发送Find报文,即客户端不寻找提供该服务的服务端。
- Down迁移至Available条件:应用程序请求Service服务上线
- Down迁移至Main条件:当收到Offer报文后,在TTL时间(TTL指的是存活时间,即在TTL时间内,该Offer报文有效&内,直接迁移至Main Phase。
Init Wait Phase
当SD 客户端状态机进入Aavailbale状态机后,默认先进入Init Wait状态。
-
Entry动作:进入Init waiy Phase状态机后,将开启一个Init Delay计时器,该定时器的值为时间参数INITIAL_DELAY_Min和INITIAL_DELAY_Max之间的随机值,上述参数在CP或者AP的协议栈中都是可以自定义配置的。
-
Init Wait Phase迁移至Repetition Phase条件:Init Delay计时器超时,并发送一帧Find报文。
-
Init Wait Phase迁移至Main Phase条件:在Init Delay计时器未超时期间,收到该服务对应Offer报文。
Repetition Phase
-
Entry动作:在进入状态机后,先判断参数REPETITIONS_MAX的值。
-
REPETITIONS_MAX==0,则直接进入Main Phase。
-
REPETITIONS_MAX > 0,则开启值为REPETITIONS_MAX计数器。
-
-
During动作:计数器开启后,将以REPETITIONS_BASE_DELAY为基本发送间隔时间发送Find报文,每发送一次,时间间隔为上一次的两倍。
-
Repetition Phase迁移至Main Phase条件:Init Delay计时器超时。
-
发送完REPETITIONS_MAX次Find Service报文。
-
在REPETITIONS_MAX计数器未完成期间,如果收到了Offer报文,则直接停止计数器,进入Main Phase,并且发送SubscribeEventgroup订阅报文。
-
Main Phase
-
During动作
-
不再周期发送Find Service
-
收到Offer Service,触发发送SubscribeEventgroup(延迟一定时间)
-
-
Main Phase迁移至Down Phase条件:如果收到StopOffer报文,则跳转至Down状态。
SOME/IP-SD是服务发现和服务信息管理机制,用于汽车电子中的服务寻址和事件订阅。服务端和客户端通过状态机管理其行为,如Down、Init Wait Phase、Repetition Phase和Main Phase。在Main Phase,服务会周期性发送服务信息,客户端则在接收到服务信息后订阅服务。
1388

被折叠的 条评论
为什么被折叠?



