SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制

news2025/1/16 17:16:27

车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中今天所要介绍的内容SOME/IP就是一种应用层协议

SOME/IP协议内容按照AUTOSAR中的描述,我们可以更进一步的拆分为三类子协议:应用层的SOME/IP标准协议,SOME/IP-SD协议以及TP层的SOME/IP-TP协议。

SOME/IP协议特点

特点

描述

Serialization(序列化)

在ECU内部进行序列化及反序列化以实现信息的高效传输

Remote Procedure Calls(远程调用)

该协议可以传递消息(作为字段发送)以及方法的远程调用(实现过程/函数调用)

Service Discovery(服务发现)

SOME/IP协议的数据通信发生在客户端-服务器模型中,同时服务器提供客户端可以订阅的许多不同服务。该协议允许客户端动态查找服务、订阅服务并配置对服务的访问。

Publish/Subscribe(发布与订阅)

SOME/IP中的数据通信通过发布/订阅进行。客户端可以订阅服务器提供的服务,服务器可以向活跃的订阅者发布通知。

Segementation of UDP message

每当服务器必须向活动订阅者发送通知时,他们是通过UDP协议发送的。SOME/IP能够在不需要任何分段的情况下传送大型UDP消息。

SOME/IP协议解析

如果应用了 E2E 通信保护,则 E2E 报头将放置在 Return Code 之后,具体取决于为 E2E 报头选择的偏移值。默认偏移值为 64 位,这将 E2E 报头恰好放置在 Return Code 和 Payload 之间。

SOME/IP协议Header包含Message ID,Request ID, Protocal Version 以及Interface Version。

各字段解释如下:

Item

Description

Message ID

前2个字节为Service ID,后2个字节为Method ID(每个服务仅定义一个唯一的Service ID,Method ID的最高位为0即为方法(包括Method Filed.Getter及Filed.Setter),最高位为1就为事件(包括Event和Filed.Notify))

Length

标识从Request ID开始至SOME/IP报文结束的长度

Request ID

前2个字节为Client ID,用来识别一个客户端;后2个字节为Session ID,用来识别同一个客户端的多次请求。(其中Client ID可通过配置前缀或者固定值来实现唯一性,可不进行Session处理,如果需要,则Session ID需根据各自的用例从0x0001递增)

Protocol Version

协议版本号,目前固定为1

Interface Version

用来识别服务接口的主版本号,由用户定义

Message Type

用来识别不同的消息类型,Message Type(8Bits)的Bit5标识TP-Flag,当TP-Flag=1时,标识一个TP类型的Message Type (当SOME/IP下层通信协议为UDP,且SOME/IP传输大数据(>1452Bytes)时,将使用SomeIpTp进行分段)

Return Code

用来指示Message是否被成功处理了,或针对请求中的错误内容进行反馈

E2E Header

可选是否使能,并且可变长度(默认长度是8Bytes),可选使用一种E2E profile(常用E2E Profile4)

Payload

有效载荷,序列化和反序列化定义了 PDU 中所有数据结构的确切位置,并且考虑了内存对齐

Message Type

用来识别不同的消息类型,目前存在的类型如下所示,其中TP表示分包的报文,按照AUTOSAR标准(R21-11)定义如下:

ID

Name

Description

0x00

REQUEST

A request expecting a response

请求并期待响应

0x01

REQUEST_NO_RETURN

A fire&forget request

请求但不期待响应

0x02

NOTIFICATION

A request for a notification expecting no response

通知/事件回调的请求,不期待有响应

0x40

REQUEST_ACK

Acknowledgment for REQUEST (optional)

REQUEST的ACK确认

0x41

REQUEST_NO_RETURN_ACK

Acknowledgment for REQUEST_NO_RETURN (informational)

REQUEST_NO_RETURN的ACK确认

0x42

NOTIFICATION_ACK

Acknowledgment for NOTIFICATION (informational)

NOTIFICATION的ACK确认

0x80

RESPONSE

The response message

响应

0x81

ERROR

The response containing an error

响应中包含的错误

0x20

TP_REQUEST

TP segment of a Request Message for methods

TP请求并期待响应

0x21

TP_REQUEST_NO_RETURN

TP segment of a Request Message for Fire & Forget methods

TP请求但不期待响应

0x22

TP_NOTIFICATION

TP segment of an Event (Notification) Message

TP通知/事件回调的请求,不期待有响应

0xA0

TP_RESPONSE

TP segment of a Response Message for methods

TP响应

0xA1

TP_ERROR

TP segment of an Error Message for methods

TP响应中包含的错误


Return Code

用来指示Message是否被成功处理了,或针对请求中的错误内容进行反馈,如下为AUTOSAR(R21-11)中定义的Return Code类型:

