☞返回总目录
相关总结:AutoSar AP CM原始数据流传输接口总结
5.6 原始数据流传输接口
5.6.1 介绍
自适应 AUTOSAR 通信管理基于面向服务的通信,这有利于实现具有面向服务设计的平台独立和动态的应用程序。但对于高级驾驶辅助系统(ADAS)应用程序,在应用程序和传感器之间通过以太网高效传输原始二进制数据流很重要,而面向服务的通信(如 SOME/IP、DDS)可能会产生不必要的开销,或者传感器只能发送原始二进制数据。原始数据二进制流 API 提供了发送和接收原始二进制数据流的方法,这些数据流是字节序列且无任何数据类型,能与车辆中的外部传感器高效通信(如传感器以 “原始数据” 格式提供视频和地图数据),通信通过使用套接字在网络上进行。从ara::com
架构角度看,原始数据流式传输 API 是静态的,不是生成的,它是ara::com
命名空间的一部分,但独立于ara::com
中间件服务。
5.6.2 功能描述
原始数据二进制流 API 可在客户端或服务器端使用,客户端和服务器端功能都允许发送和接收,唯一区别是服务器可等待连接但不能主动连接到客户端,客户端可连接到服务器(服务器已在等待连接)但不能等待连接。
从自适应 AUTOSAR 使用原始数据二进制流 API 需遵循以下顺序:
一、作为客户端:
- 连接(Connect):建立与传感器的连接(对于 UDP 不需要)。
- 读数据 / 写数据(ReadData/WriteData):接收或发送数据。
- 关闭(Shutdown):连接被关闭。
二、作为服务器:
- 等待连接(WaitForConnection):等待来自客户端的传入连接(对于 UDP 不需要)。
- 读数据 / 写数据(ReadData/WriteData):接收或发送数据。
- 关闭(Shutdown):连接被关闭并停止等待连接。
5.6.3 类和模型
5.6.3.1 类和签名
类ara::com::raw
定义了一个RawDataStream
类,用于通过使用套接字在网络连接上读取和写入二进制数据流。
- 客户端是类
ara::com::raw::RawDataStreamClient
的对象。 - 服务器端是类
ara::com::raw::RawDataStreamServer
的对象。
5.6.3.1.1 构造函数
RawDataStreamClient(const ara::com::InstanceSpecifier& instance);
RawDataStreamServer(const ara::com::InstanceSpecifier& instance);
5.6.3.2 析构函数
~RawDataStreamClient();
~RawDataStreamServer();
5.6.3.3 清单模型
清单定义了网络上原始数据流部署的参数。RawDataStreamMapping
定义了原始数据在EthernetRawDataStreamMapping
的子类中实际使用的传输方式,还定义了用于通信的本地和远程网络端点(IP 地址)和端口,以及是否使用单播或多播。目前仅支持 TCP 和 UDP,本地 IP 地址在属性communicationConnector
(类型为EthernetCommunicationConnector
)中定义,协议和端口在具有类型PositiveInteger
的EthernetRawDataStreamMapping
的以下属性中定义:
localTcpPort
。localUdpPort
。
前面两个属性中至少必须定义一个。socketOption
属性允许指定可能仅对特定平台有效的非标准套接字选项,被定义为字符串数组,可能的值是特定于平台和供应商的。
不同用例的远程凭证在属性RawDataStreamUdpCredentials
和RawDataStreamUdpTcpCredentials
中定义。有关详细信息,请参阅 TPS 清单 [2]。EthernetRawDataStreamMapping
还有一个关于安全性的属性,其中可以为原始数据流连接定义 TLS 安全通信属性:tlsSecureComProps
。
5.6.4 RawDataStream 类的方法
5.6.4.1 超时参数
RawDataStream
的客户端和服务器的所有Connect
(连接)/WaitForConnection
(等待连接)/Read
(读取)/Write
(写入)方法都有一个可选的超时输入参数,这个参数以毫秒为单位定义方法的超时时间,类型是std::chrono::milliseconds
。如果超时时间为 0 或未指定,操作将阻塞直到返回;如果指定的超时时间大于 0,并且执行操作的时间超过超时限制,方法调用将返回超时错误。
5.6.4.2 方法
该 API 方法是同步的,因此它们将阻塞直到方法返回或达到超时时间。
5.6.4.2.1 WaitForConnection(等待连接)
此方法仅在原始数据流的服务器端可用。原始数据流的服务器端准备好由客户端连接,在服务器中调用此方法之前,无法建立来自客户端的连接,仅在使用 TCP 时使用,对于 UDP,此操作不执行任何操作。
5.6.4.2.2 Connect(连接)
此方法仅在原始数据流的客户端可用。方法初始化套接字并建立与 TCP 服务器的连接,对于 UDP,不需要建立连接,并且该操作不执行任何操作,传入和传出的数据包被限制在指定的本地和远程地址。套接字配置在清单中指定,该清单通过构造函数中提供的InstanceSpecifer
访问。
ara::core::Result<void> Connect();
ara::core::Result<void> Connect(std::chrono::milliseconds timeout);
5.6.4.2.3 Shutdown(关闭)
此方法关闭通信,在原始数据流的客户端和服务器端都可用。
ara::core::Result<void> Shutdown();
5.6.4.2.4 ReadData(读取数据)
此方法从套接字连接读取字节,要读取的最大字节数由参数length
提供,超时参数是可选的。
ara::core::Result<ReadDataResult> ReadData(size_t length);
ara::core::Result<ReadDataResult> ReadData(size_t length,std::chrono::milliseconds timeout);
如果操作成功,它将返回一个结构体,其中包含指向包含读取数据的内存的指针和实际读取的字节数。
struct ReadDataResult
{std::unique_ptr<ara::core::Byte[]> data;size_t numberOfBytes;
};
在出现错误的情况下,它将从ara::com::RawErrorDomain
返回一个ara::Core::ErrorCode
:
- “Stream Not Connected”(流未连接):如果连接尚未建立(仅适用于 TCP)。
- “Interrupted By Signal”(被信号中断):操作被系统中断。
- “Communication Timeout”(通信超时):在超时到期之前没有读取到数据。
5.6.4.2.5 WriteData(写入数据)
此方法将字节写入套接字连接,数据作为带有data
参数的缓冲区提供,要写入的字节数由length
参数提供,也可以使用可选的超时参数。
ara::core::Result<size_t> WriteData(std::unique_ptr<ara::core::Byte[]> data,size_t length);
ara::core::Result<size_t> WriteData(std::unique_ptr<ara::core::Byte[]> data,size_t length,std::chrono::milliseconds timeout);
如果操作成功,它将返回实际写入的字节数。在出现错误的情况下,它将返回一个ara::Core::ErrorCode
:
- “Stream Not Connected”(流未连接):如果连接尚未建立(仅适用于 TCP)。
- “Interrupted By Signal”(被信号中断):操作被系统中断。
- “Communication Timeout”(通信超时):在超时到期之前没有写入数据。
5.6.5 安全性
原始数据流通信可使用 TCP 和 UDP 传输,因此需要不同的安全机制来保护流通信。目前可用的安全协议有 TLS、DTLS、IPSec 和 MACsec。对原始数据流的访问控制也可由 IAM(身份与访问管理)定义。所有安全功能在原始数据流式接口的部署和映射模型中可配置。如果传感器数据必须满足安全要求,则必须使用安全扩展。
5.6.6 安全性
RawDataStream
接口仅传输没有任何数据类型信息的原始数据,所以原始数据流接口不能提供任何数据保护,如端到端(E2E)保护。如果需要,必须在使用RawDataStream
接口的应用程序中实现。
5.6.7 给实现者的提示
原始数据流式接口的实现应该独立于底层套接字 API(例如 POSIX 套接字)。