CAPL学习-ETH功能函数-事件过程函数参考补充说明

1. ethernetPacket 选择器:<protocol>.<field>

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器 <protocol>.<field>

选择器

byte ethernetPacket.<protocol>.<field>;
word ethernetPacket.<protocol>.<field>;
dword ethernetPacket.<protocol>.<field>;
qword ethernetPacket.<protocol>.<field>;

功能

对协议字段进行读写访问。

说明
  • 协议和字段标识符请参见协议概述。
  • 若数据包中不包含 <protocol><field>,测量将因运行时错误停止。可使用 ethernetPacket::<protocol>::IsAvailableethernetPacket::<protocol>::<field>::IsAvailable 检查字段是否可用。
  • 数据类型取决于协议字段,位长度向上舍入为下一个更大的 CAPL 数据类型(例如,4 位字段使用 byte,12 位字段使用 word)。
  • 此选择器仅适用于整数类型的协议字段;非整数类型字段需使用 GetDataSetData 方法。
参数

返回值

协议字段的值

可用性
  • 版本:11.0 SP3 及以上
  • 限制:以太网
  • 适用场景:测量设置 ✔️,仿真/测试设置 ✔️
示例
capl 复制代码
ethernetPacket pkt;
// 初始化 IPv4 和 UDP 协议数据包
pkt.udp.Init();
// 设置 IPv4 地址
pkt.ipv4.source.ParseAddress("192.168.1.1");
pkt.ipv4.destination.ParseAddress("192.168.1.255");
// 设置 UDP 端口
pkt.udp.source = 40001;
pkt.udp.destination = 40002;
// 设置 UDP  payload
pkt.udp.SetData(0, "Hello", 5);
// 计算 UDP 和 IPv4 校验和并发送以太网数据包
pkt.CompletePacket();
output(pkt);

2. DoIP

以太网 >> 协议概述 >> DoIP

快速访问

协议信息 | 协议依赖 | 头部格式 | 协议验证 | 编程

协议信息

IP 诊断(DoIP)是一种通过以太网对车辆进行诊断访问的专有协议,基于前身协议 HSFZ 开发。CANoe 提供了在配置中使用 DoIP 的更多功能。

协议依赖
  • 应用层:DoIP
  • 传输层:UDP、TCP
  • 网络层:IPv4、IPv6
  • 链路层:以太网

注意:DoIP 头部仅在 TCP 数据流中 DoIP 头部位于 TCP 负载起始位置的 TCP 数据包中才能被正确解析。

头部格式
协议字段 偏移 [byte.bit] 长度 [bit] 说明
Protocol Version 0 8 DoIP 协议版本: 0:保留 1:DoIP ISO/DIS 13400-2:2010 2:DoIP ISO 13400-2:2012 3...254:保留 255:车辆识别请求消息的默认值
Inverse Protocol Version 1 8 协议版本的逐位取反值(默认 FDh)
Payload Type 2 16 指定后续 payload 数据类型(见下表)
Payload Length 4 32 后续 payload 数据的字节长度

Payload Type 取值与说明

标识符 名称
0x0000 genericHeaderNegAck 通用 DoIP 头部否定确认
0x0001 vehicleIdReq 车辆识别请求消息
0x0002 vehicleIdReqEid 带 EID 的车辆识别请求消息
0x0003 vehicleIdReqVin 带 VIN 的车辆识别请求消息
0x0004 vehicleAnnouncement 车辆宣告消息/车辆识别响应消息
0x0005 routingActivationReq 路由激活请求
0x0006 routingActivationResp 路由激活响应
0x0007 aliveCheckReq 存活检查请求
0x0008 aliveCheckResp 存活检查响应
0x4001 entityStatusReq DoIP 实体状态请求
0x4002 entityStatusResp DoIP 实体状态响应
0x4003 diagPowerModeInfoReq 诊断电源模式信息请求
0x4004 diagPowerModeInfoResp 诊断电源模式信息响应
0x8001 diagMsg 诊断消息
0x8002 diagMsgPosAck 诊断消息肯定确认
0x8003 diagMsgNegAck 诊断消息否定确认
协议验证

