关于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 主要功能
- 定位服务实例
- 检测服务实例是否在运行(即服务实例的状态)
- 发布/订阅行为的管理
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 |
关于SOME/IP的理解相关推荐
- 以太网数据帧的报尾封装字段是什么_利用TCP/IP模型理解数据通信过程
回顾TCP/IP模型 TCP/IP模型是当今IP网络的基础(由OSI七层参考模型发展而来,也称为DoD模型). 分层参考模型的设计是非常经典的理念: 层次化的模型设计将网络的通信过程划分为更小.更简单 ...
- P620 网络编程概述、IP的理解与InetAddress类的实例化
IP的理解与InetAddress类的实例化 /* 一.网络编程中有两个主要的问题: 1.如何准确地定位网络上一台或多台主机:定位主机上的特定的应用 2.找到主机后如何可靠高效地进行数据传输二.网络编 ...
- socket,TCP/IP的理解(转)
TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间 ...
- IP难理解?“美国三片”让你秒懂什么是IP
近些年,IP被炒得火热,因此对于大多数人来说,谈到IP(知识产权),多少都会有一些认识.无论是买一本正版书.用一个正版软件-出于对作者和出版社知识产权的尊重:还是用"发表的文章禁止随意转载& ...
- HTTP—TCP/IP—SOCKET理解及浅析
一个完整的HTTP请求的过程 此举例为抛砖引玉,引导大家进入思考状态. 当你按输入www.baidu.com ,浏览器接收到这个消息之后,浏览器根据自己的算法识别出你要访问的URL,为您展示出来搜索页 ...
- scan ip的理解
这些天做11g的RAC实验,才发现oracle 11g的scan ip这个概念,当时在安装的时候,直接在host文件中加入了一条scan对应的解析,之后安装成功.之后才在网上搜了很多资料,自认为对sc ...
- 关于Linux的hostname,hosts,IP的理解
最近在安装Ambari,用虚拟机安装的时候,遇到了这个一直以来就不是很清楚的难题-终于下决心梳理了一番. 1,本机IP:无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机 ...
- TCP/IP 协议理解
TCP/IP 协议(Transmission Control Protocol / internet Protocol),因特网互联协议,又名网络通讯协议.通俗而言:TCP负责发现传输的问题,一有问题 ...
- RAC8——scan ip的理解
SCAN概念 先介绍一下什么叫SCAN,SCAN(Single Client Access Name)是Oracle从11g R2开始推出的,客户端可以通过SCAN特性负载均衡地连接到RAC数据库.S ...
- 面试100题:TCP/IP的理解
三次握手: TCP/IP协议是一个传输层面向连接的安全可靠的传输协议,三次握手是为了建立一个安全可靠的连接.第一次握手是从客户端发起向服务端发送一个报文,报文将SYN位标志位置为1.当服务端收到了就知 ...
最新文章
- 如何从一个表中选择另一个表中不存在的所有记录?
- mysql 查询绑定变量_MySQL高级特性——绑定变量
- C/S与B/S架构的区别和优缺点
- python实现跨excel的工作表sheet之间的复制
- SRS(simple-rtmp-server)流媒体服务器源码分析--启动
- Ajax学习系列——向服务器发送请求
- 阿里云云数据库RDS秒级监控功能解锁,通宵加班找故障将成为过去式
- 一图弄清滴答定时器寄存器 SysTick Registers
- python的神经网络模块接法图解_图神经网络库PyTorch geometric
- 解决非javascript浏览器的问题
- 我的Android进阶之旅------Android检测wifi连接状态
- 从0开始html前端页面开发_调用com组件(ActiveX)
- dataframe数据按行做线性拟合
- 概率论的学习和整理--番外4:学习期望之前,先学习平均数(包括算术平均数,几何平均数,调和平均数等),众数,中位数等概念差别。
- 微信开发者平台切换企微账号与企业微信小程序模式
- IDEA模块名后面中括号中内容与模块名不一致的问题
- 给新浪博客修改博客名字 超级简单图文教程
- Android仿QQ通讯录分组展示ExpandableListView
- ARX 中设置CAD 字体
- 导航上显示某个地点已关闭什么意思_导航只认手机高德和百度?已经有车载导航帅到我了...