通信易懂唠唠SOME/IP——SOME/IP消息格式

embedded/2025/2/8 20:26:46/

SOME/IP是Scalable service-Oriented MiddlewarE over IP (SOME/IP)的缩写,基于IP的可扩展面向服务的中间件。广泛应用于汽车行业嵌入式通信。 它是基于服务的,服务可以由0个或多个Event,Method,Field组成。

Event是一种单向的数据传输,在数据发生变化时由服务端发给客户端,或者周期发送。

Method是一个被调用的方法。是由客户端调用,在服务端实现的方法。

Field表示一个状态,因此有Getter,Setter方法(Menthod),有Notify(Event)。

本篇主要介绍SOME/IP的消息格式,是《通信易懂唠唠SOME/IP》专栏的一篇,其他SOME/IP相关内容可关注专栏的其他文章。

一  SOME/IP报文格式

1.1 SOME/IP header 

SOME/IP header的格式如下图

  • Message ID (Service ID/Method ID) [32 Bits]

包括service id和Method id两部分,各占16 bit,用来唯一的标志RPC调用或者通知事件。

MethodID的最高位0表示是method,最高位是1代表event

  •  Length [32 Bits]

包含从Request ID开始直到SOME/IP消息结束的字节长度。

  • Request ID (Client ID/Session ID) [32 Bits]

Request ID由Client ID和Session ID两部分组成,各占16bits

Client ID用来区分不同应用,Session ID用来区分来自同一个发送者的不同消息或请求,从0-0xff循环递增。

Client ID和Session ID一起组成RequestID,就可以多个应用并行使用相同的method,event或者getter,setter接口。

怎么理解呢?比如,在一个系统上,可能应用A和B都要请求同一个method,且请求多次。每个应用每次携带的method 参数不同,负责SOME/IP协议栈就要发出Request ID不同的多个请求。假设分下面四条请求

应用A发出的请求1 clientid=0x0001,sessionid=0x0001

应用A发出的请求2 clientid=0x0001,sessionid=0x0002

应用A发出的请求1 clientid=0x0002,sessionid=0x0001

应用A发出的请求2 clientid=0x0002,sessionid=0x0002

对于Provider返回Response时会复制Request里面的RequestID,那协议栈在收到Response时就可以根据RequestID把不同的Response结果给不同的应用:clientid=0x0001,sessionid=0x0001是应用A第一次请求的结果,clientid=0x0001,sessionid=0x0002是应用A第二次请求的结果,clientid=0x0002,sessionid=0x0001是应用B第一次请求的结果,clientid=0x0002,sessionid=0x0002是应用B第二次请求的结果。

  •  Protocol Version [8Bits]

协议版本号。对于SOME/IP header 的不兼容的变化,版本号应该增加。

  •  Interface Version [8 Bits]

Service Interface主版本号

  • Message Type [8 Bits]

Message Type用来区分不同的消息类型,取值见下表。

0x00 期望有应答的请求。

0x01 不需要应答的请求,又叫Fire&Forget消息。

在我们的实际应用中,设计的method,要么是0x00类型,要么是0x01。比如一个执行加法的Method,请求会带两个参数,希望Response里面携带计算结果,就是一个Request。还有一些method不关心执行结果,不需要应答,就可以设计成fire&forget。

0x02 是NOTIFICATION,单向通信的Event就是这个类型。

最后几个TP前缀都是针对长度大于1392bytes的大包数据类型的。

  • Return Code [8 Bits]

Return Code用来标记请求是否被成功处理。只有RESPONSE和ERROR的消息的Return Code有效,其他类型的消息ReturnCode设置成E_OK(0x00)。

Return Code的允许的值如下表。

  • Payload [variable size]

序列化之后的实际要传送的数据,由Event的数据元素或method的参数组成。

二 举例

SOMEIP报文的例子

  • 例子一 event(Message type=0x02)

  • 例子二 method(客户端请求Message type=0x00,Provider应答0x80)

Request消息

上一条Request对应的Response的消息


http://www.ppmy.cn/embedded/160615.html

相关文章

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data,存放有向图信息 data中每个点所在的行序号为起始点序号,列为终点序号。 比如:值4的坐标为(1,2)即点1到点2距离为4;值8的坐标为(6,7)…

RabbitMQ 与 Kafka 的核心区别,如何选择合适的消息中间件?

在现代分布式系统中,消息队列(Message Queue,MQ)扮演着重要角色,能够解耦服务、提高系统伸缩性、增强可靠性。目前,RabbitMQ 和 Kafka 是两款最常见的消息中间件,它们虽然都能实现消息传输&…

elasticsearch(ES)简介及安装-----笔记

elasticsearch简介 ES是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 ES结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。 elasticsearch是elastic stack的核心&…

【Elasticsearch】geotile grid聚合

geotile_grid聚合是 Elasticsearch 中一种用于处理地理数据的多桶聚合方式,它将geo_point和geo_shape类型的值分组到表示网格的桶中。以下是关于geotile_grid聚合的详细说明: 基本概念 • 网格划分:geotile_grid聚合将地理数据划分为一个稀疏…

【mysql】数据库字段设计原则

本文将分享17个关键字段设计原则,这些经验可规避80%的数据库设计缺陷,涵盖性能、扩展性、可维护性等核心维度,附具体场景示例: 一、数据类型选择:避免“隐形成本杀手” 1. 整数类型精确匹配 坑:滥用BIGIN…

Llama最新开源大模型Llama3.1

Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1,这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍: 参数规模与训练数据 Llama 3.1拥有4050亿(405B)参数,是目前开源领域中参数规模最大的…

为多个GitHub账户配置SSH密钥

背景 当需要同时使用多个GitHub账户(例如工作和个人账户)时,默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对,并指…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop(PS)实现图片的批量处理。 传统上,批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理,而现在有了AI的辅助,我们可以轻松生成PS脚本,实现自动化处…