包含 DoIP 协议的以太网数据包会被分析并检查一致性,异常将显示在跟踪窗口的"协议验证"列中。

验证 ID 消息描述
[DoIP-001] DoIP payload 长度大于可用数据(头部中指定的 payload 长度大于实际数据包长度)
[DoIP-002] DoIP 数据包长度过小(必须至少 8 字节以完整包含头部)
[DoIP-003] 协议版本与逆协议版本不一致(两者必须为逐位取反关系)
[DoIP-005] 需重新同步以解析数据(前一个 PDU 的长度错误导致后续数据无法解析)
编程
  • 初始化ethernetPacket.<protocol>.Init
  • 完整性校验ethernetPacket.CompletePacket
  • 端口设置:DoIP 协议初始化时,UDP/TCP 头部的源端口和目的端口默认设为 13400,可在选项对话框中配置。

3. ethernetPacket 选择器:<protocol>.<field>.bitLength

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器 <protocol>.<field>.bitLength

选择器

dword ethernetPacket.<protocol>.<field>.bitLength;

功能

获取协议字段的位长度(只读)。

说明
  • 若数据包中不包含 <protocol><field>,返回 0。
  • 可使用 ethernetPacket::protocol::field::IsAvailable 检查字段是否可用。
参数

返回值

协议字段的位长度

可用性
  • 版本:11.0 SP3 及以上
  • 限制:以太网
  • 适用场景:测量设置 ✔️,仿真/测试设置 ✔️
示例
capl 复制代码
ethernetPacket pkt;
word offset, length;
// 初始化 IPv4 和 UDP 协议数据包
pkt.udp.Init();
pkt.udp.ResizeData(10);
offset = pkt.udp.checksum.bitOffset;
length = pkt.udp.checksum.bitLength;
write("UDP 校验和字段位于位偏移 %d,长度 %d 位", offset, length);

4. ethernetPacket 选择器:<protocol>.<field>.bitOffset

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器 <protocol>.<field>.bitOffset

选择器

dword ethernetPacket.<protocol>.<field>.bitOffset;

功能

获取协议字段的位偏移量(只读),偏移量 0 为以太网类型(Ethertype)之后的位置。

说明
  • 若数据包中不包含 <protocol><field>,返回 0。
  • 可使用 ethernetPacket::protocol::field::IsAvailable 检查字段是否可用。
参数

返回值

协议字段的位偏移量

可用性
  • 版本:11.0 SP3 及以上
  • 限制:以太网
  • 适用场景:测量设置 ✔️,仿真/测试设置 ✔️
示例

<protocol>.<field>.bitLength

5. ethernetPacket 选择器:<protocol>.<field>.byteLength

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器 <protocol>.<field>.byteLength

选择器

dword ethernetPacket.<protocol>.<field>.byteLength;

功能

获取协议字段的字节长度(只读)。

说明
  • 若数据包中不包含 <protocol><field>,返回 0。
  • 可使用 ethernetPacket::protocol::field::IsAvailable 检查字段是否可用。
参数

返回值

协议字段的字节长度

可用性
  • 版本:11.0 SP3 及以上
  • 限制:以太网
  • 适用场景:测量设置 ✔️,仿真/测试设置 ✔️
示例
capl 复制代码
ethernetPacket pkt;
word offset, length;
// 初始化 IPv4 和 UDP 协议数据包
pkt.udp.Init();
pkt.udp.ResizeData(10);
offset = pkt.udp.checksum.byteOffset;
length = pkt.udp.checksum.byteLength;
write("UDP 校验和字段位于字节偏移 %d,长度 %d 字节", offset, length);

6. ethernetPacket 选择器:<protocol>.<field>.byteOffset

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器 <protocol>.<field>.byteOffset

选择器

dword ethernetPacket.<protocol>.<field>.byteOffset;

功能

获取协议字段的字节偏移量(只读),偏移量 0 为以太网类型(Ethertype)之后的位置。

说明
  • 若数据包中不包含 <protocol><field>,返回 0。
  • 可使用 ethernetPacket::protocol::field::IsAvailable 检查字段是否可用。
