SOME/IP报文格式及发现协议详解

        在之前的文章中,我们介绍了SOME/IP协议的几种服务接口。在本篇博客中,主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。

目录

流程

报文格式

Message ID

Length

Request ID

protocal version/Interface Version 

Message  Type

Return Code

SOME/IP-SD

什么是SOME/IP-SD?

SD 消息类型解析

订阅相关

例子

SOME/IP-SD如何实现服务发现

分类

Find(查找服务)

Offer(服务器提供服务信息)

关键概念

工作流程

        Eventgroup

        Method


流程

        SOME/IP协议主要工作如果在TCP/IP模型下处于应用层,而在OSI7层模型中他的序列化反序列化处于表示层,RPC处于会话层。因为表示层处理加密解密/压缩解压缩,会话层管理建立和终止通信。具体来说就是SOME/IP协议先给数据加一个协议头部再交给传输层。如果有三台设备连接在switch上,任何设备想将数据发送给其他设备,都需要将数据发送给switch(交换机)中转,然后由switch发送给其他设备。如果直接发送源消息,switch并不知道要发送给谁,因此有了报文封装。每层往下依次添加协议头.

报文格式

        这是AP AUTOSAR文档中《SOME/IP Protocol Specification.pdf》中的一段SOME/IP报文格式。我们可以看到他有16字节的大小。

Message ID

        Message ID占4字节,其中method id和service id分别占两字节,在之前的服务接口我们有提到,首先不同的服务有不同的service id.service ID往下则分为组ID,method 也有不同的ID。那么some/ip报文前4个字节就是用来确定服务和使用哪种功能的。这里需要注意的是event id 保存在method Id 字段 当someip消息类型是event时候,那么method id保存的是event id。有些朋友可能会疑惑,我们知道method就一个ID但是组有组ID和对应的事件ID也就是2个,这个method字段放得下吗?需要解答这个问题首先我们要知道我们只需要订阅一个组,所有的event就都会向你推送消息。some/ip不能想ros或者dds那样单独订阅一个话题。event id用于服务端管理和识别不同的事件而,对客户端来说没什么用。但是我怎么知道是event id还是method id呢?这里给出解答,可以通过 method id进行区分。大于0x8000的是event,小于的是method。

Length

        他和IP协议16位总长度不太一样,它并不表示报文头+负载数据二十,表示request id 到后面负载结束的长度,接收方可以通过Length知道是否已经完整接收到消息。也就是说他上面8字节的长度是不包含在内的。

Request ID

        Request ID由Client ID和Session ID组成,各占两个字节。Client ID用于区分使用同一method的不同客户端,相当于mac地址,也就是身份证号,不然他不知道给谁。不同的客户想使用相同服务ID的同一个Method怎么进行区分呢,一般来说是使用端口+ip地址进行区分,但是很遗憾vsomeip并不支持端口与Ip地址。在respond和request中,client的ID都是一样的,这样能知道返回的客户是谁,seesion ID,数据的发送方每发送一次数据,这个ID就加1,他从0x1加到 0xffff满了之后又从0x1开始加。因此session ID可以帮助我们区分每一条消息,每个消息的session ID都不一样。Request seesion id 为1000 代表这是客户端发送的第1000次请求消息。同时respond的seesion ID也是和request一样的,这样可以让我们知道服务端是在响应客户端的哪一次请求。

protocal version/Interface Version 

       这俩一般请求和响应的头都是一样的,毕竟只有协议版本接口版本一致,才能完成通信。在vsomeip中,接口版本是1 在someip中接口版本默认是0。

Message  Type

        前面留了个疑问,如何分辨event消息还是method 消息?这里给出解答,可以通过 method id进行区分。大于0x8000的是event,小于的是method。那么我们怎么知道method消息,是服务端发送的reponse还是客户端发送的request?这时候method id是一致的,那我们就可以通过Message Type字段来进行判断了。0x00是 RR,0x01是FF,event是0x02.

Return Code

        当服务端不能正确处理request消息,那么他的原因就会存储在return code中.

