此文标准来源于AUTOSAR_SWS_SOMEIPTransportProtocol.pdf(R21-11)
1. 前言
SOME/IP – Scalable service-Oriented MiddlewarE over IP,基于IP的可扩展面向服务中间件; SWS – Software specification,软件规范;
2. 简介
SOME/IP TP规范包含功能、API、配置。其主要任务是对SOME/IP数据包进行分段/分包/分片,在接收端的数据重组。 SOME/IP TP的限制:没有实现重试机制,不能对接收到的SOME/IP段进行重新排序。主要是为了节约接收方运行时间和内存资源。 SOME/IP TP与其他模块的依赖关系:
- AUTOSAR PDU Router: 将PduR用于两个方向,即传输路径和接收路径。
- AUTOSAR 默认错误跟踪程序: 为了能够报告开发错误,SOME/IP TP模块必须能够访问默认错误跟踪程序的错误挂钩。
3. 功能规范
SOME/IP TP模块与PDU路由器进行双向交互,如下图所示:
3.1 SOME/IP报文分段
3.1.1 字段定义
注:当TP Flag为1时,才会有offset、RES、其他标志; SOME/IP报文格式,如下图所示: TP Flag位置,如下图所示: offset: 28bit,根据之前发送/接收的SOME/IP段的有效载荷长度,在每个发送/接收段之后,包含的值增加;该字段以16进制为单位。 示例:若offset = 92, 表示当前已传输1472个有效负载字节数。 保留字段: 3bit,应该置为0。 More Segments: 1bit,表示是否还有分段数据。
3.1.2 分段示例
5571字节的有效负载,将被分割为5个连续的SOME/IP段,原始数据如下所示: 分段后的头设置,如下图所示:
3.2 SOME/IP分段发送
3.2.1 分段大小
- 每个分段的SOME/IP消息的大小应由SOME/IP报头的12个字节和有效负载字节本身组成;
- 分段SOME/IP消息的每个有效负载(最后一个除外)必须是16字节的倍数(最后一段可能由奇数有效载荷或不可以被16分割的有效载荷组成);
3.2.2 SOME/IP头
上层需要接收字段值,如下所示:
- Request ID [32 bit]
- Protocol Version [8 bit]
- Interface Version [8 bit]
- Message Type [8 bit]
- Return Code [8 bit]
什么叫做计算值、衍生值、导出值?
SOME/IP TP模块添加字段值,如下所示:
- Offset [28 bit]
- Reserved bits [3 bit]
- More Segment Flag [1 bit]
若SOME/IP报文不需要分段,则直接使用SOME/IP原始报文的头部; 第一个分段的offset = 0; 保留位应静态设置为 000; 除最后一个段的More Segments标志为0,其余分段的More Segments都为1;
3.2.3 SOME/IP段发送
发送数据前,应该检测数据是否已经分段结束; 发送数据前,应该进行数据长度检测,保证数据长度符合传输要求,否则应该进行分段处理; 发送数据前,应该检测是否按照最大可能大小进行分段; 发送多个数据段时,应以相同的时间间隔,去除发送数据包时的乱序与抖动;
3.2.4 分段终止
若PDU ID被占用,不应该继续进行当前段的分解,并抛出相应的错误码; 若是可用缓冲区不满足如下条件,分段将被终止:
- 大于或等于16字节;
- 大于分段大小空间使用要求;
若发送第一个分段数据失败,则应该停止当前分段行为,并抛出响应错误码;
3.3 SOME/IP分段组装
收到最后一个分段后,应该做接收完成的应答; 接收到分段信息后,应提取下列信息:
- 请求ID[32位]
- 协议版本[8位]
- 接口版本[8位]
- 消息类型[8位]
- 返回码[8位]
- 偏移量[28位]
- 保留位[3位]
- 更多段标志[1位]
接收到未分段的消息后,应提取下列信息: - 请求ID[32位]
- 协议版本[8位]
- 接口版本[8位]
- 消息类型[8位]
- 返回码[8位]
应该对分段报文、未分段报文做合理的管理
3.3.1 offset = 0
接收到首段数据后,应将重组相关的字段数据做管理; 接收到首段数据后,应该设置端接收超时时钟; 接收到首段数据后,应该为后续数据的接收分配合理的空间; 数组组装完成后,应该先将SOME/IP报头信息传给SOME/IP TP上层,后将组装的SOME/IP消息的有效载荷传给SOME/IP TP上层,第一包数据内容如下:
- 请求ID[32位]
- 协议版本[8位]
- 接口版本[8位]
- 消息类型[8位]-参见[SWS_SomeIpTp_00028]
- 返回码[8位]
在将组装好的SOME/IP报头传递给用户之前,SOME/IP TP模块应将消息类型中包含的TP标志设置回“0”; SOME/IP TP模块应分别存储已传递到上层的每个PDU ID的有效负载字节数;
3.3.2 offset > 0
如果在偏移量字段大于0的情况下成功接收到某个/IP段,则某个/IP TP模块应将接收到的某个/IP头字段与第一个段接收到的存储的某个/IP头字段的值进行比较(即偏移量设置为0):
- 请求ID[32位]
- 协议版本[8位]
- 接口版本[8位]
- 消息类型[8位]
- 返回码[8位]
若是接收报文信息吻合,应重启接收的超时计时器,继续后续数据的接收; 每接收一个分段,都应该将有效负载长度与报文头的长度字段做比较; 如果Offset Field value>0,则只向上层提供有效负载字节(也就是说第一个段接收后要传递SOME/IP头信息,后续段只传有效数据); 接收到尾段后,应关闭接收超时计时器,并将有效负载数据传递到上层;
3.3.3 组装终止
当接收超时时,应终止当前的数据重组,并抛出相应错误信息; 当在没有重组任务时,接收到非首段的分段数据,该数据应该被忽略,并抛出相应错误信息; 当模块检测到错误时,应返回接收错误信息,并重置接收超时计时器; 常见的中断原因,列举如下:
- 开启数据接收后,且会话一直保持活动状态,如接收数据的TP Flag为1;
- 同一个分段数据的报头信息不一致;
- 若非首段数据的有效负载长度值不可以被16整除;
- 长度字段与有效负载长度值不一致;
- 接收字段的顺序不正确;
- 报文存储空间申请失败;
- 建立会话连接失败;
3.4 错误分类
开发错误,如下图所示: 运行错误,如下图所示:
4. API规范
这是AUTOSAR自己的代码实现,若不需要可以不看。
4.1 导入类型
4.2 类型定义
4.3 函数定义
1.版本信息获取(SomeIpTp_GetVersionInfo) 2.初始化(SomeIpTp_Init) 3.数据传输(SomeIpTp_Transmit) 此接口,必须在初始化接口之后调用;
4.4 回调函数
1.触发回调(SomeIpTp_TriggerTransmit) 如果给定的PduInfoPtr->SDULENGHT小于SOME/IP-TP段的计算大小(考虑报头和有效载荷)。 2.消息到来(SomeIpTp_RxIndication) 3.接收确认(SomeIpTp_TxConfirmation)
4.5 预定功能
1.发送函数(SomeIpTp_MainFunctionTx) 2.接收函数(SomeIpTp_MainFunctionRx)
4.6 外部接口
1.强制接口
2.选项接口
3.配置接口
5. 时序图
1.接收时序图 2.发送时序图
6.配置规范
略
参考文章
AUTOSAR官网
如有错误,欢迎指正,也欢迎相互交流学习,本人属于菜鸡。
|