☞返回总目录
相关总结:《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;
}