草庐IT

车载以太网之SomeIP协议

希希之光 2023-08-23 原文

车载以太网之SomeIP协议

1、SomeIP含义

SOME/IP ( Scalable service-Oriented MiddlewarE over IP):运行于IP之上的可伸缩的面向服务的中间件。它在系统中其实就是一个中间件的存在,所谓“Middleware中间件”是一种独立的系统软件或服务程序。

2、SomeIP通信协议

基于以太网通信协议传输,SomeIp属于应用层,他就需要依赖传输层的TCP/UDP协议,一个SomeIP服务可以通过以下方式传输所有的Method,Event,Field,
1)TCP连接,2)UDP单播,3)UDP多播
在一帧以太网数据中的位置如下所示

车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中SOME/IP是一种应用层协议。

3、SomeIP数据格式

3.1 数据格式含义

Method ID:分为Event/Notifier和Method,Event ID的最高位为1,一般像0x8001,0x8002等;Method最高位为0,例如0x0001。

Client ID:区分请求同一服务Service 的不同客户端,在整车系统中该值必须唯一。
Session ID:同一客户端请求同一服务Service 的次数;从0x0001 开始,达到0xFFFF 后,重新从0x0001 开始循环。
Message Type说明:

Return Code说明:

3.2 处理数据能力的要求

为了避免不必要的通信延时,SOME/IP 模块应该有能力同时处理20 条报文。
发送端可以封装多条SOME/IP 报文在一条以太网报文中。
接收端必须能够正确解析一条以太网报文中封装的多条SOME/IP 报文。

测试Case:SOMEIP_TEST_61 在一个UDP包中发送两条SOMEIP消息。DUT必须回复所有两条SOMEIP消息并发送正确的响应。如下图所示

4、面向服务的协议

在一个服务中,有服务端和客户端两个角色。对于同一个服务,只能存在一个Server,但可以同时存在多个Client调用服务。一个Service可以包含多个Method/Event/Field,Server和Client间的通讯就是通过RPC(Method/Event/Field)实现。

4.1 Method

Mehod分为
1)FF(Fire&Forget)即Client向Server发送请求命令,Server解析后不需要回复Server。在Autosar配置中一般定义位S/R接口;

2)RR(Request & Response)即Client向Server发送请求命令,Server解析后,作出相应的响应。在Autosar配置中一般定义为C/S接口;

4.2 Event(FF)

一个单向的数据传输,当订阅(SomeIP-SD)成功后,事件发生(只能是on change类型)时,Server端主动向订阅的Client端发布(Publish)信息。Event没有初始值,生命周期没有定义。在SomeIP实现中一般情况需要Trigger触发Event。

4.3 Field

Field由下面三部分构成:
Getter(RR):获取,由 ,一般Payload中为空。Autosar中C/S接口。
Setter(RR):设置,由Client端发送数据到Server端,更改Server端的数据,并回复更改的值。Autosar中C/S接口。

Notifier(FF):通知,Client端订阅Server端服务成功后,Server端第一时间主动向Client端发送对应的数据通知。Autosar中S/R接口。

4.4 Autosar接口说明

扩展请参考Autosar:1)SR接口(SenderReceiverInterface):SR接口主要是通过dataelement,来定义传输数据的每一个部分。SenderReceiverInterface可以用于1对1,1对多,多对1,即可以是多个发送方,也可以是多个接收方,可以定义一个或多个dataelement,但是不可以多个发送方对多个接收方,这在AUTOSAR中是不允许的。
2)CS接口(ClientServerInterface):C/S接口就是客户/服务接口,这个接口就是客户端来调用服务端的一个操作接口。意思是我想调用一个函数,而这个函数在其他的C文件中,就让RTE帮忙调用。

5、两个ECU间SomeIP数据的通讯过程

SomeIP在Autosar架构中的位置


SoAD:Socket Adapter 用以以太网中的Socket适配,主要将以太网传输的Socket和Pdu进行关联。SoAd的主要目的是在使用PDU的Autosar通信服务模块和基于Socket的TCP/IP堆栈之间创建一个接口。
PDUR:会将COM下发的信号数据分配到相应的协议总线上或将不同的协议变成同一信号上传给COM。

6、SomeIP序列化

序列化(Serialization)指的是将数据结构或对象依据事先定义的规则转换成二进制串的过程;
反序列化(Deserialization)指的是将二进制串依据相同规则重新构建成数据结构或对象的过程。

6.1 序列化和反序列化过程


如上图,在AUTOSAR中是指数据在PDU中的表达形式,可以理解为来自应用层的真实数据转换成固定格式的字节序,以实现数据在网络上的传输。软件组件将数据从应用层传递到RTE层,在RTE层调用SOME/IP Transformer,执行可配置的数据序列化(Serialize)或反序列化(Deserialize)。SOME/IP Serializer将结构体形式的数据序列化为线性结构的数据;SOME/IP Deserializer将线性结构数据再反序列化为结构体形式数据。在服务端,数据经过SOME/IP Serializer序列化后,被传输到服务层的COM模块;在客户端,数据从COM模块传递到SOME/IP Deserializer反序列化后再进入RTE层。
someip序列化和反序列是在SomeIpXf.c中实现的。其中一个序列化函数如下,前面是Someip header,后半部分是data序列化

6.2 序列化和反序列化的要求