数值 (8-bit)报文类型 (Message Type)描述适用场景
0x00REQUEST请求消息,客户端向服务器发送请求,并期望得到响应 (RESPONSE)远程方法调用(RPC),如“获取 ECU 状态”
0x00REQUEST_NO_RETURN无返回请求,客户端向服务器发送请求,但不需要响应发送一次性控制指令,如“打开车灯”
0x00NOTIFICATION通知消息,服务器主动推送数据,客户端不需要请求事件通知(Event),如“发动机温度变化”
0x00RESPONSE响应消息,服务器对 REQUEST 请求的回应服务器返回请求结果,如“当前车速”
具体值ERROR错误消息,表示 REQUEST 失败,并包含错误码(Return Code)服务不可用、超时、协议错误等

      

错误码(数值)错误类型含义描述
0x00E_OK无错误请求成功执行
0x01E_NOT_OK未知错误服务器无法识别的错误
0x02E_UNKNOWN_SERVICE未知 Service ID请求的服务 ID 不存在
0x03E_UNKNOWN_METHOD未知 Method ID请求的方法 ID 不存在
0x04E_NOT_READY应用未就绪服务器上的应用程序未运行
0x05E_NOT_REACHABLE无法使用服务服务器内部错误,无法访问服务
0x06E_TIMEOUT请求超时服务器未在规定时间内响应
0x07E_WRONG_PROTOCOL_VERSION协议版本错误客户端和服务器的 SOME/IP 版本不匹配
0x08E_WRONG_INTERFACE_VERSION接口版本错误客户端和服务器的接口版本不匹配
0x09E_MALFORMED_MESSAGE消息格式错误反序列化失败,消息格式不正确
0x0AE_WRONG_MESSAGE_TYPE报文类型错误收到了无效的报文类型

 

SOME/IP-SD

        就像DDS一样,SOME/IP也有自己的发现机制。不过DDS是每个节点都能自己发现,而someip遵循SOA思想,服务发现机制位于服务中心里,订阅消息回应ack与 停止订阅消息都属于sd不属于someip.

协议发现机制发现方式中心化 vs. 去中心化
DDS(Data Distribution Service)内置发现机制(自动发现)每个 DDS 节点(DomainParticipant)都会广播并自动发现其他节点去中心化(Decentralized)
SOME/IP(Scalable service-Oriented Middleware over IP)服务发现(Service Discovery,SD)客户端-服务器模式,服务中心管理注册和发现中心化(Centralized)

什么是SOME/IP-SD?

  • 本质:SOME/IP-SD 是 SOME/IP 的服务发现机制,可以理解为一种特殊的服务,用于动态管理和发现网络中的服务。
  • 功能
    • 定位服务(Service Discovery):客户端寻找某个服务,服务器响应并告知 IP/端口。
    • 订阅(Subscription):客户端订阅事件组(Eventgroup),服务端确认或拒绝。

SD 消息类型解析

SOME/IP-SD 的消息分为 两大类

  1. 服务发现相关(Service Discovery)

    • FindService:客户端查找服务(广播/多播)。(client)
    • OfferService:服务器响应,提供服务 IP 和端口。(server)
    • StopOfferService:服务器通知停止提供某个服务。(server)
  2. 订阅相关(Event Subscription)

    • SubscribeEventgroup:客户端请求订阅某个事件组。(client)
    • SubscribeEventgroupACK:服务器确认订阅成功。(server)
    • SubscribeEventgroupNACK:服务器拒绝订阅请求。(server)
    • StopSubscribeEventgroup:客户端取消订阅事件组。(client)

        SD就是靠这7种不同的消息实现,server和client都有自己的独有消息,只有自己可以发送.客户端可以通过发送FindService消息来查找自己感兴趣的服务,服务端可以根据offerservice消息通知客户端,自己可以提供哪些服务。并且通过offerservice消息将他的ip传输层协议端口这些通信必要信息告知给客户端。服务端可以根据StopOfferServiced来告诉客户端他不再提供某些服务,比如要升级服务端消息,就先停止再发送

订阅相关

        客户端可以向服务端发送SubscribeEventgroup来订阅某个事件组,同时也告诉服务端自身的Ip端口通信协议并且会携带客户端感兴趣的service id和eventgroup id.服务端可以根据实际情况发送ack 订阅事件组ack消息,来告诉客户端已经成功订阅事件组。或者另一个来告诉客户端订阅失败

