汽车电子Autosar之以太网SOME/IP(续)

前言

首先,请问大家几个小小问题,你清楚:

  • 你知道什么是SOME/IP SD吗?
  • SOME/IP-SD有何作用呢?
  • SOME/IP-SD 包含哪些内容呢?
  • SOME/IP-TP 为什么会存在?

今天,我们就来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:
在这里插入图片描述

在这里插入图片描述


正文

总体介绍

正如之前文章《一文入门车载以太网,吐血推荐,不看可惜!》中所介绍的那样,车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中今天所要介绍的内容SOME/IP就是一种应用层协议

SOME/IP协议内容按照AUTOSAR中的描述,我们可以更进一步的拆分为三类子协议:应用层的SOME/IP标准协议,SOME/IP-SD协议以及TP层的SOME/IP-TP协议,这三部分内容相辅相成,完整详细的阐述了SOME/IP协议的全部内容,是研究SOME/IP协议的必经之路。

通过上篇《一文搞懂车载以太网之SOME/IP(上)》我们全面讲解了SOME/IP标准协议的全部内容,想必大家已经对SOME/IP有了一个较为基础的了解,接下来本文将着重讲解剩余的两部分协议内容:SOME/IP-SD协议以及TP层的SOME/IP-TP协议

有关SOME/IP序列化内容限于篇幅有限,请听下回分解,敬请关注!

SOME/IP-SD 主体功能

SD(Service Discovery) 顾名思义为服务发现,具备发现服务的基本功能,这是从节点作为Client来考虑的,需要找到网络上对应的服务;对应地,网络中必然存在至少提供该服务的节点,该节点可被称Server,因此这样的供需场景就是SD协议工作的场景。

在这种供需场景中我们看到了提供服务,订阅服务的过程,该过程如果用专业术语来讲可称为Subcribe/Publish模型,该模型涉及到Client与Server两方,交互过程如之前文章所描述如下图1所示:

在这里插入图片描述

图1 SOME/IP-SD 交互过程

由上图可知,Subribe/Publish的过程主要经历以下四个阶段:

  • 对于需要服务的Client而言,通过FindService方式来发现当前网络中存在的服务;

  • 如果Server存在服务就会通过Offer Service方式来广播通知自身存在的服务;

  • Client根据已发现的服务中通过Subcribe EventGroup的方式来订阅相关事件,同时在Server段发现Client的订阅满足条件则会回复正确的肯定响应;

  • 当Client订阅成功后,Server端便会按照服务的基本属性来事件型或者周期性提供Client端相关的服务;

总而言之,SOME/IP-SD就是用于定位服务,检查服务可用性以及部署与发布服务句柄的一种应用层协议,该协议只能运行在UDP之上,服务发现报文格式与SOME/IP标准协议一致,且Message ID固定为0xFFFF8100,其中Service ID是0xFFFF,Method ID为0x8100

SOME/IP-SD协议解析

SOME/IP-SD协议头

首先,依照惯例我们先来看下SOME/IP-SD的报文格式如下图2所示:

在这里插入图片描述

图2 SOME/IP-SD Message Format

一般而言,如果没有特别要求,在SD报文格式中的内容均按照大端方式传输

由于SOME/IP-SD报文实际上也只是SOME/IP报文的一种,只不过是在SOME/IP标准协议的基础上扩展了Entry,Option等字段,其中Entry用于同步服务实例的状态以及发布/订阅关系的管理,Options则用于传输Entry的附加信息。

接下来,我们将针对上述的协议中各种字段为大家一一解释如下表1:

在这里插入图片描述

表1 SOME/IP-SD 协议内字段解释

Entry Array

如上表1中所述,Entry Array按照SD的定义可分为以下两种:

  • **Service Type:**用于FindService,OfferService,StopOfferService这几种场景;
  • EventGroup Type: 用于 SubscribeEventgroup, StopSubscribeEventgroup,SubscribeEventgroupAck,SubscribeEventgroupNack这几类场景。

如下图3所示,首先我们介绍下为Service Entry Array中定义的各个字段内容:

在这里插入图片描述

图3 Service Entry Array定义

对上述Service Entry Array定义的各个Field解释说明如下表2所示:

在这里插入图片描述

表2 Service Entry Array字段解释说明

介绍完Service Entry Array,相比之下EventGroup Entry Array又存在哪些差异呢?

如下图4为EventGroup Entry Array的各个字段内容的定义:

在这里插入图片描述

图4 EventGroup Entry Array定义

