Raw Data Access
SomeIpGetData
函数
用于查询SOME/IP消息的原始数据。
语法
capl
dword SomeIpGetData( dword messageHandle, dword bufferLength, char buffer[] );
dword SomeIpGetData( dword messageHandle, dword bufferLength, byte buffer[] );
dword SomeIpGetData( dword messageHandle, dword bufferLength, struct buffer[] );
参数
- messageHandle :接收的SOME/IP消息句柄(参见
OnSomeIpMessage)。 - bufferLength:缓冲区大小(字节)。
- buffer:数据将被复制到该缓冲区。
返回值
- 0 :发生错误,可通过
SomeIpGetLastError函数获取错误详情。 - >0:成功复制的字节数。
可用性
- 起始版本:8.1
- 适用范围:仅以太网
- 测量设置:---
- 仿真/测试设置:•
示例
capl
void OnSomeIpMessage( DWORD messageHandle )
{
BYTE buffer[200];
BYTE bufferMsg[200];
DWORD count;
DWORD size;
CHAR dest[200];
count = 0;
// 检查是否为非服务发现消息
if(SomeIpGetMessageId(messageHandle) != 0xFFFF8100)
{
// 检查是否为通知消息
if(SomeIpGetMessageType(messageHandle) == 0x2)
{
write("SOME/IP 通知消息已接收!\n");
// 将完整消息数据(包括头部和 payload)写入输出窗口
size = SomeIpSerializeMessage(messageHandle, elcount(bufferMsg), bufferMsg);
write("消息大小: %d", size);
snprintf(dest, elcount(dest), "%s", "");
for(count = 0; count < size; count++)
{
snprintf(dest, elcount(dest), "%s\r\n%02x", dest, bufferMsg[count]);
}
write("序列化消息: %s", dest);
// 仅将消息 payload 写入输出窗口
size = SomeIpGetData(messageHandle, elcount(buffer), buffer);
write("Payload 大小: %d", size);
snprintf(dest, elcount(dest), "%s", "");
for(count = 0; count < size; count++)
{
snprintf(dest, elcount(dest), "%s %02x", dest, buffer[count]);
}
write("序列化 Payload: %s\n", dest);
} // if (通知消息检查)
} // if (非服务发现消息检查)
}
SomeIpSerializeMessage
函数
将SOME/IP消息序列化为数据缓冲区,包含SOME/IP头部和payload。
注意
若SOME/IP消息配置无效(例如,长度字段值错误或payload内容无效),序列化时不会修正消息,将原样传递。
语法
capl
dword SomeIpSerializeMessage( dword messageHandle, dword bufferLength, CHAR buffer[] );
dword SomeIpSerializeMessage( dword messageHandle, dword bufferLength, BYTE buffer[] );
dword SomeIpSerializeMessage( dword messageHandle, dword bufferLength, struct buffer[] );
参数
- messageHandle :消息句柄(例如通过
SomeIpCreateMessage创建)。 - bufferLength:缓冲区长度(字节)。
- buffer:用于存储序列化SOME/IP消息的数据缓冲区。
返回值
- >0:成功复制的字节数。
- 0 :发生错误,可通过
SomeIpGetLastError函数检查错误详情。
可用性
- 起始版本:8.1 SP2
- 适用范围:仅以太网
- 测量设置:---
- 仿真/测试设置:•
示例
capl
on key 's'
{
DWORD messageId = 0x12340004; // 服务ID = 0x1234,方法ID = 0x0004
DWORD requestId = 0; // 客户端ID = 0,会话ID = 0
DWORD protocolVersion = 1;
DWORD interfaceVersion = 1;
DWORD messageType = 0x2; // 通知消息
DWORD returnCode = 0; // 未使用
DWORD aep; // 应用端点句柄
DWORD messageHandle = 0; // 创建的SOME/IP消息句柄
BYTE payload[5]; // 消息payload
DWORD count; // 计数器
BYTE buffer[21]; // 序列化缓冲区
// 初始化payload
count = 0;
payload[count++] = 0x11;
payload[count++] = 0x22;
payload[count++] = 0x33;
payload[count++] = 0x44;
payload[count++] = 0x55;
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建SOME/IP消息
messageHandle = SomeIpCreateMessage(messageId, requestId, protocolVersion, interfaceVersion, messageType, returnCode);
// 设置消息payload
SomeIpSetData(messageHandle, elcount(payload), payload);
// 将消息序列化为缓冲区
SomeIpSerializeMessage(messageHandle, elcount(buffer), buffer);
// 可通过EthSetTokenData函数将序列化消息添加到纯以太网帧中
}
SomeIpSetData
函数
设置SOME/IP消息的payload。若消息payload已有数据,将被覆盖。必要时,SOME/IP消息头部的长度字段会自动调整。
语法
capl
long SomeIpSetData( dword messageHandle, dword dataLength, char data[] );
long SomeIpSetData( dword messageHandle, dword dataLength, byte data[] );
long SomeIpSetData( dword messageHandle, dword dataLength, struct data );
参数
- messageHandle :接收的SOME/IP消息句柄(参见
OnSomeIpMessage)。 - dataLength:数据字节数。
- data:需复制到SOME/IP消息的payload数据。
返回值
- 0:函数执行成功。
- >0:错误代码。
可用性
- 起始版本:8.1
- 适用范围:仅以太网
- 测量设置:---
- 仿真/测试设置:•
示例
capl
on key 's'
{
DWORD messageId = 0x12340004; // 服务ID = 0x1234,方法ID = 0x0004
DWORD requestId = 0; // 客户端ID = 0,会话ID = 0
DWORD protocolVersion = 1;
DWORD interfaceVersion = 1;
DWORD messageType = 0x2; // 通知消息
DWORD returnCode = 0; // 未使用
DWORD aep = 0; // 应用端点句柄
DWORD messageHandle = 0; // 创建的SOME/IP消息句柄
BYTE payload[5]; // 消息payload
DWORD count = 0; // 计数器
// 初始化payload
count = 0;
payload[count++] = 0x11;
payload[count++] = 0x22;
payload[count++] = 0x33;
payload[count++] = 0x44;
payload[count++] = 0x55;
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建SOME/IP消息并设置payload
messageHandle = SomeIpCreateMessage(messageId, requestId, protocolVersion, interfaceVersion, messageType, returnCode);
SomeIpSetData(messageHandle, elcount(payload), payload);
// 发送SOME/IP消息
SomeIpOutputMessage(aep, 0xFFFFFFFF, 40001, messageHandle);
// 释放消息句柄
SomeIpReleaseMessage(messageHandle);
}