4.1.2 Header 头部

报文头的结构应包括

  • Message ID(Service ID/method ID)[32bit] //即报文ID(号)占4字节 这里提示1字节8bit哦 字节的英语是byte 位的英语是bit 注意区分)

  • Length 32bits 长度

  • Request ID(client ID/session ID) [32 Bits] //请求ID

  • Protocol version [8Bits] //协议 ID

  • Interface Version [8 Bits] //接口ID

  • Message Type [8 Bits] //报文类型

  • Return Code [8 Bits] //返回代码

//以上提到的英文单词必须记住哦,不然工作中别人说啥你都不清楚,也注意一下发音

如下图所示

//图中payload是负载 长度可变(因为报文内容长度不是固定的,比如你发微信给别人,文字信息就可以理解为这里的负载payload)

//covered by length 是说图中第二行length 的长度说的是从这段内容的长度

如果应用了端到端(E2E)加密通信保护,则端到端加密报头放置在返回码之后,这取决于为端到端加密报头选择的偏移值。默认偏移值是64位,它将E2E报头完全放在返回码和有效载荷之间。

如下图所示 //对比可以看出,有E2E的在payload前会有E2E的header(头部)

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

//比如说someip报文:0x1234 0x5678 0x0000 0x0001 ....... 0x1234是service ID 0x5678 是methodid

// 0x0000 0x0001 是length

4.1.2.1Message ID [32 Bit]

message ID 应该是32位,用来标明以下内容:

  • 一个应用的RPC(远程调用)调用方法

  • 明确事件

注意:MessageID的分配取决于用户/系统设计人员。但是,Message ID被假定为整个系统(即车辆)的唯一标识。

4.1.2.2 Method ID [15 Bit]

方法调用的Message ID需要结构化在 2^16个service(2的16次方因为他占16位) 2^15(2的15次方因为他占15位)个method 的ID中,如表所示

4.1.2.3 Event ID [15 Bit]

事件组是服务内field的事件(event)和通知(notification) 事件的逻辑分组,以便允许订阅。

事件和通知使用RPC传输,事件的结构如表所示

//大写加粗哦 event ID 前面1bit是1 methodID前面的1bit是0

不能使用空事件组。

事件(event)和字段通知器(field notifier)被映射到至少一个事件组。

4.1.2.4 Length [32 Bit]

长度字段应该包含字节长度为,从request ID/clientID开始,直到SOME/IP消息结束。

4.1.2.5 Request ID [32 Bit]

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

RequestID对于提供者和订阅者组合(即一个订阅)应该是唯一的

在生成response message时,提供者(服务端哦)应该将请求ID从请求复制到response message里。

注意:这允许订阅者将响应映射到已发出的请求,即使有多个未完成的请求。

在响应到达或预期不再到达(超时)之前,不能重用请求id。

Structure of the Request ID

在AUTOSAR中,请求ID应由客户端ID和会话ID组成,如表所示

注意:

这意味着ECU的实现者可以根据实现的需要定义client- id,而提供者不需要知道这种布局或定义,因为他只需要在响应中复制完整的Request-ID

client ID是ECU内调用客户端的唯一标识符。client ID允许ECU区分多个客户端对同一方法的调用。

session ID(会话ID)是一个唯一的标识符,允许区分来自同一发送方的连续消息或请求。//比如我给小明打电话分为第一次、第二次

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

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

如果会话处理处于活动状态,则session ID应设置为范围[0x1, 0xFFFF]

在会话处理处于活动状态的情况下,session ID应该根据各自的用例增加(关于专用用例的详细信息包含在单独的规范项中(例如,

请求/响应方法应该使用带有会话id的会话处理。session ID应该在每次调用后递增。

当session ID达到0xFFFF时,它将从0x01重新开始

对于请求/响应方法,如果响应的Session ID与请求的Session ID不匹配,订阅者必须忽略响应

对于通知消息,如果会话处理不活跃,接收方应该忽略会话ID。

如果会话处理是活动的, 对于通知消息,接收方应该根据各自的用例来处理会话ID(关于专用用例的详细信息包含在单独的规范项中(例如,[PRS_SOMEIP_00741] 后面有提到)。

4.1.2.6 Protocol Version [8 Bit]

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

协议版本应该是一个包含SOME/IP协议版本的8位字段。

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

注意:消息处理和错误处理在4.2.6.3章中定义(错误处理概述

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

协议版本为1 //目前 protocol version 都写1就行

4.1.2.7 Interface Version [8 Bit]

接口版本应该是一个8位字段,包含服务接口的主要版本。

4.1.2.8 Message Type [8 Bit]

MessageType字段用于区分不同类型的消息,应该包含如下表所示的值

Number

Value

Description

0x00

REQUEST

期待回复的请求 (even void)

0x01

REQUEST_NO_RETURN

一个FF请求

0x02

NOTIFICATION

没有响应的通知/事件回调请求

0x80

RESPONSE

回复信息

0x81

ERROR

回复包含一个错误

0x20

TP_REQUEST

A TP request expecting a response (even void) //SOME/IP-TP报文 期待回复的请求

0x21

TP_REQUEST_NO_RETURN

A TP fire&forget request //SOME/IP-TP报文 一个FF请求

0x22

TP_NOTIFICATION

A TP request of a notification/event call back expecting no response //SOME/IP-TP报文 没有响应的通知/事件回调请求

0xa0

TP_RESPONSE

The TP response message //SOME/IP-TP报文的回复报文

0xa1

TP_ERROR

The TP response containing an error //SOME/IP-TP报文的回复报文 包含错误

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

也可以发送没有响应消息(消息类型0x01)的请求。为了通过通知更新值,存在一个回调接口(消息类型0x02)。 //注意 :有回调和没回调的区别

消息类型(=0x20)的第三高位称为TP-Flag,应该设置为1以表示当前的SOME/IP消息是一个segment。消息类型的其他位在本节中指定。

消息类型请求(0x00)的段具有消息类型(0x20),消息类型响应(0x80)的段具有消息类型(0xa0),依此类推。详见(4.2.1.4章)

4.1.2.9 Return Code [8 Bit]

返回码应使用,表示请求是否被成功处理。为了简化报头布局,每条消息都传输字段ReturnCode。

表4.6显示了特定消息类型允许的返回码返回码应使用,表示请求是否被成功处理。为了简化报头布局,每条消息都传输字段ReturnCode。表4.6显示了特定消息类型允许的返回码

4.1.2.10 Payload [variable size]

在有效载荷字段中携带参数。参数的序列化将在下一节中说明。

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

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

4.1.3 Endianess

SOME/IP报头应按网络字节顺序(大端序)编码。

payload内参数的字节顺序应由配置定义。 //即开发人员自己定

以上做个总结 通信协议就像写信一样,或者发微信吧,message ID就像对方的微信号,RequestID、protocol ID....就像相当于自己的微信号,必须知道双方的“微信号”你才能发信息 ... 所有的ID都是一个作用,为了让双方能理解对方的信息,payload就是信息,后面讲到的序列化就是payload应该怎么填充,比如写信开头必须先写“收件人名字你好”等等。length就是说你这封信要写多长,因为写太多了“信封可能容纳不下”(即UDP协议限制的最大负载字节数)

好的继续吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

whs_csdn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值