AUTOSAR中的服务发现模块(SOME/IP SD)的规范与实例分析
汽车
2024-11-13 08:29
上海
作者 | 不可说
出品 | 汽车电子与软件
服务发现模块(Service Discovery Module)的主要任务是在车内通信中管理服务(functional entities)的可用性,这些服务被称为功能实体,并控制事件消息的发送行为。这一机制确保仅将事件消息发送给需要它们的接收方(即采用发布/订阅模式)。此处描述的解决方案就被称为SOME/IP-SD(基于IP的可扩展面向服务中间件 - 服务发现,Scalable service-Oriented MiddlewarE over IP - Service Discovery)。通过服务发现功能,不同的电子控制单元(ECU)可以提供服务实例,并在车辆网络中查找可用的服务实例。一个ECU可以停止提供之前提供的服务实例,之后对该服务实例的查找将得不到响应。服务实例是由其服务接口定义的服务的单个实现。除了管理服务实例的状态外,服务发现还能控制发送一种特殊消息,即事件消息。这些事件消息被分组到事件组中,服务发现可以以发布/订阅的方式开启或关闭这些事件组,从而开启或关闭该事件组中事件的发送和接收。ECU的服务发现模块在处理服务器服务和客户端服务时扮演着不同的角色,并需要执行相应的操作来确保服务的正确提供和查找。 服务端服务(Server Services):本地ECU向车辆的其他部分提供服务器服务实例(即位于本地的服务实例),并可以被视为该服务实例的服务端。客户端服务(Client Services):本地ECU可能会使用车辆内另一个ECU提供的服务器服务实例,并可以被视为该服务实例的客户端。对于服务端服务,本地ECU的SOME/IP SD模块(担任服务器角色)需要执行以下操作:- 当服务可用时(即提供服务的软件组件(SWC)准备就绪,且服务在当前ECU状态下可用)提供本地服务。
- 当服务不再可用时,撤回本地服务的提供(停止提供)。
对于客户端服务,本地ECU的服务发现模块(担任客户端角色)需要执行以下操作:- 根据配置监听提供的服务和查找请求,并将这些信息存储在易失性存储器中。
- 监听停止提供的服务信息,并根据配置将这些信息存储在易失性存储器中。
- 根据当前ECU及其软件组件(SWC)的状态发送查找请求。
服务发现同样可用于管理发布/订阅(Publish/Subscribe)关系。在基于服务发现的发布/订阅应用场景中,一个ECU(作为具有已消费事件组的发布/订阅客户端)对从另一个ECU(作为具有事件处理器的发布/订阅服务器)接收某些数据(即订阅)感兴趣。虽然订阅关系在服务发现(SD)消息中明确定义,但发布关系则基于服务实例本身的可用性(即提供服务条目)。基于所提供的服务实例,发布/订阅客户端可通过订阅事件组条目进行订阅。此时,发布/订阅服务器将利用此订阅关系,将发布/订阅客户端注册为对订阅中指定的某些信息感兴趣的方,并在发生某些事件或超时后,开始将这些信息发送给发布/订阅客户端。 为进行优化,服务发现支持使用多播消息而非每个客户端的单播消息,将事件消息发送给多个客户端。但请注意,服务器端和客户端预先配置的多播之间存在差异:- 如果SdServerService(服务端服务)为每个事件处理器预先配置了多播地址和端口(即所谓“事件处理器多播端点”),则当订阅了具有不同端点信息的SdClientServices(客户端服务)达到阈值(SdEventHandler MulticastThreshold,事件处理器多播阈值)时,SdServerService将切换至此多播地址和端口。
- 如果SdClientService(客户端服务)使用多播地址和端口(即所谓“已消费事件组多播端点”)进行了订阅,则SdServerService在订阅已消费事件组多播端点(多播地址和端口)时,会向其发送事件。
服务发布流程
服务准备完成后, 进入该阶段, 延迟一定时间后发送服务发布报文重复发送服务发布报文, 重复次数由配置参数决定, 此阶段收到服务发现请求后,通过服务发布报文进行应答周期性发送服务发布报文, 周期时间由配置参数决定, 此阶段收到服务发现请求后,通过服务发布报文进行应答 服务发现流程
重复发送服务发现报文, 重复次数由配置文件参数REPETITION_MAX决定, 收到服务发布报文后, 停止发送服务发现报文不再重复发送服务发现报文, 每次收到服务发布报文后, 触发服务订阅请求报文。服务订阅流程
SOME/IP SD中的Message ID是固定的字段:0xFFFF8100;Length占用32bits位,其数值表示从Request ID到报文最尾端的字节数;Request ID 由Client ID 和Session ID 组成。虽然Client ID 不用于服务发现,但Session ID 用于检测车辆中其他服务发现实例的重启或重启,以修复服务发现模块的本地状态。在初始化 Service Discovery Module 后, ECU 发送的消息的 Session ID应为0x0001。Protocol Version 字段是用来描述当前SOME/IP协议版本,目前是0x01;Interface Version 字段是用来描述当前SOME/IP服务的版本;Message Type 字段用来区分 SOME/IP 消息的类型, SOME/IP-SD 仅仅使用事件消息,因此固定为0x2;Return Code用于表示请求是否已成功处理。这不适用于SOME/IP-SD;因此返回码被静态设置为0x00。 SOME/IP SD从Message ID到Return Code字段的格式与SOME/IP 协议格式是一致的;后面的字段才是SOME/IP SD独有的。Flag
使用Flags字段启动SOME/IP-SD标头。它用于发送全局服务发现信息,其中包括当前上次重新启动的状态以及接收单播消息的能力。如果服务4端或客户端通过评估通信方发送的SOME/IP-SD消息的会话ID(Session ID)和重启标志(Reboot Flag)检测到重启,则受影响的通信本地状态将失效,并应执行以下操作:1)如果客户端检测到服务端重启,并且该客户端正在使用该服务端的服务,则客户端应将此次重启视为接收到“停止提供服务”(StopOffer)消息。2)如果为该服务配置了SdClientServiceTcpRef,则活动客户端应通过调用SoAd_CloseSoCon()函数并设置参数“abort”为TRUE来关闭相应的TCP连接。如果服务器检测到客户端重启,并且该客户端正在使用该服务端的服务,则服务端应将此次重启视为接收到“停止订阅事件组”(StopSubscribeEventgroup)消息。Reserved
Length of Entries Array
该字段值表示下面Entries Array字段的大小,单位为byte。 Entries Array
该字段大小是浮动的,并且有两种类型,一种是服务Entries,一种是事件组Entries;- Type为0x00时,表示FindService;为0x01时,表示OfferService和StopOfferService
- Index 1st options 标明属于这个Entry的第一个option的起始索引序号,从0开始计算;Index 2st options 标明属于这个Entry的第二个option的起始索引序号,从0开始计算;#of opt 1表明该entry有几个第一组option;#of opt 2表明有几个第二组option。
- 该类型Service ID字段应携带服务的Service ID,根据是服务端还是客户端,使用参数SdServerServiceID或SdClientServiceID进行静态配置。
- Instance ID字段应携带服务的Instance ID,根据是服务端还是客户端,使用参数SdServerSer-viceInstanceID和SdClientServiceInstanceID静态配置。
- Major Version字段应包含SdServerServiceMajorVersion或者SdClientServiceMajorVersion,这取决于该条消息是服务端发送的还是客户端发送的。
- TTL字段定义了使用参数SdServerTimer TTL和SdClientTimer TTL配置的服务器条目的生存期(秒),但TTL为0的Stop Entries除外。
- Minor字段应携带SdServerServiceMinorVersion或者SdClientServiceMinorVersion,这些都是在服务设计阶段就已经规范好的。
Service ID、Instance ID、Major Version、TTL与Services Entries中定义是一致的;Type为0x06时,表示SubscribeEventgroup和StopSubscribeEventgroup;为0x07时,SubscribeEventgroupAck和SubscribeEventgroupNack;Counter用于区分同一订阅者的相同订阅事件组。如果不使用,设置为0x0;Eventgroup ID字段应包含使用参数SdConsumerEvent GroupID配置的事件组的ID,也是在通信设计阶段定义好的事件组ID。Length of Options Array
该字段值表示下面Options Array字段的大小,单位为byte。Options Array
Configuration Options Array可以配置服务发现消息中条目的其他属性。可以使用配置选项传输0到n个配置项。这些配置项可以包括例如主机或服务的名称;如: 该Option传输单播IP地址、第四层协议(如UDP或TCP)和端口号;从而获取与服务通信所需的信息。当接收到提供服务并传输IPv4选项的服务发现消息时,接收此消息的ECU可以通过更新Socket连接,动态配置套接字适配器以使用此服务。IPv4多播选项由SdServerService或者SdClientService用于通告其配置的事件多播端点;- 如果用作服务端的多播端点,则SdServerService会声明IPv4多播地址、传输层协议(ISO/OSI第4层)和端口号,多播事件和多播通知事件将发送到这些端口。
- 如果它用作客户端事件组多播端点,则SdClientSer指示IPv4多播地址、传输层协议(ISO/OSI第4层)和端口号,SdClient期望在其中接收事件。作为传输层协议,只支持UDP。
IPv4 SD端点选项传输发送方SD实现的端点(即IP地址和端口)。这用于在无法使用IP地址和/或端口号的情况下标识SOME/IP-SD实例。Option也支持 IPv6 Endpoint Option、IPv6 Multicast Option、IPv6 SD Endpoint Option,但是在车载通信中,IPv4就足够了,并且通常会禁用IPv6,因此此处不介绍IPv6相关的Option。第一个(offer)
Length of Entries Array为0x10,表示Entry有16 bytes大小。只有一个Entry,type为0x01,也就是归属于Services Entries,TTL不为0,表示offer service,即表示服务发布,#opt1值为1,表示有一个option;该服务的服务id为0x12、实例id为0x1,设置的ttl为3,服务主版本为1、次要版本为0。 Length of Options Array为0xc,表示Option共计12 bytes大小。该option信息是上面的Entry的信息补充。Length为0x9,Type为0x4,表示这个是IPv4 Endpoint Option;IP地址解析为192.168.60.4,对应原始数据为c0 08 3c 04,也表明了L4层使用的是TCP(0x0006)。第二个(Subscribe)
Length of Entries Array为0x10,表示Entry有16 bytes大小。只有一个Entry,type为0x06,也就是归属于Eventgroups Entries,TTL不为0,表示Subscribe Eventgroup,即表示服务事件组的订阅,#opt1值为1,表示有一个option;该服务的服务id为0xd、实例id为0x1,设置的ttl为16777215,即0xffffff,表示订阅一直有效,不过一般应该避免这样设置。服务主版本为1、订阅的服务实例ID为1。Length of Options Array为0xc,表示Option共计12 bytes大小。该option信息是上面的Entry的信息补充。Length为0x9,Type为0x4,表示这个是IPv4 Endpoint Option;IP地址解析为192.168.60.1,对应原始数据为c0 08 3c 01,也表明了L4层使用的是TCP(0x0006)。