ID

Name

Description

0x00

E_OK

没有错误发生

0x01

E_NOT_OK

发生了未定义的错误

0x02

SOMEIPXF_E_UNKNOWN_SERVICE

未知的服务ID

0x03

SOMEIPXF_E_UNKNOWN_METHOD

未知的Method ID

0x04

SOMEIPXF_E_NOT_READY

应用程序未就绪

0x05

SOMEIPXF_E_NOT_REACHABLE

运行该服务的系统不可用

0x06

SOMEIPXF_E_TIMEOUT

发生超时

0x07

SOMEIPXF_E_WRONG_PROTOCOL_VERSION

SOME/IP协议版本不支持

0x08

SOMEIPXF_E_WRONG_INTERFACE_VERSION

接口版本不匹配

0x09

SOMEIPXF_E_MALFORMED_MESSAGE

反序列化错误

0x0A

SOMEIPXF_E_WRONG_MESSAGE_TYPE

接收到不符合预期的消息类型

0x0B

E_E2E_REPEATED

E2E重复错误

0x0C

E_E2E_WRONG_SEQUENCE

E2E错误的时序

0x0D

E_E2E

没有进一步的E2E错误

0x0E

E_E2E_NOT_AVAILABLE

E2E不可用

0x0F

E_E2E_NO_NEW_DATA

没有E2E计算的新数据

0x10-0x1F

RESERVED

预留给到SOME/IP一般性错误

0x20-0x5E

RESERVED

预留给到服务及方法的特定错误

Payload的序列化与反序列化

SOME/IP报文收发的过程中,上层应用所定义的Method、Event、Field参数都是面向用户的struct,string等,序列化就是将这些输出参数转换为字节流的过程;而反序列化的过程正好相反,就是将字节流反向解析成struct、string等具体的参数。

大小端:

SOME/IP报文的payload(负载)大小端(字节序)指的是数据在内存中的存储和传输顺序。在计算机系统中,数据的存储和传输顺序主要有两种标准:大端字节序(Big-Endian)和小端字节序(Little-Endian)。

-大端字节序(Big-Endian):是指数据的高位字节存放在低地址处,而低位字节存放在高地址处。也就是说,从内存的起始位置开始,第一个字节是最高位字节。

-小端字节序(Little-Endian):是指数据的低位字节存放在低地址处,而高位字节存放在高地址处。在这个模式下,内存起始位置存放的是最低位字节。

SOME/IP报文的payload部分可以采用上述两种字节序中的任何一种,这取决于数据交换双方的协议约定或者通信端点的实现。在网格协议中,端字节序通常由协议规范明确指出。开发者在处理SOME/IPP报文时,必须确保发送方和接收方在端字节序上保持一致,以避免数据解析错误。

SOME/IP通信机制

服务发现(Service Discovery)

服务发现的通信机制是通过SOME/IP-SD协议实现的,主要是为了实现在车载以太网中告知客户端当前服务实例的可用性及访问方式,可通过Find Service 和Offer Service来实现。

SOME/IP 服务发现流程可以分为以下三大基本步骤:

Client通过发送Find Service的报文去寻找车载网络中可用的服务实例;

Server接收到Client的Find Server后通过UDP发送Offer Service响应;

Client通过发送Subcribe Event Group去订阅相关Event;

Server检查是否满足Client是否满足订阅条件,如果满足回复ACK,如果不满足,则回复NACK;

Client成功订阅相关事件后,Server会按照事件本身属性来实现对已订阅该事件的Client的发布;

远程进程调用(RPC)

远程进程调用主要可分为四种通信模式:

Request/Response通信模式

可归纳为Method中的一种;其基本通信模型如下图所示:

Request-Response模型作为一种最为常见的通信方式,其主要任务就是客户端发送请求信息,服务端接收到请求,进行相关处理之后进行相应的响应。

Fire&Forget通信模式

可归纳为Method中的一种;

该通信模型的主要任务就是客户端向服务端发送请求,服务端无需进行任何响应,有点类似诊断服务中的抑制正响应。

Notification Event通信模式

该通信模式主要描述了发布 /订阅消息内容,主要任务就是为了实现客户端向服务端订阅相关的事件组,当服务端的事件组发生或者值发生变化时,就需要向已订阅该事件组的客户端发布更新的内容。

远程进程控制(Field)

访问进程通信机制主要是为了实现针对对应用程序的数据获取与更改,主要任务就是实现客户端通过Getter获取Server的值,通过Setter设置Server的值。

Field就可理解为一个Service的基本属性,可包含Getter,Setter,Notifier三种方式。其中Getter就是读取Field中某个值的方法,Setter就是一种改变Field值的方法,而Notifier则是一种当Field中的值发生变化的触发事件,发生变化时就通知Client。