参数

返回值

协议字段的字节偏移量

可用性
  • 版本:11.0 SP3 及以上
  • 限制:以太网
  • 适用场景:测量设置 ✔️,仿真/测试设置 ✔️
示例

<protocol>.<field>.byteLength

7. ethernetPacket 选择器:<protocol>.<optional-structure>.<field>

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器

选择器
capl 复制代码
byte ethernetPacket.<protocol>.<optional-structure>.<field>;  
word ethernetPacket.<protocol>.<optional-structure>.<field>;  
dword ethernetPacket.<protocol>.<optional-structure>.<field>;  
qword ethernetPacket.<protocol>.<optional-structure>.<field>;  
功能

对可选结构内的协议选项字段进行读写访问。

说明
  • 协议和字段标识符详见协议概述。
  • 若报文不含指定的 <protocol><optional-structure><field>,测量将因运行时错误停止。可通过 ethernetPacket::<protocol>::<optional-structure>::IsAvailable 判断字段是否存在。
  • 数据类型取决于协议字段,位长度向上取整为下一个更大的 CAPL 数据类型(例如,4 位字段使用 byte,12 位字段使用 word)。
  • 此选择器仅适用于整数类型的协议字段;非整数字段需使用 GetDataSetData 方法。
参数

返回值

协议字段的值

可用性
  • 版本:11.0 SP3 及以上
  • 限制:仅以太网
  • 支持场景:测量设置、仿真/测试设置
示例
capl 复制代码
on key '1'  
{  
  ethernetPacket pkt;  
  pkt.ipv6.Init();       // 初始化 IPv6 报文  
  pkt.udp.Init();        // 初始化 UDP  
  pkt.ipv6.fragment.Init();  // 初始化 IPv6 分片结构  
  pkt.ipv6.fragment.offset = 100;          // 设置分片偏移  
  pkt.ipv6.fragment.flag = 1;              // 设置分片标志(原文"framgent"为笔误,应为"fragment")  
  pkt.ipv6.fragment.identification = 0x1234;  // 设置标识  
  pkt.CompletePacket();  // 完成报文组装  
  output(pkt);           // 发送报文  
}  

8. ethernetPacket 选择器:<protocol>.byte/word/dword/qword/char/int/long/int64

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器

选择器
capl 复制代码
byte ethernetPacket.<protocol>.Byte(index);  
word ethernetPacket.<protocol>.Word(index);  
dword ethernetPacket.<protocol>.DWord(index);  
qword ethernetPacket.<protocol>.QWord(index);  
char ethernetPacket.<protocol>.Char(index);  
int ethernetPacket.<protocol>.Int(index);  
long ethernetPacket.<protocol>.Long(index);  
int64 ethernetPacket.<protocol>.Int64(index);  
功能

访问协议的 payload 数据。

说明
  • 若索引超出可用数据范围或协议不存在,测量将因运行时错误停止。
  • 可通过 ethernetPacket::protocol::IsAvailableethernetPacket::protocol::byteLength 判断数据是否可用。
参数
  • Index :字节偏移量。索引 0 对应协议 payload 的第一个字节。若索引大于 ethernetPacket.<protocol>.byteLength,将触发运行时错误。
返回值

指定索引处的值

可用性
  • 版本:11.0 SP3 及以上
  • 限制:仅以太网
  • 支持场景:测量设置、仿真/测试设置
示例
capl 复制代码
// 接收报文时读取 UDP payload  
on ethernetPacket *  
{  
  if ((this.udp.IsAvailable()) && (this.udp.byteLength >= 16))  
  {  
    word val;  
    val = this.udp.Word(15);  // 读取 UDP payload 第 15 个字节(word 类型)  
  }  
}  

