协议规范

SOME/IP在网络上提供面向服务的通信。一个服务可以由0个或多个事件、方法和字段组成。

事件提供周期性发送的数据,或者是服务器数据发生改变时发送给订阅者的数据。

方法为订阅者提供了在程序端执行远程过程调用的可能性。

字段是下列三个中的一个或多个的组合:

  • 一个notifier,它将数据从提供者发送到订阅者
  • 一个getter,订阅者可以调用它来显式地查询提供者的值
  • 一个setter,当订阅方想要更改提供者的值时,可以调用它

字段的notifier和事件(event)的主要区别在于,事件只在变化时发送,字段的notifier在订阅后直接发送数据。

协议格式(序列化)

序列化描述数据在协议数据单元(pdu)中表示的方式,作为UDP或TCP消息的有效负载,在基于ip的汽车车载网络上传输。

限制

不支持对SOME/IP消息的乱序段进行重新排序。

消息头

[PRS_SOMEIP_00030] Header 布局包括:

  • Message ID (Service ID/Method ID) [32 Bits]
  • Length [32 Bits] 长度包含:Request ID 及以后的字段的字节数
  • Request ID (Client ID/Session ID) [32 Bits]
  • Protocol Version [8Bits]
  • Interface Version [8 Bits]
  • Message Type [8 Bits]
  • Return Code [8 Bits]

消息头接下来就是Payload 数据了。

在应用端到端(E2E)通信保护的情况下,端到端报头(E2E header)被放置在返回代码Return Code之后,这取决于端到端报头所选择的偏移值。缺省偏移值是64位,将端到端报头置于返回代码和有效负载之间。

[PRS_SOMEIP_00031] 出于互操作性的原因,头部布局对于SOME/IP的所有实现应该是相同的。字段按传输顺序排列,即左上角的字段先传输。

Message ID (32bit)

[PRS_SOMEIP_00034] Messagge ID应该是一个32位的标识符,用于识别:

  • 对某个应用的一个方法的远程过程调用(RPC)
  • 特定的Event

NOTE:Message ID的分配由用户/系统设计人员决定。然而,消息ID对于整个系统(即车辆)是唯一的。

Method ID [15 Bit]

Method ID 如下表所示:

字段 字段 字段
service ID (16bit) 0 (1bit) Method ID (15bit)

Event ID [15bit]

Event ID 如下表所示:

字段 字段 字段
service ID (16bit) 1 (1bit) Event ID (15bit)

Eventgroup是服务中字段事件和通知事件的逻辑分组,以便允许订阅。
[PRS_SOMEIP_00365]空的事件组不能被使用。
[PRS_SOMEIP_00366]事件和字段通知至少映射到一个Eventgroup

Length [32 Bit]

[PRS_SOMEIP_00042]Length字段应该包含从Request ID/Session ID开始直到SOME/IP消息结束的字节长度

Request ID [32 Bit]

请求ID允许提供者和订阅者区分同一方法、事件、getter或setter的多个并行使用。

[PRS_SOMEIP_00043] 请求ID对于提供者和订阅者组合是唯一的。

[PRS_SOMEIP_00704] 在生成响应消息时,提供者应将请求ID从请求复制到响应消息。 Note:这允许订阅者将响应映射到已发出的请求,即使有多个未完成的请求。

[PRS_SOMEIP_00044] 在响应到达或预计不会再到达之前(超时),不能重用请求ID。

[PRS_SOMEIP_00046]请求ID的结构:

字段 字段
Client ID (16bit) Session ID(16bit)

NOTE:这意味着ECU的实现者可以根据其实现的要求定义client ID,而提供者不需要知道这个布局或定义,因为他只在响应中复制完整的请求ID.

[PRS_SOMEIP_00702] 客户端ID是ECU中调用客户端的唯一标识符。客户端ID允许ECU将多个客户端对同一方法的调用区分开来。

[PRS_SOMEIP_00703] 会话ID是唯一的标识符,用于区分来自相同发送方的顺序消息或请求。

[PRS_SOMEIP_00532] 客户端ID还应支持通过具有可配置的前缀或固定值在整个车辆中是唯一的(例如,客户端ID的最重要字节是诊断地址或应用程序(SW-C)配置的客户端ID)。

例如:

字段 字段 字段
client ID prefix(8bit) client ID(8bit) Session ID(16bit)