错误处理机制

AUTOSAR为了更为高效的定位到通讯过程中的问题所在,制定了一套检查SOME/IP协议格式内容的错误处理机制。比如版本信息检查,服务ID等,其他故障信息可以在Payload中进行详细定义。目前SOME/IP支持以下两种错误处理机制,这两种uowu处理机制可以根据配置进行选择。

-消息类型0x80,Response信息,即可以通过Response Message中的Return Code来定位到问题所在;

-消息类型0x81,显式的错误信息;

主要是校验协议首部结构,对Message Type和Return code进行赋值,通知对端。


参考:

AUTOSAR SOME/IP Protocol Specification:https://www.autosar.org/fileadmin/standards/R19-11/FO/AUTOSAR_PRS_SOMEIPProtocol.pdf

智猩猩

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)

一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器(Query Optimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗&#xff…

CV项目详解:基于yolo8的车辆识别系统(含源码和具体教程)

使用YOLOv8(You Only Look Once)和OpenCV实现车道线和车辆检测,目标是创建一个可以检测道路上的车道并识别车辆的系统,并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 使用YOLOv8和OpenCV实现车道线…

osg中实现模型的大小、颜色、透明度的动态变化

以博饼状模型为对象,实现了模型大小、颜色、透明度的动态变化。 需要注意的是一点: // 创建材质对象osg::ref_ptr<osg::Material> material = new osg::Material;material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0, 1.0, 0.0, 0.5));// 获取模型的…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

AI刷题-最大矩形面积问题、小M的数组变换

目录 一、最大矩形面积问题 问题描述 输入格式 输出格式 输入样例 输出样例 数据范围 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、小M的数组变换 问题描述 测试样例 解题思路&#xff1a; 问题…

数据库(MySQL)练习

数据库&#xff08;MySQL&#xff09;练习 一、练习1.15练习练习 二、注意事项2.1 第四天 一、练习 1.15练习 win11安装配置MySQL超详细教程: https://baijiahao.baidu.com/s?id1786910666566008458&wfrspider&forpc 准备工作&#xff1a; mysql -uroot -p #以管理…

C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析&#xff1a; 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数&#xff0c;使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…

知识图谱常见的主流图数据库

在知识图谱中&#xff0c;主流使用的图数据库包括以下几种&#xff1a; Neo4j&#xff1a;这是目前全球部署最广泛的图数据库之一&#xff0c;具有强大的查询性能和灵活的数据模型&#xff0c;适用于复杂关系数据的存储和查询。 JanusGraph&#xff1a;JanusGraph是一个开源的…

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …

RabbitMQ(四)

SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置&#xff1a; ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…

java_将数据存入elasticsearch进行高效搜索

使用技术简介&#xff1a; (1) 使用Nginx实现反向代理&#xff0c;使前端可以调用多个微服务 (2) 使用nacos将多个服务管理关联起来 (3) 将数据存入elasticsearch进行高效搜索 (4) 使用消息队列rabbitmq进行消息的传递 (5) 使用 openfeign 进行多个服务之间的api调用 参…

win32汇编环境,对话框程序中组合框的应用举例

;运行效果 ;win32汇编环境,对话框程序中组合框的应用举例 ;比如在对话框中生成组合框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>>…

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…

Linux检查磁盘占用情况

1.检查使用情况 df -h发现是/dev/vda1占用很高 2.查看/dev/vda1文件夹 cd /dev/vda1发现不是文件夹 3.继续查看使用情况 df -h *4.原因可能是文件已经删除但是进程还在&#xff0c;没有释放空间 5.查看删除操作的进程 lsof -n | grep deleted6.杀死进程 kill -9 PID

C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14

目录 一.安装SQLServer 二.在SQLServer中创建一个数据库 1.打开SQL Server Manager Studio(SSMS)连接服务器 2.创建新的数据库 3.创建表 三.Visual Studio 配置 1.创建一个简单的VS项目(本文创建为一个简单的控制台项目) 2.添加数据库连接 四.简单连通代码示例 简单连…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

自动化办公|xlwings简介

xlwings 是一个开源的 Python 库&#xff0c;旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作&#xff0c;读取和写入数据&#xff0c;执行宏&#xff0c;甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…

Dify应用-工作流

目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…

《C++11》并发库:简介与应用

在C11之前&#xff0c;C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API&#xff08;如Windows的CreateThread或POSIX的pthread_create&#xff09;或者第三方库&#xff08;如Boost.Thread&#xff09;来创建和管理线程。这些方式存在以下几个问题&#xff1a; …