// 发送 IPv4+UDP 报文  
on key '1'  
{  
  int i;  
  ethernetPacket pkt;  
  pkt.udp.Init();  // 初始化 UDP(自动包含 IPv4)  
  // 设置 IPv4 地址  
  pkt.ipv4.source.ParseAddress("192.168.1.1");  
  pkt.ipv4.destination.ParseAddress("192.168.1.255");  
  // 设置 UDP 端口  
  pkt.udp.source = 40001;  
  pkt.udp.destination = 40002;  
  // 设置 UDP payload  
  pkt.udp.ResizeData(10);  // 调整 payload 长度为 10 字节  
  for (i = 0; i < 10; i++)  
  {  
    pkt.udp.Byte(i) = i;  // 填充 payload 数据  
  }  
  pkt.CompletePacket();  // 计算校验和并完成组装  
  output(pkt);  
}  

9. ethernetPacket 选择器:<protocol>.byteLength

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器

选择器
capl 复制代码
dword ethernetPacket.<protocol>.byteLength;  
功能

返回协议 payload 的长度(只读)。

说明
  • 若协议不存在,返回值为 0。可通过 ethernetPacket::protocol::IsAvailable 判断协议是否存在。
参数

返回值

协议 payload 的字节长度

可用性
  • 版本:11.0 SP3 及以上
  • 限制:仅以太网
  • 支持场景:测量设置、仿真/测试设置
示例
capl 复制代码
ethernetPacket pkt;  
word offset, length, i;  
pkt.udp.Init();          // 初始化 UDP  
pkt.udp.ResizeData(10);  // 设置 payload 长度为 10 字节  
offset = pkt.udp.byteOffset;   // 获取 UDP payload 起始偏移  
length = pkt.udp.byteLength;   // 获取 UDP payload 长度  
write("Protocol udp is at byte %d:%d", offset, length);  
for (i = 0; i < length; i++)  
{  
  pkt.byte(offset + i) = i;  // 通过底层 byte 接口填充数据  
}  
pkt.CompletePacket();  
output(pkt);  

10. ethernetPacket 选择器:<protocol>.byteOffset

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket >> 选择器

选择器
capl 复制代码
dword ethernetPacket.<protocol>.byteOffset;  
功能

返回协议 payload 在以太网报文内的字节偏移量(只读)。

说明
  • 偏移量 0 对应以太网类型(Ethertype)后的第一个字节。
  • 若协议不存在,返回值为 0。可通过 ethernetPacket::protocol::IsAvailable 判断协议是否存在。
参数

返回值

字节偏移量

可用性
  • 版本:11.0 SP3 及以上
  • 限制:仅以太网
  • 支持场景:测量设置、仿真/测试设置
示例
capl 复制代码
ethernetPacket pkt;  
word offset, length, i;  
pkt.udp.Init();          // 初始化 UDP  
pkt.udp.ResizeData(10);  // 设置 payload 长度为 10 字节  
offset = pkt.udp.byteOffset;   // 获取 UDP payload 起始偏移  
length = pkt.udp.byteLength;   // 获取 UDP payload 长度  
write("Protocol udp is at byte %d:%d", offset, length);  
for (i = 0; i < length; i++)  
{  
  pkt.byte(offset + i) = i;  // 通过底层 byte 接口填充数据  
}  
pkt.CompletePacket();  
output(pkt);  

11. ethernetPacket

CAPL 函数 >> 以太网 >> 函数概述 >> ethernetPacket

语法
capl 复制代码
ethernetPacket <packet var>;  
功能

创建以太网发送对象,可通过关联选择器操作对象数据。

参数
  • packet var:对象变量名
