CAPL学习-SOME/IP交互层-原始数据访问类函数

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);
}
相关推荐
明天也要努力学习5 小时前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
LCG米10 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
Tel1992530800411 小时前
温度湿度信号转WiFi/MQTT/Modbus TCP采集模块 无线传输
网络·网络协议·tcp/ip·工业自动化·工控设备
lazy H14 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
Linux运维技术栈14 小时前
WAF部署在防火墙后面,获取不到真实IP怎么办?
服务器·网络·tcp/ip·安全·防火墙·waf
低慢小uav15 小时前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
德迅云安全-上官17 小时前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏
星恒随风17 小时前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
|_⊙18 小时前
应用层协议HTTP与HTTPS
网络·网络协议·http
秦禹辰18 小时前
ClipSketch AI把视频改造成图文漫画:选关键帧、生成手绘分镜、融合IP形象并自动写小红书文案
人工智能·tcp/ip·音视频