[PRS_SOMEIP_00932] 如果会话处理不活跃,会话ID应该设置为0x00。

[PRS_SOMEIP_00933] 当会话处理处于活动状态时,会话ID应设置为[0x1, 0xFFFF]范围内的值。

[PRS_SOMEIP_00934] 如果会话处理是活动的,会话ID应根据各自的用例增加(关于专用用例的详细信息包含在单独的规格项中)。

[PRS_SOMEIP_00533] 请求/响应方法应该使用会话处理机制处理会话ID。会话ID应该在每次调用后递增。

[PRS_SOMEIP_00521] 当会话ID达到0xFFFF时,它应该绕到0x01重新开始。

[PRS_SOMEIP_00739] 对于请求/响应方法,如果响应的会话ID与请求的会话ID不匹配,订阅者必须忽略响应。

[PRS_SOMEIP_00935] 对于通知消息,接收者应该忽略会话ID,当会话处理不活跃时。

[PRS_SOMEIP_00936] 对于通知消息,接收方应处理会话ID根据各自的用例(关于专用用例的详细信息包含在单独的规格项中)。

Protocol Version [8 Bit]

协议版本用来识别使用的SOME/IP报头格式(不包括有效载荷格式)。

[PRS_SOMEIP_00050] 对于SOME/IP报头中所有不兼容的更改,协议版本应该增加。如果基于旧协议版本的接收方不丢弃消息并不正确地处理它,则更改是不兼容的。

NOTE:协议版本本身是SOME/IP报头的一部分,因此协议版本在报头中的位置不能改变。

NOTE:仅影响有效负载格式的变更不应增加协议版本。

Interface Version [8 Bit]

[PRS_SOMEIP_00053] 接口版本应该是一个包含服务接口(service interface)的主版本Major version的8位字段。

Message Type [8 Bit]

[PRS_SOMEIP_00055] 消息类型字段用于区分不同类型的消息,应包含下表所示的值:

Number Value Description
0x00 REQUEST A request expecting a response (even void)
0x01 REQUEST_NO_RETURN A fire&forget request
0x02 NOTIFICATION A request of a notification/event callback expecting no response
0x80 RESPONSE The response message
0x81 ERROR The response containing an error
0x20 TP_REQUEST A TP request expecting a response (even void)
0x21 TP_REQUEST_NO_RETURN A TP fire&forget request
0x22 TP_NOTIFICATION A TP request of a notification/event callback expecting no response
0xa0 TP_RESPONSE The TP response message
0xa1 TP_ERROR The TP response containing an error

[PRS_SOMEIP_00701] 当没有错误发生时,常规请求(消息类型0x00)应由响应(消息类型0x80)响应。如果发生错误,将响应错误消息(消息类型0x81)。

也可以发送没有响应消息的请求message type 0x01; 为了更新值,存在一个回调接口(消息类型0x02)

[PRS_SOMEIP_00367] 消息类型的第三高位(=0x20)应该被称为TP-Flag,并且应该设置为1来表示当前的SOME/IP消息是一个消息段(Segment)。消息类型的其他位按本节中指定的方式设置。

Return Code [8 Bit]

[PRS_SOMEIP_00058] 返回代码用于指示请求是否成功处理。为了简化Header布局,每个消息都传输字段返回代码。特定消息类型允许的返回代码如下表所示:

Message Type Allowed Return Codes
REQUEST N/A set to 0x00 (E_OK)
REQUEST_NO_RETURN N/A set to 0x00 (E_OK)
NOTIFICATION N/A set to 0x00 (E_OK)
RESPONSE See Return Codes in [PRS_SOMEIP_00191]
ERROR See Return Codes in [PRS_SOMEIP_00191]. Shall not be 0x00 (E_OK)

Payload [variable size]

载荷字段携带参数,参数的序列化将在后续章节说明。

SOME/IP有效载荷字段的大小取决于所使用的传输协议。UDP SOME/IP负载应该在0到1400字节之间。限制在1400字节是以便允许协议栈的未来更改(例如改成IPv6或增加安全手段)由于TCP支持有效负载分段,因此自动支持更大的负载。

有效负载可以由事件的数据元素或方法的参数组成。

Endianess

[PRS_SOMEIP_00368] 报头应该按照网络字节顺序进行编码(big endian)。

