目录
1. 总体说明
2. 服务说明
2.1 Method
2.2 Event
2.3 Field
3. 解析SOME/IP格式
3.1 Message Type说明
3.2 Payload说明
4. SOME/IP 服务发现SD
4.1 主要功能
4.2 SD报文解析
4.2.1 Entry
4.2.2 Options
4.3 SD状态机
5. SOME/IP序列化
5.1 概念
5.2 说明
5.3 举例
1. 总体说明
如上图所示为标准的网络七层架构,SOME/IP ( Scalable service-Oriented MiddlewarE over IP),即“运行于IP之上的可伸缩的面向服务的中间件”。他在系统中其实就是一个中间件的存在,所谓“Middleware中间件”是一种独立的系统软件或服务程序,分布式应用软件可借助Middleware在不同的技术之间共享资源。所谓的分布式应用软件,在这里指的就是“服务”;不同的技术之间,在这里指的就是“不同的平台或操作系统,比如Adaptive AUTOSAR系统等。
2. 服务说明
服务是SOME/IP的最核心概念。在一个服务中,定义了Server和Client两个角色:Server提供服务,Client调用服务。对于同一个服务,只能存在一个Server,但可以同时存在多个Client调用服务。一个Service由0~多个Event/Method/Field组成。与CAN相比,面向服务的通讯方式能够大大降低总线的负载率。
2.1 Method
调用或引用一个进程/函数/子程序,通常由Client发起,并由Server答复。Request是最常见的一种Method,由Client向Server请求数据;Response是Request的结果,由Server答复Client的Request。而Method Fire & Forget方式,只Client向Server发起,但Server对该请求不回复。
2.2 Event
一个单向的数据传输,只能是on change类型,用于Server主动向订阅(Subscribe)了相关服务的Client发布(Publish)信息。
2.3 Field
由以下三项内容构成:
-
Notifier:通知,Server的Client订阅了服务后第一时间主动向其发送数据。
-
Getter:获取,由Client向Server请求数据。
-
Setter:设置,由Client修改Server的数据。
3. 解析SOME/IP格式
3.1 Message Type说明
值 | 报文类型 | 说明 |
0x00 | REQUEST | 请求,需要回复 |
0x01 | REQUEST_NO_RETURN | 请求,不需要回复 |
0x02 | NOTIFICATION | Notifier/Event,不需要回复 |
0x80 | RESPONSE | 回复 |
0X81 | ERROR | 带有错误信息的回复 |
3.2 Payload说明
通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小、校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上“外套”就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload。
4. SOME/IP 服务发现SD
由于服务需要由Server和Client共同完成,因此在进行正常的数据传输之前,需要一系列的准备工作确认Server和Client之间是否已有网络连接。之后,Client还要询问Server能否提供所需的服务,并对服务的Event进行订阅。这些工作都是通过SOME/IP服务发现(Service Discovery)实现的。
SOME/IP服务发现用于定位服务实例、检查服务是否可用以及部署发布和订阅句柄。服务发现只能通过UDP实现。
服务发现的报文格式与一般的SOME/IP报文相同,但是其Message ID固定为0xFFFF8100。
4.1 主要功能
- 定位服务实例
- 检测服务实例是否在运行(即服务实例的状态)
- 发布/订阅行为的管理
4.2 SD报文解析
SOME/IP SD报文也是一种SOME/IP报文,是在SOME/IP报文的基础上进行了扩展,增加了Entry、Option等字段;Entries用于同步服务实例的状态和发布/订阅的管理,Options用于传输Entries的附加信息。
SOME/IP SD报文的ServiceID(0xFFFF)、MethodID(0x8100)、Request ID(0x0000)、ProtocolVersion(0x01)、Interface Version(0x01)、MessageType(0x02)、ReturnCode(0x00)等属性都是固定值。
4.2.1 Entry
Entry字段可以理解为服务实例的“入口”,该入口包含服务实例以及需要订阅的事件组的信息。主要通过Entry实现提供服务、发现服务,以及订阅事件组的功能。
供服务用Entries
供EventGroup用Entries
报文中Type内容解释如下:
类别 | Type值 | Type名称 |
Service | 0x00 | FindService 用于Client查找服务 |
0x01 | Offer/StopOfferService 用于Server向Client提供服务或停止提供服务 | |
Eventgroup | 0x06 | Subscribe/StopSubscribe Client向Server订阅服务或停止订阅 |
0x07 | SubscribeAck/Nack Server对于订阅的应答,如果订阅成功,Client收到的就是SubscribeAck,否则收到SubscribeNack |
对于Offer/ StopOfferService、Subscribe/ StopSubscribe和SubscribeAck/ Nack,每一组Entries都共用了相同的Type值,但通过TTL字段可以识别究竟是提供服务还是停止提供服务,是订阅事件还是取消订阅,是订阅成功应答还是订阅失败应答:当TTL = 0时,表示报文对应的服务实例不再有效,此时对应的Type类型分别就是停止提供服务、停止订阅事件以及订阅失败应答。
4.2.2 Options
每一个Option都是有一个2字节的Length字段、1字节的Type字段和1字节的保留位开始的。Length字段指示的长度是从保留位开始的。Options的类型如下表所示:
类别 | Type值 | Type名称 |
Configuration 用于配置服务 | 0x01 | Configuration |
Load Balancing 用于配置服务实例的优先级 | 0x05 | Load Balancing |
Endpoint 发送服务相关的地址和端口 | 0x04 | IPv4 Endpoint |
0x06 | IPv6 Endpoint | |
0x24 | IPv4 SD Endpoint | |
0x26 | IPv6 SD Endpoint | |
Multicast 声明Multicast地址 | 0x14 | IPv4 Multicast |
0x16 | IPv6 Multicast |
4.3 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。 |
5. SOME/IP序列化
5.1 概念
序列化(Serialization)指的是将数据结构或对象依据事先定义的规则转换成二进制串的过程;反序列化(Deserialization)指的是将二进制串依据相同规则重新构建成数据结构或对象的过程。
5.2 说明
在AUTOSAR中是指数据在PDU中的表达形式,可以理解为来自应用层的真实数据转换成固定格式的字节序,以实现数据在网络上的传输。软件组件将数据从应用层传递到RTE层,在RTE层调用SOME/IP Transformer,执行可配置的数据序列化(Serialize)或反序列化(Deserialize)。SOME/IP Serializer将结构体形式的数据序列化为线性结构的数据;SOME/IP Deserializer将线性结构数据再反序列化为结构体形式数据。在服务端,数据经过SOME/IP Serializer序列化后,被传输到服务层的COM模块;在客户端,数据从COM模块传递到SOME/IP Deserializer反序列化后再进入RTE层。如下图参考Autosar Com过程
5.3 举例
一个unit32类型数据(0x12345678)的序列化。
Byte0 | Byte1 | Byte2 | Byte3 | |
大端(Big Endian) | 12 | 34 | 56 | 78 |
小端(Little Endian) | 78 | 56 | 34 | 21 |