1)对于固定长度的数据,SOME/IP transformer 不会因为对齐而自动填充数据;如果固定长度数据元素后面的数据需要填充,则必须在Interface 表格中明确定义这一点。
2)对于可变长度的数据,应考虑对齐而使用填充。
3) 对齐应从SOME/IP 报文的起始开始计算;为了简化代码生成器,目前对齐被限制为1 个字节的倍数(例如,8bits、16bits、32bits);本项目至少要支持4 字节的对齐。
4)如果在反序列化期间,比预期更多的数据交予SOME/IP transformer 处理;那些非预期的数据应该被忽略。
5) 如果在反序列化期间,比预期更少的数据交予SOME/IP transformer 处理;则应按照以下方式处理:
如果本地接收方可提供缺少的数据的预设值或初始值(在序列化表格中),则使用该值填充序列化流末尾缺少的元素。
如果无法提供可用的值,则反序列化中断。

7、SomeIP测试(TC8)

7.1 测试规范

根据测试规范《OA_Automotive_Ethernet_ECU_TestSpecification_Layer_3-7_v3.0》,可以通过CANOE5640设备编写脚本。其中一个测试case如下

7.2 ECU即可以作为服务端还可以作为客户端

协议栈对应测试Case:
以下是Tester端作为服务端,DUT作为客户端(一般DUT作为服务端)。
SOMEIP_ETS_103: SD_ClientServiceGetLastValueOfEventTCP;
SOMEIP_ETS_104: SD_ClientServiceGetLastValueOfEventUDPMulticast;
SOMEIP_ETS_105: SD_ClientServiceGetLastValueOfEventUDPUnicast。

下篇:车载以太网之SomeIP-SD协议
车载以太网之DoIP协议_第一篇

有关车载以太网之SomeIP协议的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  3. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  4. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  5. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  6. ruby - 协议(protocol)族不支持的地址族 - 2

    我尝试执行此页面中显示的ruby示例:http://tomayko.com/writings/unicorn-is-unix但我得到的只是echo.rb:9:in`bind':Addressfamilynotsupportedbyprotocolfamily-bind(2)(Errno::EAFNOSUPPORT)fromecho.rb:9:in`'有什么想法吗? 最佳答案 我遇到了同样的问题。只需将localhost更改为0.0.0.0:address=Socket.pack_sockaddr_in(4242,'0.0.0.0')

  7. ruby-on-rails - 在 Github 上 fork Ruby/Rails gem 的正确协议(protocol)/礼仪是什么,可以作为持续的并行 fork 进行维护? - 2

    最近我使用了一个由单个开发人员创建的不错的gem,它托管在Github上。在我的工作中,我不得不对它进行一些实质性的修改,添加一些改进。有些是特定于项目的,有些是特定于gem的,还有一些是独立的改进。对于特定于gem的改进(例如,错误修复),我fork了存储库,应用了修复,并提出了拉取请求。然后,然而,我注意到独立的改进有点属于原始gem的并行、持续的分支类别。更清楚地说,你以前见过它;我重写了原始gem的View以使用TwitterBootstrap框架。因此,我也将它推送到了Github,但是,当然,我没有提出拉取请求——相反,我更新了README以解释不同之处,并感谢gem的原作

  8. ruby-on-rails - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown 状态:未知协议(protocol) - 2

    我关注了很多关于这个问题的帖子,但没有一个对我有帮助。我正在尝试使用最简单的irb命令进行连接:require'open-uri'open('https://aristo4stu3.bgu.ac.il')奇怪的是,对于我尝试过的任何其他httpsuri,它都工作正常(即https://google.com)。出于调试目的,我什至尝试使用以下方法禁用SSL验证:OpenSSL::SSL::VERIFY_PEER=OpenSSL::SSL::VERIFY_NONE这似乎也没有帮助。我的设置是(在AWS上):$rvm-vrvm1.21.3(stable)byWayneE.Seguin,Mic

  9. 【车载开发系列】UDS诊断---DTC故障码基础回顾 - 2

    【车载开发系列】UDS诊断—DTC故障码基础回顾UDS诊断---DTC故障码基础回顾【车载开发系列】UDS诊断---DTC故障码基础回顾一.什么是DTC故障码二.DTC故障码的作用三.什么是自诊断需求四.故障自诊断范围是什么五.DTC故障码的格式及组成六.DTC之故障所属系统七.DTC之故障类型八.DTC之所属子系统九.DTC之故障失效类型十.DTC故障码的表示十一.故障指示的概念十二.什么是故障快照信息十三.什么是故障扩展信息十四.故障扩展信息和快照信息的作用十五.DTC故障码的状态位十六.状态码的作用是什么十七.DTC故障信息存储机制十八.什么是故障自恢复策略十九.与操作DTC故障码相关的

  10. ruby-on-rails - 如何使用rails输出当前协议(protocol)和url? - 2

    我有一个共享对话框。在开发中它看起来像:http://xxxxxx.com/stuff产品上:https://yyyyyyyyyyy.com/stuff输出#Protocol##URL#的最佳Rails方式是什么我可以在哪里设置它们?谢谢 最佳答案 request.protocolrequest.url参见requestobject. 关于ruby-on-rails-如何使用rails输出当前协议(protocol)和url?,我们在StackOverflow上找到一个类似的问题:

随机推荐