【ARA COM API】Raw_Data_Streaming_ Interface

背景

大量数据(比如图像)的交互传输怎么做?

啊这,,,对AP来讲是个问题。我们需要在应用和传感器之间通过以太网传输很多的二进制数据(还需要高效率,比如为了ADAS传图像)。

我们知道 服务导向的通讯(service - oriented)比如亲儿子SOME/IP 及DDS(很火但是还没看到人用的)都不是很高效率。因为他们报文头都很长。
而且有的传感器就只能发原始的二进制数据。

这里AP提供了传输不具备数据类型格式的字节流的API。(通过"Raw data format"传输视频或者地图数据)。背后是网络socket。
这算是个异类,他不是Adaptive的,也就是说是静态的。在ara::com 的namespace之下但是不是服务中间件的一部分。

这套API有什么功能?

客户端和服务器都能用。两边都能收发。区别是只能让客户端主动找服务器建立链接。
服务器只能等待链接不能要求客户端建立链接。
客户端只能要求服务器建立链接不能等待服务器来来连接。

工作流程:

• As client

  1. Connect: Establishes connection to sensor

  2. ReadData/WriteData: Receives or sends data

  3. Shutdown: Connection is closed.

• As server

  1. WaitForConnection: Waits for incoming connections from clients

  2. ReadData/WriteData: Receives or sends data

  3. Shutdown: Connection is closed and stops waiting for connections.

代码实现

ara::com::raw下定义了一套类来进行交互。

client: ara::com::raw::RawDataStreamClient

server: ara::com::raw::RawDataStreamServer

构造函数:

RawDataStreamClient(const ara::com::InstanceSpecifier& instance);

RawDataStreamServer(const ara::com::InstanceSpecifier& instance);

参数是binding 的描述符。(老朋友了)。

析构函数:

~RawDataStreamClient();

~RawDataStreamServer();

Manifest

描述raw data 传输的部署信息.

  • RawDataStreamMapping 具体使用的传输方式

  • communicationConnector(EthernetCommunicationConnector) 定义IP地址。

  • socketOption 定义一些针对特定平台有效的socket配置(非标准的)

理论上讲,本API可以调动任何一层的传输协议来传输数据(现在只做了TCP和UDP)。(那我还不如自己直接用TCP/UDP呢。。哦 非AUTOSAR了。抱歉)

可用于子类 EthernetRawDataStreamMapping 的正整数参数:

  • multicastUdpPort

  • tcpPort

  • udpPort

上面三个参数至少要一个。

EthernetRawDataStreamMapping也有安全相关的参数:

tlsSecureComProps

类方法

超时参数

所有方法都带有一个可选的超时参数。类型是std::chrono::milliseconds。

如果不喂这个参数或者写0,类方法会在返回之前阻塞。

如果有参数,方法就会在超时后返回超时错误。

methods

所有Method都是同步API。返回结果如上节所述。

WaitForConnection

服务端专用。调用后就开始等待服务端连接。

Connect

Client 端专用。

这个方法初始化socket然后建立与TCP服务器的链接。

对于UDP的话,不会建立链接。输入和输出的包会被限制发往特定的地址。

ara::core:Result<void> Connect();
ara::core:Result<void> Connect(std::chrono::milliseconds timeout);
Shutdown

关闭通讯。
client和server都可以用。

ara::core:Result<void> Shutdown();
ara::core:Result<void> Shutdown(std::chrono::milliseconds timeout);
ReadData

从socket读取数据。读取字节数作为参数输入。延时可选。

ara::core::Result<ReadDataResult> ReadData(size_t length);
ara::core::Result<ReadDataResult> ReadData(size_t length, std::chrono::milliseconds timeout);

如果执行成功,返回一个结构体,包含一个指向读取数据的指针 和数据长度。

struct ReadDataResult{
ara::com::SamplePtr<uint8_t> data;
size_t numberOfBytes;
}

如果失败,返回ara::core::ErrorCode。通讯未建立或者超时。

WriteData

向socket写数据。

ara::core:Result<size_t> WriteData(ara::com::SamplePtr<uint8_t> data, size_t length);
ara::core:Result<size_t> WriteData(ara::com::SamplePtr<uint8_t> data, size_t length, std::chrono::milliseconds timeout);

如果调用成功,会返回发送成功的字节个数。如果失败,返回ara::core::ErrorCode。如上。

使用示例

RawDataStreamServer

// NOTE! For simplicity the example does not use ara::core::Result. 

#include "ara/core/instance_specifier.h" 
#include "raw_data_stream.h" 
int main() {
size_t rval;
ara::com::raw::RawDataStream::ReadDataResult result;

// Instance Specifier from model
 ara::core::InstanceSpecifier instspec
 {...}

 // Create RawDataStream Server instance
 ara::com::raw::RawDataStreamServer server{instspec};

 // Wait for incoming connections
 server.WaitForConnection();

 // Read data from the RawData stream in chunks of 10 bytes
 do{
 result = server.ReadData(10);
 rval = result.numberOfBytes;
 if (rval > 0) {
 // assumes the data is printable
 std::cout << "-->" << result.data.get() << std::endl;
 }
 } while (rval > 0);

 // Write data to the RawData stream in chunks of 16 bytes
 int i=0;
 do{
 std::unique_ptr<uint8_t> write_buf (new uint8_t[1024] \{....});
 rval = server.WriteData(std::move(write_buf), 16);
 ++i;
 }while (i<1000);

 // Shutdown RawDataStream connection
 server.Shutdown(); return 0;
 }

RawDataStreamClient

// NOTE! For simplicity the example does not use ara::core::Result. 

#include "ara/core/instance_specifier.h" 
#include "raw_data_stream.h" 
int main() {
size_t rval;
ara::com::raw::RawDataStream::ReadDataResult result;

// Instance Specifier from model
 ara::core::InstanceSpecifier instspec
 {...}

 // Create a RawDataStreamClient instance
 ara::com::raw::RawDataStreamClient client {instspec};

 // Connect to RawDataStream Server
 client.Connect();

 // Write data to RawData stream in chunks of 40 bytes
 int i=0;
 do {
 std::unique_ptr<uint8_t> write_buf (new uint8_t[1024]{.....});
 rval = client.WriteData(std::move(write_buf), 40);
 ++i;
 } while (i<1000);

 // Read data from the RawData stream in chunks of 4 bytes
 do {
 result = client.ReadData(4);
 rval = result.numberOfBytes;
 if (rval > 0){
 // assumes the data is printable
 std::cout << "-->" << result.data.get() << std::endl;
 }
 } while (rval > 0);

 // Shutdown RawDataStream connection
 client.Shutdown(); return 0;
 }

安全性

Currently the security protocols TLS, DTLS and IPSec are available.

Access control to Raw Data Streams can also be defined by the IAM.

All security functions are configurable in the deployment and mapping model of Raw Data Streaming Interface.

信息安全:raw data本身不含格式。如果有关信息安全,我觉得需要在Application里面加解密。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小羊苏C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值