深入理解SOMEIP培训讲义 - 干货!!!

曾经给同事培训 SOMEIP 写的干货,分享给大家!!!
也欢迎关注!!!评论!!!
以下是我写的系列文章

系列文章目录

C++高性能优化编程系列
深入理解设计原则系列
深入理解设计模式系列
高级C++并发线程编程

世间最容易的事是坚持,最难的事也是坚持。要记住,坚持到底就是胜利。

1、SOMEIP 概述

服务是SOME/IP的最核心的一个概念,属于会话层的协议。
在这里插入图片描述

  • 在一个服务中,定义了Server和Client两个不同角色:Server提供服务,Client调用服务。
  • 对于同一个服务,只能存在一个Server,但可以同时存在多个Client调用服务。一个Service由0至多个Event/Method/Field组成。
  • 在车载网络中,某个ECU有时会需要调用实现在其他ECU上的个服务,这个时候它俩就分别扮演了Client和Server的角色,而SOME/IP就是实现这种远程服务调用的接口。
  • 与CAN总线为主的车载网络(当发送者发现信号的值变化了,或者发送周期到了,就会发送信息,而不考虑接收者是否有需求。)相比,而SOME/IP则不同,它是在接收方有需求的时候才发送,这种方法的优点在于总线上不会出现过多不必要的数据,从而面向服务的通讯方式能够大大降低总线的负载率。

2、SOMEIP Protocol Frame(协议解读)

SOMEIP传输协议帧:
在这里插入图片描述

3、SOMEIP Serialization of Data Structures(数据结构的序列化)

什么是序列化?
序列化:将对象的状态信息转换为可以存储或以二进制的形式在网络中传输。
反序列化:将序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
序列化规则:
在这里插入图片描述

4、SOMEIP Serialization of Data Structures(序列化常见问题)

4.1 SOMEIP Serialization of Data Structures(序列化常见问题-大小端)

首先什么是大小端:

大端:高字节存放到内存的低地址。
小端:高字节存放到内存的高地址。

假如有一个数据是0x12345678,直接用memcpy将这个数copy到下图中的Length里面来,如果是大端的话,((uint8)Length)[0]就等于0x12;如果是小端的话,就是0x78。
在这里插入图片描述
因为对于赋值的方便性来讲,大端是网络通信中常用的方式(例如TCP/IP),所以SOME/IP格式头也使用大端。Payload由于是用户自主定义的内容,所以用户可以自己决定大小端。

4.2 SOMEIP Serialization of Data Structures(序列化常见问题-数据对齐)

对于不同的CPU,数据的存放有不同的对齐原则,有8、16、32甚至64位对齐(可以配置)。如果一个数据是按照CPU对齐的,那么在反序列化的时候会有一定的性能优势。但是SOME/IP序列化的时候只支持对动态数据类型自动添加填充位(即动态数组、动态字符串)。使用场景比较局限且序列化的时候还会消耗一些性能,多时候都默认使用8bit对齐(也就是不对齐)。我们也举个例子简单讲讲:
在这里插入图片描述
假如我们设计的服务接口有两个参数,一个是uint8 arr[5],另一个是uint8 arr2[3],且假设两个数组都是动态数组。动态数组都是要加长度域的,以表示后面的数组的字节数,假设arr使用2bytes的长度域,arr2使用1byte的字节域。当前CPU是4字节对齐,那么序列化完arr的5个数据后,就不能立即序列化arr2。因为arr的长度域+数据域一共7bytes,不是4的整数倍,要填充1byte。而后面的arr2由于是该someip报文的所有元素的末尾元素,虽然其也是动态数组,但是不用填充(因为后面没有数据了,不会影响后面数据的反序列化性能)

4.3 SOMEIP Serialization of Data Structures(序列化常见问题-数据类型)

拿C语言举例,能用到的数据类型有:
基础数据类型:就是C语言中的保留字能直接使用的类型及其重命名类型。如uint8,short,long和float64等
复杂数据类型:就是C语言中需要通过基础数据类型进行组合的新类型。如struct,union,array和string等
需要强调的一点是:string和动态array这样的类型在C语言中是不存在的,但是string可以通过array模拟;动态array也可以通过struct模拟。在CP协议中,可以识别这些模拟出来的类型,并序列化成string和动态array。下面列举一下someip所支持的所有可序列化的数据类型。
在这里插入图片描述
需要注意的是:
someip不支持指针的直接序列化,因为没有任何意义,通信双方的内容地址和存放的数据都是不同的,直接传地址是去不到对应数据的。
someip支持使用TLV(Tag Length Value)格式传输数据,需要配置打开。

