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

devtools/2025/2/5 19:51:58/

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/devtools/156363.html

相关文章

登录认证(5):过滤器:Filter

统一拦截 上文我们提到(登录认证(4):令牌技术),现在大部分项目都使用JWT令牌来进行会话跟踪,来完成登录功能。有了JWT令牌可以标识用户的登录状态,但是完整的登录逻辑如图所示&…

Qt网络相关

“ 所有生而孤独的人,葆有的天真 ” 为了⽀持跨平台, QT对⽹络编程的 API 也进⾏了重新封装。本章会上手一套基于QT的网络通信编写。 UDP Socket 在使用Qt进行网络编程前,需要在Qt项目中的.pro文件里添加对应的网络模块( network ). QT core gui net…

【Redis】主从模式,哨兵,集群

主从复制 单点问题: 在分布式系统中,如果某个服务器程序,只有一个节点(也就是一个物理服务器)来部署这个服务器程序的话,那么可能会出现以下问题: 1.可用性问题:如果这个机器挂了…

手写单层RNN网络,后续更新

文章目录 1. 原理2. pytorch 源码,只是测试版,后续持续优化 1. 原理 根据如下公式,简单的手写实现单层的RNN神经网络,加强代码功能和对网络的理解能力 2. pytorch 源码,只是测试版,后续持续优化 import…

力扣面试150 长度最小的子数组 滑动窗口

Problem: 209. 长度最小的子数组 参考题解 滑动窗口 class Solution {public int minSubArrayLen(int target, int[] nums) {int n nums.length;int ans n 1;int sum 0; // 子数组元素和int left 0; // 子数组左端点for (int right 0; right < n; right) { // 枚举…

使用 Docker(Podman) 部署 MongoDB 数据库及使用详解

在现代开发环境中&#xff0c;容器化技术&#xff08;如 Docker 和 Podman&#xff09;已成为部署和管理应用程序的标准方式。本文将详细介绍如何使用 Podman/Docker 部署 MongoDB 数据库&#xff0c;并确保其他应用程序容器能够通过 Docker 网络成功连接到 MongoDB。我们将逐步…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;过程。它帮助开发人员自动化构建、测试和部署应用程序&#xff0c;显著提高软件开发的效率和质量…

Redis详解

一、介绍 Redis是一个基于内存的key-value结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据企业应用广泛 二、安装 官网&#xff1a;Redis中文网 三、数据类型 四、常用命令 1.字符串操作命令 2.哈希操作命令 3.列表操作命令 4.集合操作命令 5.有序集合操作命…