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>::IsAvailable和ethernetPacket::<protocol>::<field>::IsAvailable检查字段是否可用。 - 数据类型取决于协议字段,位长度向上舍入为下一个更大的 CAPL 数据类型(例如,4 位字段使用
byte,12 位字段使用word)。 - 此选择器仅适用于整数类型的协议字段;非整数类型字段需使用
GetData和SetData方法。
参数
无
返回值
协议字段的值
可用性
- 版本: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)。 - 此选择器仅适用于整数类型的协议字段;非整数字段需使用
GetData和SetData方法。
参数
无
返回值
协议字段的值
可用性
- 版本: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::IsAvailable和ethernetPacket::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 |
| 链路层 | 以太网 |