CP DDS协议规范的解读

CP DDS协议规范的解读

Specification of Data Distribution Service in Classic Platform AUTOSAR CP R22-11是2022年释放的规范

一些名词的解释

名词 解释
RTPS Real Time Publish Subscribe Protocol (实时发布订阅协议)
OMG Object Management Group (对象管理组)
QoS Quality-of-Service 服务质量
DDS Data Distribution Service 数据分发服务

1.简介和功能概述

DDS–Data Distribution Service AUTOSAR Basic Software module (Dds BSW)

  • DDS是一个中间件
  • API来自OMG

2. 与其他模块交互

  1. RTE (BSW Scheduler)–用RTE对DDS进行调度
  2. Pdu Route–作为中间层
  3. StbM–会用到StbM_GetCurrentTime() 这个API ,用来带时间戳
  4. Default Error Tracer–用来报development errors
  5. Crypto Service Manag–为了支持安全功能
  6. Cyclic Redundancy Check–循环冗余检验,用CRC库

3.Function(对应规范第七章)

3.1简述

成熟中间件的特征:
• Serialization 序列化
• Data filtering 数据过滤
• Data reordering 数据重排
• Data persistency 数据持久化
• Data re-transmission 数据重传
• Security 安全
• E2E protection 端到端保护
• PDU Router interaction PDU路由器交互

传输层提供一组适合于实现DDS通信的连接。例如,让我们考虑一个简单的SW-C,它使用一些DomainParticipant下的一些Publisher/DataWriters。不需要在DDS级别的本地ECU上创建Subscribers/DataReaders配置,但传输层应确保它们可由较低层的PDU访问。类似的事情也会发生在接收端,远程传输配置应保证接收到的PDU到达正确的DataReaders/Subscribers和订阅应用程序。

传输路径
DDS数据传输路径

3.2安全机制

实现DDS-Security的目的是保证消息认证、数据完整性和组认证。可以在配置时启用或禁用安全机制。如果启用,则必须在预编译时静态配置所有安全参数。如果配置了,则添加整个RTPS消息的消息验证码(MAC)。
身份验证是在 Domain Participant这个级别完成的,而不是P/S或是DW/DR
Counters, CRCs, QoS policies都是DDS固有的安全机制
可能会存在的一些传输问题:

  • 重复、丢失、插入、不正确的顺序、仅由一部分接收者接收的来自发送者的信息以及阻止对通信信道的访问
  • 信息延迟,阻止通信通道的访问
  • 伪装或错误的信息寻址:DDS安全身份验证插件
  • 信息损坏,不对称信息从发送者发送到多个接收者
  • 所有问题的翻译:将所有问题都告诉Det

3.3General Requirements

需要保证Topic name的唯一性

3.3.1 Communication requirements
  • No data serialization:在调用DDS BSW模块之前,不应执行数据序列化或数据转换。
    在配置验证期间,应检查RTE配置。如果有DDS BSW模块关联到了Transformer,会报错。

  • DDS Data serialization:发送时需要进行数据的序列化,接收端进行反序列化

  • RTPS compliance DDS给到下层PduR的数据需要符合RTPS协议

  • DDS标准的序列化/反序列化规则 根据DDS的标准进行,可以参考规范的第7.4.3.5

  • DDS可以进行序列化的基础类型 可以参考规范的第7.2.2.2
    在这里插入图片描述
    在这里插入图片描述

  • DDS对于枚举类型进行序列化 可以参考规范的第7.2.2.4.1.1

  • DDS对于数组类型进行序列化

  • DDS对于结构体进行序列化

  • DDS对于UNION数据类型进行序列化

  • DDS对于指针进行序列化

  • 字符串的编码格式和字符顺序

3.3.2 Security requirements
  • DDS-security: 使用DDS-Security Specification实施
  • MAC的使用: 为了保证数据的完整性,在DomainPaeticipant这个层级就加入了MAC,使用对称密钥算法计算。最终传输的信息需要能够被 DDSI-RTPS传输。
  • CSM库的使用: 计算MAC,核对收到的消息的MAC。在发送方,添加MAC的结果到所有DomainParticipants的每一条消息。在接收方,Dds会核对 DdsDomainParticipantCsmVerifyJob的结果
  • CSM job configuration DdsDomainParticipantCsmAuthenticateJob和DdsDomainParticipantCsmVerifyJob是提前配置好的。DdsDomainParticipantCsmAuthenticateJob用来调 CSM_MacGenerate,DdsDomainParticipantCsmVerifyJob用来调CSM_MacVerify。
    (更多关于配置的细节,参考DdsCryptoInfo)
  • **CSM key configuration:**用的同一个key,对于每一个DomainParticipant,CSM都会用同一个key进行配置。
    (更多关于配置的细节,参考DdsCryptoInfo)
  • MAC calculation failure 如果发生这个错误会调用Det_ReportRuntimeError() ,错误是DDS_E_CSM_LIBRARY_ERROR,并且丢弃掉这条信息。
    同时Dds会调用PduR_DdsTxConfirmation,回复E_NOT_OK。
  • MAC check failure在接收端,MAC的核对失败,会调用Det_ReportRuntimeError() ,错误是DDS_E_CSM_CHECK_FAILED,并丢弃掉这条消息。