相比Service Entry Array,EventGroup Entry少了Minor Version,但是多出了Counter以及EventGroup ID内容,接下来我们将对上述EventGroup Entry Array定义的各个Field解释说明如下表3所示:

在这里插入图片描述

表3 EventGroup Entry Array字段解释说明

Option Array

Option Array作为SOME/IP-SD报文最后的部分,其主要作用就是为了提供在通信的过程中提供下附加信息,如配置信息,IP地址,端口号等。不过其作为SD报文的一部分也存在着自身的字段内容。

AUTOSAR将Option Array主要分为以下三种:

  • Configuration Options:用于配置通信过程的必要的信息
  • **Endpoint Options(IPV4/IPV6)😗*用于传递IPV4或者IPV6的Endpoint信息(IP地址+Port号)以及使用的传输层协议;
  • Multicast Options(IPV4/IPV6):用于广播IPV4或者IPV6的IP地址及Port号,其中传输层协议只能使用UDP协议;

Configuration Options

接下来我们来对这三种Option进行一一解读。首先来看看Configuration Option的字段定义:

在这里插入图片描述

图5 Configuration Option 字段定义

注意:configuration options仅适用于任意Service ID的Service Entry Array以及Service ID为0xFFFE的EventGroup Entry Array。

针对上述字段解释如下表4所示:

在这里插入图片描述

表4 Configuration Option Array 字段解释说明

对于那些非标准的SOME/IP 服务,由于不能够被Service ID进行标识,此时就需要通过一个key “otherserv”的值来进行标识,这类服务则可通过使用0xFFFE作为Service ID同时附带otherserv的value的configuration option来完成双方的通信。

IPV4 Endpoint Option

如下图6为IPV4 Endpoint Option的字段定义:

在这里插入图片描述

图6 IPV4 Endpoint Option字段定义

IPV6 Endpoint Option

如下图7为IPV6 Endpoint Option的字段定义:

在这里插入图片描述

图7 IPV6 Endpoint Option字段定义

IPv4 Multicast Option

如下图8为IPv4的Multicast Option各字段内容定义:

在这里插入图片描述

图8 IPv4 Multicast Option



IPv6 Multicast Option

如下图8为IPv6的Multicast Option各字段内容定义:

在这里插入图片描述

图9 IPv6 Multicast Option定义

IPv4 SD Endpoint Option

如下图10为IPv4 SD Endpoint Option的字段定义:

在这里插入图片描述

图10 IPv4 SD Endpoint Option定义

IPv6 SD Endpoint Option

如下图11为IPv6 SD Endpoint Option的字段定义:

在这里插入图片描述

图11 IPv6 SD Endpoint Option定义

由于上述六种IPV4与IPV6字段内容大体结构一致,因此我们将该两者放在一起来对各字段内容进行解释说明:

在这里插入图片描述

表5 IPv4/IPv6 六类Option字段解释说明

SD 状态机

SD状态机状态机这部分由于涉及的内容细节较多且较为独立,同时限于篇幅有限,后期会专门针对SD状态机,SD报文接收发送等环节给大家单独分享,敬请期待SOME/IP-SD状态机专题篇!

SOME/IP-TP主体功能

我们知道CAN-TP是用来对当总线CAN数据过大时,就需要对CAN整包数据进行分割拆包进行发送,这个时候发送方的TP层就起作用,同理对于接收方而言,也需要将分割的数据包进行组包完成整包数据的重组还原。

因此,举一反三,我们便可以知道SOME/IP-TP模块的主体功能就是为了实现对应用层发送数据过大时进行的必要拆包与组包的工作,进而完成大量数据包的发送与接收。

SOME/IP作为一种应用层协议,即可以运行在TCP之上,也可以运行在UDP之上,由于TCP协议本身支持发送大量数据同时还支持流控等特点因此无需用到SOME/IP-TP,该协议仅针对运行在UDP协议基础上的SOME/IP协议。

该模块作为AUTOSAR中定义的标准模块,在AUTOSAR中与各个模块的交互关系又是如何的呢?

如下图12所示,则较为清晰的表明了SOME/IP-TP在CP AUTOSAR的具体位置以及与其他模块的交互关系:

在这里插入图片描述

图12 SOME/IP-TP在AUTOSAR的位置及交互关系

从图中可以直接看出SOME/IP-TP直接与PDUR层进行交互,当上层应用模块发送大量数据时,会通过PDUR发送数据给到SOME/IP-TP模块进行拆包,拆分的包按将照协议格式再通PPDUR模块依次发送。

对于接收方而言,则是接收来自PDUR的报文,通过SOME/IP-TP模块进行组包,组包后的结果给到PDUR,然后由PDUR再传输至上层应用模块。