5、SOMEIP Error Processing(错误处理)

客户端不管是请求还是订阅,都有可能在服务器中遭遇失败,这也就意味着服务器需要具备错误处理的能力。

Return Code是将应用程序错误和方法的响应数据从服务器传输到客户端。

对于通过UDP接收的SOME/IP消息,应检查UDP如下信息:

  • UDP数据报大小应至少为16字节(即SOME/IP消息的最小长度)
  • UDP首部中Length字段的值应小于或等于UDP payload字节数
    在这里插入图片描述

6、SOMEIP Service Discovery Protocol(服务发现协议)

SOME/IP SD全称,SOME/IP Service Discovery,即服务发现。在Client与Server间进行数据传输前,需要检测网络连接、询问Server服务能力、数据传输要求、Server与Client之间的发布/订阅处理等,这样的一系列过程叫做服务发现;

  • SOME/IP SD报文特征,报文结构有普通SOME/IP报文一致,但Message ID(ServiceID/MethodID) = 0xFFFF/8100;
  • SOME/IP SD功能,定位服务实例、检测服务实例状态、订阅/发布管理;
  • SOME/IP SD当前只支持基于IP的通信;
  • SOME/IP SD依赖于SOME/IP,SOME/IP支持TCP和UDP,但SOME/IP SD限制只能通过UDP(因为UDP单播、多播、延时小可满足SOME/IP SD要求);
  • SOME/IP SD报文特征,报文结构有普通SOME/IP报文一致,但Message ID(ServiceID/MethodID) = 0xFFFF/8100;
  • SOME/IP SD功能,定位服务实例、检测服务实例状态、订阅/发布管理;
  • SOME/IP SD当前只支持基于IP的通信;
  • SOME/IP SD依赖于SOME/IP,SOME/IP支持TCP和UDP,但SOME/IP SD限制只能通过UDP(因为UDP单播、多播、延时小可满足SOME/IP SD要求);
    在这里插入图片描述

6.1、 SOMEIP Service Discovery Protocol(服务发现协议)

  • SOME/IP-SD 消息的Client ID = 0x0000,因为只存在一个SOME/IP-SD实例;
  • SOME/IP-SD 消息可以配置Client ID前缀;
  • SOME/IP-SD Session ID遵循SOME/IP的原则(不能设置为0,从1开始并依次递增);
  • SOME/IP-SD 头部从falgs字段开始;
  • Reserved字段: 无;
  • Entries Array Length 与 Entries Array: 携带了服务和服务实例信息;
  • Entries Array Length 与 Entries Array: 是Entries的附加信息;
    在这里插入图片描述

6.2、SOMEIP Service Discovery Protocol(Flags字段含义)

Flags字段含义:
在这里插入图片描述

6.3、SOMEIP Service Discovery Protocol(SOME/IP SD)

SOME/IP SD支持在Entries array中放置多个Entry;Entries 用于同步服务实例状态(提供服务、发现服务)和发布/订阅管理;
Entries 有服务类型Entries和事件类型Entries;
在这里插入图片描述

  • Type字段: 包含FindService(0x00)、OfferService(0x01)、StopOfferService(0x01);
  • Index 1st Options: 在Option Array中要运行的第一个Option的索引,0表示第一个SOME/IP SD数据包;
  • Index 2nd Options: Option Array中要运行的第二个Option的索引,0表示第一个SOME/IP SD数据包;
  • of Opt 1: 描述第一个Option运行使用的option数量,0表示没有运行的option;
  • of Opt 2: 描述第二个Option运行使用的option数量,0表示没有运行的option;
  • Service ID: 描述Entry相关的服务或服务实例的Service ID;
  • Instance ID: 描述Entry相关的服务实例的实例ID,如果被设置为0xFFFF,表示一个服务的所有服务实例;
  • Major Version: 服务(实例)的主版本号,0xFF表示任意版本;
  • TTL: 描述Entry的生命周期,以秒为单位;
  • Minor Version: 服务的次要版本,0xFFFFFFFF表示任意版本;
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen.Su

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值