关于SOME/IP的理解

目录

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 主要功能

  1. 定位服务实例
  2. 检测服务实例是否在运行(即服务实例的状态)
  3. 发布/订阅行为的管理

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状态机 

不管是客户端还是服务端,都有同样的状态机,但是他们的状态机具有不同的行为。 

状态服务端行为客户端行为
DownService不可用

服务未被应用请求,则停留在该状态;

收到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)的序列化。

 Byte0Byte1Byte2Byte3

大端(Big Endian)

12345678

小端(Little Endian)  

78563421

 

  • 113
    点赞
  • 841
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值