3.3.3 Safety requirements
  • Repetition or Insertion of Information: DDS的submessage包含了counters这个信息,就是为了应对重复或插入信息问题的发生。如果在接收端收到两个counters一样的数据,会丢弃掉一个数据,并且会调用Det_ReportRuntimeError() ,报错误:DDS_E_SAMPLE_REJECTED
  • **Loss or Incorrect sequence of Information :**同样是利用了counters这个信息,在接收端,如果收到非连续性的counter,会丢弃掉一个数据,并且会调用Det_ReportRuntimeError() ,报错误:DDS_E_SAMPLE_LOST
  • Delay of Information: Dds使用QoS监控超时,比如 DEADLINE, LATENCY_BUDGET, LIFESPAN ,TIME_BASED_FILTER 。在信息发送端,如果时间限制未填充Dds会丢弃掉该数据,调用Det_ReportRuntimeError()报错:DDS_E_SENDER_TIMING_MISSED 。在信息接收端,如果时间限制未填充Dds会丢弃掉该数据,调用Det_ReportRuntimeError(),报错:DDS_E_RECEIVER_TIMING_MISSED
  • Corruption of Information: Dds使用CRC校验来保证防止信息错误损坏的安全机制。
  • **CRC check failure:**在信息接收端,如果CRC校验失败,Dds会调用Det_ReportRuntimeError(),报错:DDS_E_CRC_CHECK_FAILED

3.4 Error Classification

3.4.1 Development Errors

Dev Error

3.4.2 Runtime Errors

runtime error

4.API(对应规范第八章)

4.1 引入的头文件

header files

4.2 Type定义

Dds_ConfigType:一个结构体

包含一些初始化的数据。放在Dds.h中。

4.3 Function 定义

4.3.1 Dds_Init

void Dds_Init (const Dds_ConfigType* Dds_ConfigPtr)

入参:

Dds_ConfigPtr–config的指针

描述:

初始化接口和变量

功能需求:

  • 需要根据配置项初始化所有模块依赖的变量和常量
  • 需要将所有实体变成“enabled”状态
  • 需要清空所有内置buffers

4.3.2 *Dds_GetVersionInfo *

void Dds_GetVersionInfo (Std_VersionInfoType* versioninfo)

出参:

versioninfo的指针,指向的应该是一个结构体(保存了所有的version信息) 功能需求:

功能需求:

  • 检查指针是不是Null 指针if (versioninfo = NULL_PTR)
  • 如果是Null指针,报错:DDS_E_PARAM_POINTER

4.3.3 Dds_Transmit

Std_ReturnType Dds_Transmit (PduIdType TxPduId, const PduInfoType* PduInfoPtr)

入参:

TxPduId–标识要传输的PDU
PduInfoPtr–PDU的长度, MetaData的指针

返回值:

E_OK: Transmit request has been accepted.
E_NOT_OK: Transmit request
has not been accepted

功能需求:

  • Dds模块能够管理内部buffer,存储上层传来的PDU,buffer的大小能够被配置
  • 错误检测:调用Det_ReportError
    • Dds module is not initialized (DDS_E_UNINIT)
    • PduInfoPtr equals NULL_PTR (DDS_E_PARAM_POINTER).
    • Invalid upper layer TxPduId (DDS_E_U_PDUID_INVALID).
    •调用API:PduR_DdsTxConfirmation时回复是E_NOT_OK
  • DDS_E_U_PDUID_REJECTED,上层模块请求未被接受,且内部的buffer满了,调用API:Det_ReportRuntimeError,报错DDS_E_U_PDUID_REJECTED,回复E_NOT_OK。
    调用API:PduR_DdsTxConfirmation时回复是E_NOT_OK
  • 回复 E_OK:上层请求被接受,能够存储上层的PDU到内存,更新内存的offset,指向下一次存内存的地址,返回E_OK

4.4 Callback 定义

4.4.1 Dds_RxIndication

每个Dds接收端口都会调该回调函数,告诉Dds接收PDU成功,通知Dds来处理