例子

客户端发送0x1234的消息来查找可以提供0x1234服务的客户端,你们谁提供。可以提工单就发送offer,根据通过service消息将他的ip传输层协议端口这些通信必要信息告知给客户端。

SOME/IP-SD如何实现服务发现

        想想这样一个场景有5台设备连接了交换机,那么他能进行单播(一对一直接发),广播(255.255.255.255),组播(239.0.0.0~239.,255.255.255),some/ip默认是224.244.224.245,默认端口是30490。正如我们之间传输层讲解的那样,单播:比如这里的设备1发出的消息只有设备5能够收到,广播是一对多的关系,广播将发送方的消传递给局域网内的所有接收端。组播:与广播不同的是,只有特定条件的客户端可以收到消息他是以ip来对组播组进行划分 比如224.1.3.1就是一个组。

分类

SOME/IP-SD(Service Discovery) 中,服务发现的流程包括:

  • Find(客户端查找服务)
  • Offer(服务器提供服务信息)

Find(查找服务)

  • 触发条件:当 客户端(Client)启动 时,它需要找到某个 服务(Service),例如 0x1234
  • 查找方式
    • 组播(Multicast)方式:客户端通过 UDP 组播 发送 FindService 消息,查询 "谁提供 0x1234 服务?"
    • 客户端会发送 nFind 消息,以确保所有服务器都能收到请求。

📌 解析(Find 阶段):

  • Client 启动后,向局域网内的所有服务器广播 FindService(橙色箭头)。
  • 这个过程是**“快速对外发送”**,客户端会连续发送多条 Find 消息,确保覆盖整个网络。

Offer(服务器提供服务信息)

服务器在收到 FindService 消息后,会通过 OfferService 进行响应,该过程分为两个阶段:

  1. 阶段 1(Server 启动后主动广播 Offer 消息)

            服务器启动后,会周期性以组播(Multicast)方式发送n条 OfferService,告诉网络中的设备:"我提供 0x1234 服务,我的 IP 是 192.x.x.x,端口是 55001。"

        阶段 2(周期性发送Offer 消息)

                这保证即使客户端晚一些启动也能发现这个服务

  1. 阶段 3(Server 收到 Find 后,单播 Offer 消息)
    • 如果服务器收到了 FindService 请求,它会直接单播(Unicast)OfferService 给该客户端,告诉它服务可用,并提供IP 和端口信息

关键概念

阶段角色通信方式描述
FindClientUDP 组播(Multicast)客户端查找 FindService,广播请求
Offer(阶段1)ServerUDP 组播(Multicast)服务器启动时主动广播 OfferService
Offer(阶段2)ServerUDP 单播(Unicast)服务器收到 FindService 请求后,直接单播 OfferService 给客户端

        为什么find和offer消息是以组播形式传播的?是因为他不知道系统中谁能提供自己感兴趣的服务,使用组播而不使用广播是因为可以避免其他没有使用someip协议的接收到消息,为什么要发送多条消息?是因为定位使用的是upd协议,不可靠,为什么要分为两个阶段先快速发送offer消息然后再周期性发送消息?第一时间的快速发送消息就是为了让客户端能第一时间接收到服务端的offer消息,而第二阶段的存在是为了避免浪费网络带宽如果服务端收到了find消息,服务端就会以单播形式发送给客户端,有了周期性发送offer为什么还要单播呢?这是因为周期性发送offer消息的时间间隔过长,让客户端第一时间接受offer消息.

工作流程

        Eventgroup

         client发送FindService报文,server发送offerService报文。之后客户端才能发订阅某个方法啊,订阅的时候发具体订阅某哪个事件组.server会回一个同意或者不同意的ack,之后就正常推送event事件。不需要了就发一个停止订阅组。

        Method

        如果客户端不知道服务端的ip&&port。那么就需要通过发现协议先知道Ip和端口,然后就可以直接调用rpc了,不需要发什么请求订阅消息组之类的。直接调用,请求消息头部的Message ID和Message Type会告诉server是Method请求还是请求订阅事件组。如果是RPC会直接调用方法。

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

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

相关文章

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…

约束布局属性学习