[PRS_SOMEIP_00369] 载荷内参数的字节顺序应由配置来定义。

2_SOMEIP 报文_消息头相关推荐

  1. HTTP协议简介_请求消息/请求数据包/请求报文_响应消息/响应数据包/响应报文

    文章目录 HTTP 介绍 请求数据包/请求消息/请求报文 请求数据包解析 响应数据包/响应消息/响应报文 HTTP 介绍 概念:Hyper Text Transfer Protocol 超文本传输协议 ...

  2. Java包数据消息头消息尾_读Socket流时产生阻塞的解决方案(粘包拆包问题)

    转自:https://www.cnblogs.com/qhyuan1992/p/5385289.html 其实最终讨论的是TCP通信过程中的粘包拆包(半包)问题. 在用socket写一个服务器时遇到了 ...

  3. java socket发送定长报文_定长消息报文的组包与解包简单封装(Java实现)

    报文 组包 解包 在实际项目中经常会碰到不同系统之间的数据交换,有些是用webservice.有些则是使用发socket消息的方式,将需要发送的消息组装成特定格式的字符串或Xml格式的文件,再通过so ...

  4. Netty详解(七):Netty 编解码以及消息头编解码器

    1. MessagePack 概述 MessagePack是一个高效的二进制序列化框架,像JSON一样支持不同语言间的数据交换,速度更快,序列化之后的码流更小. MessagePacke优点 编解码高 ...

  5. Linphone android去电增加自定义SIP消息头的流程分析

    一.首先看一下如何在发起去电的sip请求中添加自定义的消息头 增加自定义头消息发方法,so已经提供了native方法, 发起呼叫的示例如下: LinphoneCallParams params = l ...

  6. 理解HTTP消息头【很完整,例子也很丰富】

    (一)初识HTTP消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头. 做过Socket编程的人都知道,当我 ...

  7. SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)

    1.  SpringMVC中设置消息头,例子如下: @RequestMapping(value="/hasOperatePrivilege") @ResponseBody publ ...

  8. 深入掌握JMS(六):消息头

    一个消息对象分为三部分:消息头(Headers),属性(Properties)和消息体(Payload).对于StreamMessage和             MapMessage,消息本身就有特 ...

  9. java消息头,Java网络编程从入门到精通:HTTP消息头字段

    Java网络编程从入门到精通:HTTP消息头字段 一.通用头字段 1. Connection 这个字段只在HTTP1.1协议中存在.它决定了客户端和服务器进行了一次会话后, 服务器是否立即关闭网络连接 ...

最新文章

  1. 逆变器的技术创新 让光伏电站更具发展前景
  2. Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file syst
  3. 【译】最大限度地降低多线程 C# 代码的复杂性
  4. Google高性能RPC框架gRPC 1.0.0发布
  5. Srs之HttpApi内部调用流程
  6. 深入浅出、通俗易懂的讲解CAN bus。
  7. C64x+中断控制器
  8. STM32F030F4P6单片机由外部时钟改为内部时钟
  9. java实现短信通知、验证码
  10. Java工程师岗位分析报告
  11. 反病毒技术及其发展趋势
  12. python paramiko ssh-解决强制修改密码登录问题
  13. 信息学奥赛一本通:1132:石头剪子布
  14. 关于Python将plt文件坐标转换为TXT文本
  15. java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了
  16. 【unity】几个常用脚本
  17. 自制合成孔径雷达(10) 声波和无线电测向
  18. 论述word加密与破解的“矛”与“盾”!
  19. 【Unity 框架】QFramework v1.0 使用指南 架构篇:11. 光速实现 EditorCounterApp 和 给主程看的开发模式 | Unity 游戏框架 | Unity 游戏开发
  20. 基于Java Web的大学生综合素质测评系统

热门文章

  1. 攻防世界-MISC-新手题解
  2. 书论86 周星莲《临池管见》
  3. mysql数据库中 索引的作用是什么意思_什么是数据库索引,索引有什么作用
  4. 真实案例分享:网络推广执行力超强名人
  5. java集合的学习笔记
  6. boost 管理存储交易 作为存储提供商 boostd
  7. VI下讨厌的Backspace键的处理
  8. armeabi v5 v7a v8a x86对应的so库详解
  9. SSID与WLANID的概念、区别和联系
  10. “Operatig System not found“解决办法