void Dds_RxIndication (PduIdType RxPduId, const PduInfoType* PduInfoPtr)

入参:

RxPduId:收到的PDU的ID
PduInfoPtr:PDUinfo的指针

功能需求:

  • Dds模块能够管理内部buffer,存储下层传来的PDU,buffer的大小能够被配置
  • 错误检测:调用Det_ReportError
    • Dds module is not initialized (DDS_E_UNINIT)
    • PduInfoPtr equals NULL_PTR (DDS_E_PARAM_POINTER).
    • Invalid lower layer RxPduId (DDS_E_L_PDUID_INVALID).
  • DDS_E_L_PDUID_IGNORED:下层模块不能接收或内部buffer满了,调用Det_ReportRuntimeError,报错:DDS_E_L_PDUID_IGNORED
  • 正确的状态:如果下层PDU能够被正确接收,保存下层PDU到内部buffer

4.4.2 Dds_TxConfirmation

void Dds_TxConfirmation (PduIdType TxPduId,Std_ReturnType result)

入参:

RxPduId:发送的PDU的ID
result:
         E_OK: The PDU was transmitted.
         E_NOT_OK: Transmission of the PDU failed.

功能需求:

  • 错误检测:调用Det_ReportError
    • Dds module is not initialized (DDS_E_UNINIT)
    • Invalid lower layer TxPduId (DDS_E_L_PDUID_INVALID).
  • PduR_DdsTxConfirmation 会调用PduR_DdsTxConfirmation ,和PduR_DdsTxConfirmation 的入参和返回值一致

4.4.3 Dds_TriggerTransmit

补充一点小知识:SDU和PDU的区别

Std_ReturnType Dds_TriggerTransmit (PduIdType TxPduId,PduInfoType* PduInfoPtr)

入参:

TxPduId:发送的PDU的ID

inout的参数:

PduInfoPtr:指向SDU被复制的地方,能够反馈SDU的长度

功能描述:

上层模块会确认数据是否能够放到buffer中去,如果够放,会将data拷贝到buffer中去,并更新实际拷贝data的长度,如果不行就返回E_NOT_OK。

功能需求:

  • 错误检测:调用Det_ReportError
    • Dds module is not initialized (DDS_E_UNINIT)
    • PduInfoPtr equals NULL_PTR (DDS_E_PARAM_POINTER).
    • Invalid lower layer TxPduId (DDS_E_L_PDUID_INVALID).
  • Dds会复制PDU传输buffer到PduInfoPtr->SduDataPtr 给的PDUbuffer中去,同时更新PduInfoPtr->SduLength
  • 错误检测:当Dds_TriggerTransmit()有请求,但当前PDUID的Dds_TriggerTransmit()处理未完成,调用Det_ReportRuntimeError() ,报错:DDS_E_L_PDUID_IGNORED
  • 只能被下层模块调用。在配置项验证的过程中,LdCom的配置需要被验证,如果有哪个属于LdComTxTriggerTrasmit的PDU为空,验证时会返回error

4.5 Scheduled functions 定义

本章所有的函数都是被BSW直接调度

4.5.1 Dds_RxMainFunction

void Dds_RxMainFunction (void)

功能需求:

  • 应检查内部接收缓冲区中是否存在任何PDU。如果存在,则DDS_RxMainFunction()将对接收的数据执行所有DDS中间件内容(反序列化、QoS管理、safety and security tasks)。
  • 错误检测: call the Det_ReportRuntimeError() with the
    DDS_INTERNAL_ERROR code, drop received data and return
  • 会寻找合适的readers管理接收到的数据,用上层PDU的结果作为入参调用PduR_SoAdRxIndication

4.5.2 Dds_TxMainFunction

void Dds_TxMainFunction (void)

功能需求:

  • 应检查内部发送缓冲区中是否存在任何PDU。如果存在,则DDS_RxMainFunction()将对发送的数据执行所有DDS中间件内容(反序列化、QoS管理、safety and security tasks)。
  • 错误检测: call the Det_ReportRuntimeError() with the
    DDS_INTERNAL_ERROR code, drop received data and return,同时调PduR_DdsTxConfirmation ,result为E_NOT_OK,丢弃收到的 数据并返回
  • 会寻找合适的writers管理发送的数据,用下层PDU的结果作为入参调用 PduR_DdsTransmit

4.6 外部接口

mandatory

optional

5.传输时序图(对应规范第九章)

5.1 发送数据

数据发送:
transmission
数据发送的确认:
transmission confirmation

5.2 数据的接收

reception

猜你喜欢

转载自blog.csdn.net/weixin_42299076/article/details/129592491
cp
今日推荐