曾经给同事培训 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字段含义:
文章来源:https://www.toymoban.com/news/detail-467795.html
6.3、SOMEIP Service Discovery Protocol(SOME/IP SD)
SOME/IP SD支持在Entries array中放置多个Entry;Entries 用于同步服务实例状态(提供服务、发现服务)和发布/订阅管理;
Entries 有服务类型Entries和事件类型Entries;
文章来源地址https://www.toymoban.com/news/detail-467795.html
- 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表示任意版本;
到了这里,关于深入理解SOMEIP培训讲义 - 干货!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!