SOME/IP-TP协议解析

了解了SOME/IP-TP的主体功能以及大概的工作过程,接下来我们一起解析下SOME/IP-TP协议。

SOME/IP-TP作为SOME/IP报文的一种,因此前面的SOME/IP Header则保持一致,只是SOME/IP-TP存在自身的协议头,让我们一起来学习一下。

SOME/IP-TP协议头

如下图13为SOME/IP-TP层的协议头字段内容:

在这里插入图片描述

图13 SOME/IP-TP 协议头字段内容

针对上图中每个字段内容地详细解释请参考上篇链接《一文搞懂车载以太网SOME/IP(上)》

其中Message Type更为细节地定义如下图14所示:

在这里插入图片描述

图14 Message Type 字段内容

  • 当且仅当TP-Flag==1时,OffsetField,Reserved Field以及More Segement Flag才会存在;
  • 当TP-Flag == 1时,表示当前SOME/IP报文为被分割的报文,即Segement报文;

其中Offset Field 表示当前已发送或者接收的数据量,其基本单位为16Byte,如该值等于92,表示截至目前为止已发送了92X16=1472字节长度的Payload。同时该长度并不包含SOME/IP header的长度。

其中Reserved Field为未来预留,目前默认为0即可;

其中More Segments Flag用来表示是否还有Segement报文,当其值为1时表示还有剩余的Segement,当其值为0时则表示没有剩余的Segement,当前Segement就是最后一条。

Tx Path

对于发送一个基于UDP完整的SOME/IP报文而言,报文的发送需要经历以下几个模块:

  • 应用层调用Rte_Send函数来实现数据SOME/IP序列化;
  • 通过LdCom模块间接调用SomeIpTp_Transmit来开启发送;
  • 通过循环调用SOME/IP-TP的主函数来遍历发送每一个Segement;
  • 同时发送出去的报文也会回复Txconfirmation中断最终传递至RteLdCom模块;

具体发送流程中的函数调用关系如下图15所示:

在这里插入图片描述

图15 Tx Path函数调用关系图

Rx Path

针对被分割的segment,接收方需要通过下列几个步骤进行接收:

  • 通过SoAd模块来获取来自总线的SOME/IP数据;
  • PDUR模块接收到来自SoAd模块的数据后会触发SomeIpTp_Rxindicaion表明存在segement数据,准备开启接收;
  • SOME/IP-TP模块通过调用PDUR_SomeIpTpStartOfReception开启接收第一个Segement;
  • 剩余的Segment则可以通过不断触发PDUR_SomeIpTpCopyRxData来接收,最终传送至RTE层;
  • 当最后一个segment被接收到后,则通过调用函数PduR_SomeIpRxIndication来完成最终的接收并使得RTE反序列化给到应用层读取;

具体接收流程的函数调用关系如下图16所示:

在这里插入图片描述

图16 Rx Path函数调用关系图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/30844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32开发——非标协议(DH11+LCD1602)

1.STM32分文件实现代码 编译的总文件夹dh11andlcd,C文件不能跨文件夹查找,新增的分文件,需要都放调用的文件夹下 C文件和H文件理解:H文件是门脸,放在前面给别人的,别人一看就知道有什么东西。C是给内部人用…

总结899

