1. KNX协议分层(OSI模型简化)
KNX协议主要基于 OSI模型的简化版本,分为四层:
OSI层 | KNX实现 | 功能说明 |
---|---|---|
物理层 | TP(双绞线)、RF、IP | 定义物理介质(如KNX TP1总线、无线射频、KNXnet/IP隧道)。 |
数据链路层 | KNX Data Link Layer | 管理总线仲裁、冲突检测、帧校验(如校验和)。 |
网络层 | KNX Network Layer | 处理路由(组播/广播)、地址过滤(物理地址与组地址)。 |
应用层 | KNX Application Layer | 定义数据语义(如DPT类型)、设备间交互逻辑(读/写/响应)。 |
2. 通信模式
(1) 组播(Group Communication)
- 用途:设备向组地址发送数据,所有订阅该组地址的设备接收并处理。
- 特点:高效的一对多通信,适用于灯光控制、场景触发等。
- 示例:
组地址 1/2/3
接收开灯指令,所有绑定此地址的灯执行操作。
(2) 点对点(Point-to-Point)
- 用途:设备直接通过物理地址通信(如配置、诊断)。
- 特点:需明确指定目标物理地址,用于设备初始化或维护。
- 示例:中控设备
0.0.1
向传感器1.1.10
请求温度数据。
3. 报文类型
KNX报文分为 标准帧(L_Data) 和 扩展帧(L_Data Extended):
类型 | 控制字段值 | 数据长度限制 | 适用场景 |
---|---|---|---|
标准帧 | 0xBC | ≤ 15字节 | 常规控制指令(开关、百分比) |
扩展帧 | 0xBF | ≤ 255字节 | 大数据传输(如日志、配置) |
4. 地址结构
(1) 物理地址(Individual Address)
- 格式:
区域(4bit).线(4bit).设备(8bit)
→ 2字节。 - 示例:
1.2.3
→0x12 0x03
(二进制0001 0010 0000 0011
)。 - 用途:唯一标识设备,用于点对点通信或设备配置。
(2) 组地址(Group Address)
- 格式:
主组(5bit)/中间组(3bit)/子组(8bit)
或主组(5bit)/子组(11bit)
→ 2字节。 - 示例:
3/2/1
→0xE3 0x21
(二进制1110 0011 0010 0001
)。5/2047
→0xA5 0xFF
(二进制1010 0101 1111 1111
)。- 用途:逻辑分组,设备订阅组地址实现一对多通信。
5. 数据表示(APDU)
(1) DPT(Data Point Type)
KNX通过 DPT标准 定义数据语义,格式为 主类型.子类型
(如 DPT 1.001
表示布尔开关):
DPT示例 | 数据长度 | 说明 |
---|---|---|
DPT 1.001 | 1 bit | 布尔值(0 =关,1 =开)。 |
DPT 5.001 | 1字节 | 百分比(0x00 =0%,0xFF =100%)。 |
DPT 9.001 | 2字节 | 温度(浮点数,如 0x0C00 =24°C)。 |
DPT 16.001 | 14字节 | 字符串(ASCII编码,如 "KNX" )。 |
(2) APDU结构
- TPCI(Transport Control):1字节,标记报文类型(如数据请求、确认)。
- APCI(Application Control):1字节,定义操作类型(读、写、响应)。
- 数据负载:根据DPT编码的实际数据。
示例:
- 开关写入指令:
TPCI=0x00(写)
,APCI=0x80(DPT 1.001)
, 数据=0x01(开)
。 - 温度读取请求:
TPCI=0x40(读)
,APCI=0x00(无数据)
。
6. 通信服务
(1) 轮询(Polling)
- 主设备主动向从设备请求数据(如查询传感器状态)。
- 报文示例:
控制字段=0xBC
,目标地址=传感器物理地址
,APCI=读请求
。
(2) 确认(Acknowledge)
- 接收方需回复确认帧(ACK)以确保可靠性。
- 示例:设备收到控制指令后返回
ACK报文(0xB0)
。
(3) 重试机制
- 若未收到ACK,发送方在指定超时后重传报文(通常最多3次)。
7. 安全机制
- 传统模式:无加密,依赖物理层安全(如总线访问控制)。
- KNX Secure:新增数据加密(AES-128)和身份验证,防止篡改与窃听。
- 安全报文示例:在标准帧基础上增加加密负载和MAC(消息认证码)。
8. 实际调试建议
- 抓包工具:使用Wireshark + KNX插件 分析总线流量,过滤特定组地址。
- 错误排查:
- 校验和错误:检查报文异或结果。
- 地址冲突:确保物理地址和组地址唯一。
- ETS配置:在ETS工程中绑定DPT类型,避免数据解析错误。
KNX协议中,报文类型主要通过控制字段和TPCI(Transport Control Information)区分,不同报文类型适用于不同场景(如控制指令、数据请求、响应等)。以下是常见KNX报文类型的详细说明及示例:
1. 标准帧(L_Data Standard)
- 控制字段:
0xBC
- 数据长度:≤ 15字节
- 适用场景:常规控制指令(开关、百分比、状态读取等)。
示例:开关控制
BC 11 0A E1 03 01 01 80
- 控制字段
0xBC
:标准帧,正常优先级。 - 源地址
0x110A
(1.1.10)。 - 目标地址
0xE103
(组地址1/2/3)。 - 数据
0x01
:开关状态(开)。 - 校验和
0x80
:异或计算结果。
2. 扩展帧(L_Data Extended)
- 控制字段:
0xBF
- 数据长度:≤ 255字节
- 适用场景:大数据传输(如字符串、日志、复杂配置)。
示例:发送字符串信息
BF 23 05 E2 51 0E 10 4B 4E 58 20 54 65 73 74 00 00 00 5C
- 控制字段
0xBF
:扩展帧,低优先级。 - 源地址
0x2305
(2.3.5)。 - 目标地址
0xE251
(组地址2/5/1)。 - 数据长度
0x0E
:14字节数据。 - 数据
0x10 4B 4E 58 20 54 65 73 74 00 00 00
: - DPT 16.001(字符串),内容为
"KNX Test"
(ASCII编码)。 - 校验和
0x5C
:计算略。
3. 确认帧(ACK/NACK)
- 控制字段:
0xB0
(ACK)或0xB1
(NACK) - 结构:无数据部分,仅控制字段和校验和。
- 适用场景:接收方回复确认或拒绝。
示例:ACK确认
B0 00 00 00 00 00 00 B0
- 控制字段
0xB0
:确认帧(ACK)。 - 校验和
0xB0
:仅自身异或结果为0xB0
。
4. 轮询请求(Polling Request)
- 控制字段:
0xBC
(标准帧) - TPCI:
0x40
(读请求) - 适用场景:主设备主动请求从设备数据。
示例:读取温度传感器数据
BC 00 01 12 34 01 40 00 2D
- 源地址
0x0001
(中控设备0.0.1)。 - 目标地址
0x1234
(传感器物理地址1.2.52)。 - 数据长度
0x01
:1字节数据。 - TPCI+APCI
0x40
:读请求(无数据负载)。 - 校验和
0x2D
:计算略。
5. 响应帧(Response)
- TPCI:
0x80
(写响应)或0xC0
(读响应) - 适用场景:设备回复请求的数据或状态。
示例:温度传感器返回数据
BC 12 34 00 01 02 06 00 5C
- 源地址
0x1234
(传感器地址1.2.52)。 - 目标地址
0x0001
(中控设备0.0.1)。 - 数据长度
0x02
:2字节数据。 - 数据
0x0600
:温度值(DPT 9.001,24.0°C)。 - 校验和
0x5C
:计算略。
6. 广播帧(Broadcast)
- 目标地址:
0x0000
(全零地址) - 适用场景:设备向总线所有节点发送全局指令(如系统复位)。
示例:全局复位指令
BC 00 01 00 00 01 FF 01
- 源地址
0x0001
(中控设备)。 - 目标地址
0x0000
:广播地址。 - 数据
0xFF
:复位指令(自定义编码)。
7. 安全报文(KNX Secure)
- 控制字段:
0xBC
或0xBF
(结合加密标志) - 结构:在标准帧基础上增加加密负载和MAC(消息认证码)。
- 适用场景:防止数据篡改或窃听。
示例(简化的加密报文)
BC 11 0A E1 03 10 01 80 [加密负载] [MAC] 2A
- 数据部分:明文数据
0x01
被加密为更长字节。 - MAC:用于验证数据完整性(如AES-128计算)。
关键对比表
报文类型 | 控制字段 | 数据长度 | TPCI | 典型场景 |
---|---|---|---|---|
标准帧 | 0xBC | ≤15字节 | 0x00 | 开关控制、百分比调节 |
扩展帧 | 0xBF | ≤255字节 | 0x00 | 长文本、复杂配置 |
ACK确认 | 0xB0 | 无 | - | 接收成功响应 |
NACK拒绝 | 0xB1 | 无 | - | 接收失败响应 |
读请求 | 0xBC | 1字节 | 0x40 | 主动请求传感器数据 |
写响应 | 0xBC | 可变 | 0x80 | 设备状态更新确认 |
广播帧 | 0xBC | 可变 | 0x00 | 系统级指令(如复位) |
注意事项
- TPCI与APCI:
- TPCI(传输控制)标记报文类型(读、写、响应)。
- APCI(应用控制)定义具体操作(如DPT类型)。
- 地址过滤:设备仅处理目标地址匹配的报文(物理地址或订阅的组地址)。
- 校验和:始终为前面所有字节的异或(XOR)值。
希望这些示例能帮助你理解KNX不同报文类型的写法!实际开发中建议结合官方协议文档和ETS工具验证。
以下示例说明:
示例1:开关控制(标准帧)
场景:物理地址 1.1.10
的设备向组地址 1/2/3
发送开灯指令。
报文:
BC 11 0A E1 03 01 01 80
- 控制字段
0xBC
:标准帧,正常优先级。 - 源地址
0x110A
:设备地址1.1.10
。 - 目标地址
0xE103
:组地址1/2/3
(E1
表示组地址类型)。 - 数据长度
0x01
:1字节数据。 - 数据
0x01
:开关状态(0x01
=开,0x00
=关)。 - 校验和
0x80
:BC XOR 11 XOR 0A XOR E1 XOR 03 XOR 01 XOR 01 = 80
。
示例2:温度传感器数据(扩展帧)
场景:传感器 2.3.5
上报温度 22.5°C
到组地址 2/5/1
。
报文:
BF 23 05 E2 51 02 06 00 5C
- 控制字段
0xBF
:扩展帧,低优先级。 - 源地址
0x2305
:设备地址2.3.5
。 - 目标地址
0xE251
:组地址2/5/1
。 - 数据长度
0x02
:2字节数据。 - 数据
0x0600
: - DPT 9.001(温度),编码为
0x0600
→22.5°C
(浮点格式)。 - 校验和
0x5C
:计算略。
示例3:场景控制(多字节数据)
场景:中控设备 0.0.1
触发场景 3
(组地址 5/0/3
)。
报文:
BC 00 01 E5 03 03 03 00 00 6F
- 控制字段
0xBC
:标准帧。 - 源地址
0x0001
:中控地址0.0.1
。 - 目标地址
0xE503
:组地址5/0/3
。 - 数据长度
0x03
:3字节数据。 - 数据
0x030000
:场景编号3,附加参数。 - 校验和
0x6F
:计算略。
关键点
- 地址编码:
- 物理地址:
区域(4bit).线(4bit).设备(8bit)
→ 2字节(如1.1.10
→0x11 0x0A
)。 - 组地址:
主组(5bit)/中间组(3bit)/子组(8bit)
→ 2字节(如1/2/3
→0xE1 0x03
,高位1110
表示组地址)。
- 数据编码:
- 开关:1字节(
0x00
=关,0x01
=开)。 - 温度:2字节浮点(如 DPT 9.001)。
- 百分比:1字节(
0x00
=0%,0xFF
=100%)。
- 校验和:对所有前面字节进行异或运算(如
BC XOR 11 XOR 0A XOR E1 XOR 03 XOR 01 XOR 01 = 80
)。
实际应用建议
- 使用ETS(KNX工程工具软件)配置设备,无需手动组包。
- 报文示例主要用于理解底层协议,调试时可借助抓包工具(如Wireshark + KNX插件)。
- 深入学习可参考KNX官方文档《KNX Standard》或书籍《KNX for IoT》。