极物科技 | KNX协议 - KNXnet/IP报文结构逐字节解析
前言
KNX 作为国际标准(ISO/IEC 14543-3)拥有完全开放的协议规范与蓬勃的开源生态,knxd 正是这一开放性的最好注脚------一台普通 Linux 设备即可变身 KNX 路由器。
极物科技的产品同样构建在开放标准之上:自研 KNX 主机的极物 OS 原生支持 KNXnet/IP 路由与隧道双通道,与 knxd、ETS 等主流工具链无缝互通;配套鸿蒙、苹果、安卓三端原生 APP,深度接入 Apple HomeKit 与小度生态,支持主机远程调试------工程调试不受任何私有协议锁定。
一句话概述:本文拿三帧真实抓包报文,一个字节一个字节拆给你看------读完任何KNXnet/IP帧都能当场"人肉解码"。
本文聚焦于 KNXnet/IP 报文结构的逐字节解析,涵盖报文头、隧道通道头、CEMI各字段、1bit与1字节写入帧对比、组地址与APCI编码换算。

1. 三帧真实报文
以下为隧道模式下主机下发的三帧原始报文(十六进制):
text
帧A:向组地址写入 1bit,值=0
06 10 04 20 00 15 04 71 00 00 11 00 bc e0 00 00 00 2a 01 00 80
帧B:向组地址写入 1字节,值=50%(0x80)
06 10 04 20 00 16 04 71 01 00 11 00 bc e0 00 00 00 25 02 00 80 80
帧C:向组地址写入 1字节,值=100%(0xff)
06 10 04 20 00 16 04 71 02 00 11 00 bc e0 00 00 00 25 02 00 80 ff
三帧分别对应"关灯(bit)""调光50%""调光100%"三个动作。下面对帧B做完整拆解。
2. 第一层:KNXnet/IP 报文头(6字节)
text
06 10 04 20 00 16
│ │ │ └─ 总长度 = 0x0016 = 22字节(含头)
│ │ └─ 服务类型 = 0x0420(TUNNEL_REQUEST 隧道数据)
│ └─ 协议版本 = 0x10(KNXnet/IP 1.0)
└─ 头长度 = 6字节
服务类型速查 (前两字节固定 06 10,看后四字节即可分类):
| 值 | 服务 | 用途 |
|---|---|---|
| 0x0420 | TUNNEL_REQUEST | 隧道数据帧(本例) |
| 0x0421 | TUNNEL_ACK | 隧道确认 |
| 0x0530 | ROUTING_INDICATION | 组播路由数据帧 |
| 0x0201~0x0209 | 搜索/描述/连接管理 | 设备发现与会话 |
| 0x0407 | CONNECTIONSTATE_REQUEST | 心跳保活 |
💡 抓包第一眼:看到
06 10 04 20开头=隧道数据帧,06 10 05 30开头=组播路由帧。
3. 第二层:隧道通道头(4字节)
text
04 71 01 00
│ │ │ └─ 保留位 = 0
│ │ └─ 序列号 = 1(每发一帧+1,模256循环)
│ └─ 通道号 = 0x71(连接时网关分配)
└─ 结构长度 = 4字节
三帧的序列号依次是 00 → 01 → 02,这就是隧道的顺序保障机制:对端按序号ACK,乱序/丢帧立即发现。工程含义:抓包看到序列号跳变=链路丢帧,先查网络再看网关。
4. 第三层:CEMI 逐字段拆解
CEMI(Common External Message Interface)承载KNX链路层帧,帧B的CEMI部分共12字节:
text
11 00 bc e0 00 00 00 25 02 00 80 80
4.1 消息码与附加信息(11 00)
| 字节 | 值 | 含义 |
|---|---|---|
| +0 | 0x11 | 消息码 = L_Data.req(数据传输请求,主机→总线方向;总线→主机为L_Data.ind=0x29) |
| +1 | 0x00 | 附加信息长度 = 0(无附加信息) |
4.2 控制域(bc e0)
text
bc = 1011 1100
││││ └─ 帧类型:标准帧
│││└── 重复标志:非重复帧
││└─── 广播抑制:不抑制
│└──── 优先级:低优先级
└───── 确认请求:不需要ACK
e0 = 1110 0000
└── 跳数计数 = 6(每过一个路由器-1,归零丢弃)
地址类型 = 组地址(bit7=0)
4.3 源地址与目的地址(00 00 / 00 25)
| 字节 | 值 | 含义 |
|---|---|---|
| +4~5 | 00 00 | 源地址:主机侧未指定(隧道模式下由网关填入) |
| +6~7 | 00 25 | 目的组地址 = 0/0/37 |
组地址换算 (3级格式 主/中/子,按 (主<<11)|(中<<8)|子 编码):
text
0x0025 = 0000 0000 0010 0101
主 = 0x0025 >> 11 = 0 → 0/
中 = (0x0025 >> 8) & 7 = 0 → 0/
子 = 0x0025 & 0xFF = 37 → 0/0/37
帧A的目的地址是 00 2a = 0/0/42,反推方法相同。
4.4 数据长度与数据(02 / 00 80 80)
| 字节 | 值 | 含义 |
|---|---|---|
| +8 | 02 | 数据长度 = 2字节(含TPCI/APCI所在字节,比纯数据多1) |
| +9 | 00 | TPCI:传输层控制=数据包,无序号 |
| +10~11 | 80 80 | APCI + 数据 |
APCI编码(+10字节的高6位是APCI,低2位并入数据):
text
0x80 = 1000 0000
APCI = 0b100000 → GroupValue_Write(组值写入)
低2位 = 数据前2个bit
所以帧B的 80 80:APCI=写入,数据字节=0x80。对DPT 5.001(百分比)来说,0x80=128→ 50% 。帧C的 ff=255→100%。
5. 三帧对比总结
| 帧A(关灯) | 帧B(调光50%) | 帧C(调光100%) | |
|---|---|---|---|
| 总长 | 21 | 22 | 22 |
| 序列号 | 00 | 01 | 02 |
| 目的地址 | 0/0/42 | 0/0/37 | 0/0/37 |
| 数据长度 | 01 | 02 | 02 |
| 数据 | bit=0 | 0x80(50%) | 0xff(100%) |
| 尾字节 | 00 80 |
00 80 80 |
00 80 ff |
1bit帧的精妙之处:bit数据直接塞进APCI字节的低2位,不额外占字节------总长因此少1字节(21 vs 22)。这也是为什么"开关量报文"和"调光报文"长度不同,抓包时可据此快速区分。
6. 人肉解码流程卡
拿到任意一帧 06 10 ... 报文,按以下顺序读:
text
① [2:4] 服务类型 → 判断隧道/路由/管理帧
② [4:6] 总长度 → 校验帧完整性
③ 隧道帧:[6:8]通道 [8]序号 → 会话与顺序
④ CEMI:[10]消息码 → 请求还是指示
⑤ [12:14]目的地址 → 反算 主/中/子
⑥ [16]数据长度 → 数据字节数
⑦ [17]TPCI + [18]APCI → 读/写/应答
⑧ [18]剩余bit + [19:] → 按DPT换算工程值
7. 注意事项
- 长度字段包含自身:总长度、数据长度都要+1看(数据长度含APCI字节);
- bit与byte的写入帧长度不同:调光地址若误配成1bit DPT,抓包看到长度01即可发现;
- 源地址在隧道帧中可能是0 :真实源地址由网关在L_Data.ind帧中填入,别把
00 00当异常; - 跳数计数默认6:跨多路由器的工程注意报文被丢弃,必要时链路层配置加大;
- 编码换算:百分比/温度类工程值必须按DPT编码表换算(详见《KNX协议 - APCI指令与数据点类型DPT详解》),"写50"不等于"发0x50"。
8. 相关文档
- 《极物科技 | KNX协议 - CEMI报文格式详解》
- 《极物科技 | KNX协议 - APCI指令与数据点类型DPT详解》
- 《极物科技 | knxd - Wireshark抓包与总线监控》
- 《极物科技 | KNX协议 - Tunneling隧道协议详解》
- 《极物科技 | knxd - TCP与Unix Socket接口对接》
关于极物科技(ZEEWO)
极物科技(Zeewo)致力于为用户提供智能控制系统及硬件产品。我们以总线系统为技术底座,以**"稳定、可靠、快速响应"**为产品底线,是国内少有的拥有 KNX、DALI 全套软硬件自主研发能力的厂商之一。
我们的核心能力:
- 系统架构:自研极物 OS,支持多协议无界融合(KNX/DALI/CAN/RS485/IP)。
- 核心硬件:带双路 DALI 的 KNX 主机、超薄全金属定制面板、各类智选传感器及网关。
- 生态互联:深度融入 Apple HomeKit、Matter、小度、HomeAssistant 及纯血鸿蒙生态。
- 调试交付:独家支持 ETS 导出 XML 直接导入进行 APP 免编程调试,支持远程 WEB 运维。
我们的市场覆盖:
服务网点已覆盖全国核心城市(含长三角、珠三角、成渝等),并以高品质的方案深耕家居生活、酒店民宿、企业办公、疗愈康养、餐馆会所等多个细分领域。


(如果您在开发或落地中遇到技术问题,欢迎通过官网或后台私信与我交流探讨)