选择器
选择器 类型 访问权限 说明
time_ns int64 只读 时间戳(纳秒)
dir byte 只读 传输方向(Rx/Tx)
msgChannel word 读写 应用通道(如 Eth 1)
hwChannel word 读写 硬件通道(仅 Vector 多通道接口支持,如 VN5640)
hwPort - 读写 网络访问端口(仅网络型访问支持)
Length word 读写 以太网 payload 长度(Ethertype 后的数据)
FCS dword 只读 帧校验和(部分硬件不支持,返回 0)
FrameLen int64 只读 帧持续时间(纳秒,部分硬件不支持,返回 0)
SOF int64 只读 帧起始时间戳(纳秒,部分硬件不支持,返回 0)
Type word 读写 Ethertype 类型
Source qword 读写 源 MAC 地址(仅使用 6 字节,网络字节序)
Destination qword 读写 目的 MAC 地址(仅使用 6 字节,网络字节序)
byte(x)/char(x)/word(x) 多样 读写 报文数据(偏移 0 对应 Ethertype 后第一个字节)
<protocol>.byteLength long 只读 协议 payload 长度
<protocol>.<field> 多样 读写 协议字段(类型取决于字段)
方法
  • Clear():清除报文数据
  • CompletePacket():完成报文组装(计算校验和等)
  • Init():初始化协议(如 pkt.udp.Init()
  • IsAvailable():检查协议/字段是否存在
  • ResizeData(length):调整 payload 长度
  • ParseAddress("ip"):解析 IP 地址
可用性
  • 基础功能:8.5 及以上版本
  • 扩展功能:11.0 SP3 支持协议选择器和方法
示例

基础发送示例

capl 复制代码
ethernetPacket txPacket;  
int i;  
txPacket.msgChannel = 1;  
txPacket.source = EthGetMacAddressAsNumber("20:00:00:00:00:01");  
txPacket.destination = EthGetMacAddressAsNumber("FF:FF:FF:FF:FF:FF");  
txPacket.Length = 100;  
txPacket.type = 0xF123;  // 自定义 Ethertype  
for (i = 0; i < txPacket.Length; i++)  
{  
  txPacket.Byte(i) = i & 0xFF;  // 填充 payload  
}  
output(txPacket);  

网络型访问示例

capl 复制代码
txPacket.hwPort = ethernetPort::Ethernet1::ChatClient1;  // 指定端口  

通道型访问示例

capl 复制代码
txPacket.hwChannel = 2;  // 指定硬件通道  

12. 协议概述

以太网 >> 协议概述

CANoe 支持汽车行业多种以太网协议,可通过 Trace 窗口解析报文协议信息,并支持 CAPL/.NET 节点对协议数据进行编程访问。

支持的 IP 协议
层级 协议列表
应用层-汽车 AUTOSAR PDU 多路复用、DoIP、HSFZ、PDU 编组、SOME/IP、XCP、PGT、UDP NM
应用层-通用 DHCPv4、DHCPv6、HTTP、NTP/SNTP、TFTP、SNMP、RTP、RTCP
会话层 TLS、DTLS
传输层 TCP、UDP
网络层 ICMPv4、ICMPv6、IGMP、IPv4、IPv6、IPsec 认证头、IPsec 封装安全载荷
链路层 ARP/RARP、以太网、NDP、SRP、MAC 控制
支持的 AVB 协议
类型 协议列表
流传输 AVTP 音频、AVTP 视频
控制层 ACMP、ADP、AECP、AVTP 控制、CRS、MAAP、PTP
传输层 AVTP
链路层 以太网
相关推荐
Jtti1 小时前
高防ip和普通ip两者有何区别?
运维·网络协议·tcp/ip
繁华似锦respect1 小时前
Linux - KCP 协议深度解析:原理、与 TCP/UDP 的对比及应用场景
linux·tcp/ip·观察者模式·设计模式·udp
垦***耪1 小时前
三相异步电动机矢量控制Matlab仿真之旅
tcp/ip
车载测试工程师2 小时前
CAPL学习-ETH功能函数-方法类1
网络协议·学习·以太网·capl·canoe
讨厌下雨的天空2 小时前
传输层TCP协议
服务器·网络协议·tcp/ip
老蒋新思维2 小时前
创客匠人峰会复盘:AI 赋能 IP 创新增长,知识变现的 4 大实战路径与跨行业案例
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现
chuxinweihui3 小时前
传输层协议UDP,TCP
网络·网络协议·tcp/ip·udp
老蒋新思维4 小时前
创客匠人峰会复盘:AI 时代知识变现,从流量思维到共识驱动的系统重构
大数据·人工智能·tcp/ip·重构·创始人ip·创客匠人·知识变现
老蒋新思维14 小时前
创客匠人 2025 全球创始人 IP+AI 万人高峰论坛:AI 赋能下知识变现与 IP 变现的实践沉淀与行业启示
大数据·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人