1、layout_constraintHorizontal_bias layout_constraintHorizontal_bias 是 ConstraintLayout 中的一个重要属性,用于控制一个视图在父视图或相关视图中水平位置的偏移。这种偏移通过在0到1之间的浮点值来设置,0代表完全靠近左边或起始位置&#xff0c…

Windows双网卡冲突导致网页加载过慢的解决方法 (修改跃点无效 远程桌面连接)

【本文发布于https://blog.csdn.net/Stack_/article/details/145494160,未经许可不得转载,转载须注明出处】 办公室内,我的笔记本和台式机都连接WIFI进行上网,网段是192.168.0.x,网关192.168.0.101 现在要通过Windows自…

轻量级服务器http-server

安装 sudo npm install http-server -g 运行 1. 直接去到要跑起来的目录,在终端输入 cd xxxx文件夹http-server //只输入http-server的话,更新了代码后,页面不会同步更新http-server -c-1 //同步更新页面http-server -a 127.0.0.1 -p 808…

代码随想录算法【Day38】

Day38 322. 零钱兑换 思路 完全背包 代码 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i < coins.size(); i) { // 遍历物品for (int j coins[i]; j <…

python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作 引言使用效果:代码pcd_roi_crop.py:引言 当我们想对一个不规则物体的图像或者点云裁剪时,直接手动输入…

STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…

Redis05 - 性能调优和缓存问题

Redis性能调优和缓存问题 文章目录 Redis性能调优和缓存问题一&#xff1a;链路追踪判断是不是redis出了问题二&#xff1a;redis变慢原因1&#xff1a;使用复杂度过高的命令(*)1.1&#xff1a;查看redis慢日志1.2&#xff1a;延迟变大原因分析1.3&#xff1a;解决方案 2&#…

漫步 C++ 之途,领略引用的独特风姿

在C中&#xff0c;引用&#xff08;Reference&#xff09;是一种非常有用的特性&#xff0c;它允许为一个变量创建一个别名&#xff08;Alias&#xff09;。引用在很多情况下可以替代指针&#xff0c;但使用起来更加方便和安全。以下是对C引用的详细介绍&#xff0c;包括其定义…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

Java 多线程、线程同步、线程池

一. 线程 1. 线程&#xff1a;线程(Thread)是一个程序内部的一条执行流程。 2. 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 二. 多线程 多线程是指从硬件上实现多条执行流程的技术(多条线程由CPU负责调度) Javas是通过java.lang.Thread类的对象来代…

20.[前端开发]Day20-王者荣耀项目实战(三)

01_(掌握)王者荣耀-main-赛事新闻列表实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

【Langchain学习笔记(一)】Langchain介绍

Langchain介绍 Langchain介绍前言1、Langchain 是什么2、为什么要用 Langchain3、Langchain 的核心4、Langchain 的底层原理5、Langchain 的应用场景 Langchain介绍 前言 想象一下&#xff0c;如果你能让聊天机器人不仅仅回答通用问题&#xff0c;还能从你自己的数据库或文件…

IDEA2024版本创建Sping项目无法选择Java 8

目录 一、背景二、解决方式&#xff08;替换创建项目的源地址&#xff09; 一、背景 IDEA2024创建一个springboot的项目&#xff0c;本地安装的是1.8&#xff0c;但是在使用Spring Initializr创建项目时&#xff0c;发现版本只有17、21、23。 二、解决方式&#xff08;替换创…

C++11(四)

目录 包装器 function包装器 bind绑定 更改实参传递的顺序和实参传递的个数 线程库 本期我们将继续进行C11新特性的学习。 包装器 function包装器 function包装器&#xff0c;我们也称之为适配器&#xff0c;本质上就是一个类模板&#xff0c;为什么要引入function包…

MySQL 数据库编程-C++

目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成&#xff1a…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…

动态规划LeetCode-1035.不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09;相…

禅道社区版项目管理软件部署(记录篇)

系统要求&#xff08;这里推荐使用docker容器化方式&#xff09;安装前的准备Docker快速安装最后通过查看地址验证是否部署成功开始界面化安装配置 禅道&#xff08;ZenTao&#xff09;是一款国产开源的项目管理软件&#xff0c;专注于敏捷开发流程&#xff0c;支持 Scrum 和 K…