目标规划: 月目标:6月(线性代数强化9讲,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 今日已做: 1.读了两篇文章&a…

python使用pyinstaller打包运行过程中莫名的被阻塞

问题描述 使用pyinstaller打包python代码命令 python -m PyInstaller -i logo.ico -F -p ./console -n scl_runner ./main.py运行之后会有一个终端,可以看到终端日志输出正常,多次远程调用也没有问题,死循环测试调用10万次也没有卡死 然…

【Flume】高级组件之Sink Processors及项目实践(Sink负载均衡和故障转移)

文章目录 1. 组件简介2. 项目实践2.1 负载均衡2.1.1 需求2.1.2 配置2.1.3 运行 2.2 故障转移2.2.1 需求2.2.2 配置2.2.3 运行 1. 组件简介 Sink Processors类型包括这三种:Default Sink Processor、Load balancing Sink Processor和Failover Sink Processor。 Defa…

kotlin学习(二)泛型、函数、lambda、扩展、运算符重载

文章目录 泛型&#xff1a;in、out、where型变&#xff08;variance&#xff09;不变&#xff08;Invariant&#xff09;协变&#xff08;Covariant&#xff09;Java上界通配符<? extends T>Kotlin的关键词 outUnsafeVariance 逆变&#xff08;Contravariant&#xff09…

GBASE金融信创优秀解决方案鉴赏 · 核心业务系统数据库解决方案

为此&#xff0c;实验室特别开设金融信创优秀解决方案专栏&#xff0c;集中展示优秀成果。现在&#xff0c;让我们一起来领略下GBASE的优秀解决方案吧~可点击阅读原文 →《金融信创优秀解决方案--核心业务系统数据库解决方案》。 核心业务系统数据库解决方案 方案简介 随着技…

C++:虚函数

C面向对象的三个特性&#xff0c;封装继承多态。在继承的关系中&#xff0c;所有的东西都可以被继承下来&#xff0c;如数据可以被继承下来在内存&#xff0c;而函数的继承则是继承调用权。 虚函数主要是通过虚函数表来实现&#xff0c;每个类都有自己的虚表&#xff0c;当你创…

A fight among three “三国”混战 | 经济学人20230520版社论双语精翻

《经济学人》2023年5月20日封面&#xff08;社论&#xff09;文章精翻&#xff1a;《全球支付系统的“三国”混战》&#xff08;A fight among three&#xff09; A fight among three “三国”混战 The fight over the future of global payments 全球支付的未来之争 Digital …

【STM32】软件I2C(支持多字节)

I2C简介 I2C总线是一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信。I2C总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟的同步。 在一个i2c通讯总线中&#xff0c;可连接多个i2c通讯设备&a…

Go-unsafe详解

Go语言unsafe包 Go语言的unsafe包提供了一些底层操作的函数&#xff0c;这些函数可以绕过Go语言的类型系统&#xff0c;直接操作内存。虽然这些函数很强大&#xff0c;但是使用不当可能会导致程序崩溃或者产生不可预料的行为。因此&#xff0c;使用unsafe包时必须小心谨慎。 …

吴恩达ChatGPT《Prompt Engineering》笔记

ChatGPT 提示词工程师教程 1. 课程介绍 1.1 ChatGPT 相关术语 LLM&#xff1a;Large Language Model&#xff0c;大语言模型 Instruction Tuned LLM&#xff1a;经过指令微调的大语言模型 Prompt&#xff1a;提示词 RLHF&#xff1a;Reinforcement Learning from Human F…

机器视觉初步6:图像分割专题

图像分割是一种图像处理技术&#xff0c;它将图像划分为具有相似特征的区域。常见的图像分割方法包括阈值分割、边缘分割、区域分割、基于阈值的方法、基于边缘的方法、基于区域的方法、聚类分割、基于图论的方法、基于深度学习的方法。 文章目录 1.阈值分割2.边缘分割3.区域分…

CloFormer实战:使用CloFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

kali常用ping命令探测

ping 判断目标主机网络是否畅通 ping $ip -c 1其中&#xff0c;-c 1 表示发送一个数据包 traceroute 跟踪路由 traceroute $domain ARPING 探测局域网IP ARP&#xff08;地址解析协议&#xff09;&#xff0c;将IP地址转换成MAC地址arping $ip -c 1 #!/bin/ bash######…

基于matlab使用先导校准来补偿阵列不确定性(附源码)

一、前言 此示例说明如何使用先导校准来提高天线阵列在存在未知扰动时的性能。 原则上&#xff0c;可以轻松设计理想的均匀线性阵列&#xff08;ULA&#xff09;来执行阵列处理任务&#xff0c;例如波束成形或到达方向估计。在实践中&#xff0c;没有理想的阵列。例如&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像&#xff1a;http://mirrors.163.com/ 搜狐开源镜像&#xff1a;http://mirrors.sohu.com/ 阿里开源镜像&#xff1a;https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/ 常州贝特康姆软件技…

C++【红黑树】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、认识红黑树1.1、红黑树的定义1.2、红黑树的性质1.3、红黑树的特点 2、红黑…

三分钟学习一个python小知识1-----------我的对python的基本语法的理解

文章目录 一、变量定义二、数据类型三、条件语句四、循环语句五、函数定义总结 一、变量定义 在Python中&#xff0c;使用等号&#xff08;&#xff09;进行变量的定义&#xff0c;并不需要声明变量的类型&#xff0c;Python会自动根据赋值的数据类型来判断变量的类型&#xf…

chatgpt赋能python:Python构造和析构:介绍和实例

Python 构造和析构&#xff1a;介绍和实例 当你编写 Python 程序时&#xff0c;你可能会注意到一个名为构造函数和析构函数的概念。这些函数可以在创建和删除一个对象时自动执行一些操作。本文将深入介绍 Python 中的构造和析构概念。 构造函数 Python 使用一种名为 __init_…