☞返回总目录
相关总结:《AUTOSAR 自适应应用中原始数据流传输的使用方法》总结
6.4 原始数据流传输的使用方法
本章描述了原始数据流(RawDataStreams)在 AUTOSAR 自适应应用程序中的使用方法。
目前,原始数据流传输在单播 / 多播以及 UDP/TCP 连接的配置方面支持四个用例。这些用例在 [1:AUTOSAR_SWS_CommunicationManagement] 中的 “Raw Data Streaming” 章节中进行了描述。最常见的用例是 “1:1 TCP 单播”,因此在本教程中以此为例。
6.4.1 序列图
图 6.10 展示了在客户端使用原始数据流传输 API 时的序列。
图 6.11 展示了在服务器端使用原始数据流传输 API 时的序列。
注意,客户端发送数据和服务器读取数据的序列也是有效的。
6.4.2 使用方法
由于原始数据流式传输提供了一个应用程序编程接口(API),所以必须要有原始数据流服务器(RawDataStreamServer)或者原始数据流客户端(RawDataStreamClient)的实例,并且要按照 6.4.1 中所描述的序列来调用这些方法。
6.4.2.1 作为服务器的使用示例
代码 6.12 展示了如何使用 RawDataStreamServer 进行发送和接收数据。
// 注意!为了简单起见,这个例子没有使用 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;// 从模型中获取实例说明符ara::core::InstanceSpecifier instspec {...};// 创建 RawDataStream Server 实例ara::com::raw::RawDataStreamServer server{instspec};// 等待传入连接server.WaitForConnection();// 从原始数据流中以 10 字节为一块读取数据do{result = server.ReadData(10);rval = result.numberOfBytes;if (rval > 0) {// 假设数据是可打印的std::cout << "-->" << result.data.get() << std::endl;}} while (rval > 0);// 向原始数据流中以 16 字节为一块写入数据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);// 关闭原始数据流连接server.Shutdown(); return 0;
}
6.4.2.2 作为客户端的使用示例
代码 6.13 展示了如何使用 RawDataStreamClient 进行发送和接收数据。
// 注意!为了简单起见,这个例子没有使用 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;// 从模型中获取实例说明符ara::core::InstanceSpecifier instspec {...};// 创建一个 RawDataStreamClient 实例ara::com::raw::RawDataStreamClient client {instspec};// 连接到 RawDataStream 服务器client.Connect();// 向原始数据流中以 40 字节为一块写入数据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);// 从原始数据流中以 4 字节为一块读取数据do {result = client.ReadData(4);rval = result.numberOfBytes;if (rval > 0){// 假设数据是可打印的std::cout << "-->" << result.data.get() << std::endl;}} while (rval > 0);// 关闭原始数据流连接client.Shutdown(); return 0;
}