Loading...
墨滴

jasonj333

2021/08/09  阅读:45  主题:红绯

详解SOME/IP协议文档

以下内容来源于AutoSar官网的AUTOSAR_PRS_SOMEIPProtocol文档

SOME/IP

什么是SOME/IP

SOME/IP,全称Scalable service-Oriented MiddlewarE over IP,基于IP的可扩展的面向服务的中间件

  • 基于IP的

基于TCP/IP通信协议

  • 可扩展的

不拘泥于某一个系统,可以用在多个系统上运行

  • 面向服务的

是直接为应用软件所使用的

  • 中间件

程序

所以SOME/IP是一套用TCP/IP协议帮助不同平台上的分布式应用软件互相传递信息的机制

说白了,就是把服务接口里的内容通过SOME/IP这一套规则打包,交给TCP/IP传输

服务可以是多个事件、方法和字段的组合

三种通信机制

事件Event

单向数据传输,仅在更改或循环时调用,从数据的提供者发送到订阅者

事件提供了从提供者到订阅者的循环发送变化的数据

由此可见,事件是订阅者对提供者提出订阅后,提供者把订阅的数据通过循环发送或变化时发送这两种方式,发送给订阅者

方法Method

被调用的方法、函数或子例程

方法为订阅者提供了在提供者端执行远程过程调用的可能性

订阅者如果想让提供者执行某个函数方法,就可以SOME/IP中的方法实现

字段Field

一个字段代表一个状态,getter、setter和notifier可以对其进行操作

  • getter

订阅者可以调用getter来获取提供者的值/状态

  • setter

订阅者可以调用setter来更改提供者端的值/状态

  • notifier

订阅者可以调用notifier让提供者把变化的数据发送给订阅者

Event和Field notifier的区别,notifier在订阅后会发送一个当前值

SOME/IP首部格式

SOME/IP是建立在TCP/IP协议上的应用层协议机制,对接上面的应用软件的服务接口,它有自己的协议首部

Message ID

4个字节,用来识别应用程序的方法或事件

所以Message ID由Service ID(16 bit)和Method ID(15 bit)组成,前者表示应用,后者表示方法或事件

  • 当Method ID表示方法时,bit16为0
  • 当Method ID表示事件时,bit16为1

Eventgroup,服务内部字段的事件和通知事件的逻辑分组,以允许订阅

举例来说,当你想用SOME/IP来远程控制汽车娱乐音响系统里的音乐播放器播放下一首歌时,音乐播放器就是用Service ID表示,而切换到下一曲的动作就是Method ID

由此看出

Message ID对于整个系统来说是唯一的

Length

4个字节,它是从Request ID到Payload的字节长度

注意,不包括Message ID和Length本身

Request ID

4个字节,用来区分订阅者和提供者之间的同一个方法、事件、getter或setter的多个并行使用

什么意思

当你前后两次远程控制音乐播放器切换到下一曲时,两次的Request ID是不同的,需要加以区分

准确来说,其实是Request ID里的Session ID来区分

Request ID由Client ID(2个字节)和Session ID(2个字节)组成

  • Client ID

2个字节,Client ID是订阅者的的唯一标识,提供者用Client ID区分调用同一方法的多个订阅者

比如汽车方向盘控件可以控制娱乐音响系统的音乐播放器切换到下一曲,后排的控制面板也可以控制它,那么就可以用不同的Client ID区分它们

所以,每个Client ID在整个车辆中应该是唯一的

  • Session ID

2个字节,用来区分同一发送者的连续请求或消息

既然Client ID是车辆中唯一的,而每次请求的Session ID又不能相同,所以Request ID对于提供者来说是唯一的

提供者在生产响应消息时,应该把Request ID复制到响应消息中,这样订阅者收到后可以根据Request ID判断这是哪条请求的响应

在响应到达之前,订阅者不得重用Request ID

由于提供者只需要在响应中复制Request ID,所以它并不需要提前知道Client ID

对于Session ID,还有一些注意点

如果会话处理未激活,Session ID应该设置为0x0000

这里我的理解是,比如按方向盘上的切换到下一曲的按键,如果对于方向盘来说,这个动作如果由于故障等原因未生效,那么这个Session ID就设置为0x00

如果会话处理处于激活状态,Session ID应设置为0x0001-0xFFFF范围内的值

如果会话处理处于激活状态,Session ID应根据各自的用例递增

这里我的理解是,比如按方向盘上的切曲按键,每按一次,Session ID就加1

当Session ID达到最大值0xFFFF时,它应该从0x0001重新开始

从这里能看出,如果Session ID为0x0000时,提供者并不会对这个请求作出反应

如果响应的Session ID与请求的Session ID不匹配,订阅者必须忽略这个响应

Protocol Version

1个字节,用来表示SOME/IP首部的格式

对于SOME/IP协议首部中的改动,Protocol Version应该增加,但是对于payload中格式的改变,Protocol Version不应该增加

Interface Version

1个字节,用来表示服务接口版本

Message Type

1个字节,用于区分不同类型的消息

当没有错误发生时,常规请求(Message Type = 0x00)应由响应(Message Type = 0x80)回复,如果发生错误,则应回复错误消息(Message Type = 0x81)

也可以发送没有响应消息的请求(Message Type = 0x01)

对于TP消息来说,Message Type的第三个高位要设置为1,以表示这个SOME/IP是一个segment,所以0x00对应0x20

这里我不理解segment是什么意思

Return Code

1个字节,用来表示请求是否已成功处理

SOME/IP的首部布局是请求和响应通用的,这表示请求消息也有Return Code,只是它的值是0x00

下图是响应消息的Return Code

响应的Return Code
响应的Return Code

以上是SOME/IP的部分内容,看完别忘了点个赞


jasonj333

2021/08/09  阅读:45  主题:红绯

作者介绍

jasonj333