KNX 是一种流行的楼宇自动化协议,用于将智能建筑中的传感器、执行器和其他组件互联。我们的 KNX 总线转储工具利用 Calimero Java 库(我们为此工具对其做出了贡献),记录通过 KNX 总线发送的报文。具体来说,我们的工具通过 TPUART 连接访问 KNX 总线,但可以更改以使用不同的连接介质。报文被转储到 Wireshark 兼容的十六进制转储文件中。时间戳以纳秒精度提供并归一化为 UTC 时间,以便进行数据分析并提供报文的时间线。该十六进制转储文件可以导入 Wireshark,并配置 Wireshark 的 cEMI 解析器来解析 KNX 报文。
我们的工具可用于 KNX 传感器、执行器和其他 KNX 设备的协议分析。例如,我们使用该工具来理解我们的 KNX 设备,并发现了异常的 KNX 报文。该工具也非常适合 KNX 设备的安全分析,因为它揭示了涉及协议和通过 KNX 总线发送的数据的所有细节。
Tcpdump 和 Wireshark 不能用于转储通过 KNX 总线发送的报文,因为我们处理的是原生 KNX 报文,而不是 TCP/IP 数据包。Wireshark 和 tcpdump 可以转储 KNXnet/IP 数据包,这些是 TCP/IP 数据包。KNXnet/IP 是一种通过 TCP/IP 网络向 KNX 总线发送命令和数据的协议。
此工具设计用于与 Calimero Java 库配合使用,并兼容 Raspberry Pi 3 或 4 以及用于 TPUART 连接的 Raspberry Pi HAT。
以下是设置环境的一些指南:
注意:后续步骤假设您已按照这些指南设置了环境。
将 KNXBusDump.java 文件放入 Calimero 项目套件的 introduction/src/main/java/ 文件夹中。
切换到 introduction 文件夹。
要运行程序,只需运行:
./gradlew run -Pcalimero.serial.tpuart.maxInterByteDelay=60000 -DmainClass=KNXBusDump
请参考下面的 故障排除 指南以解决常见错误。
现在,等待一些消息在总线上传输,转储的报文将出现在 KNXBusDump-Telegrams.txt 文件中。
使用 Ctrl-C 取消工具,该文件现在可以导入 Wireshark 进行分析。
在 Wireshark 中,您可以从十六进制转储导入数据包,并指定解析器来分析数据包。
启动 Wireshark 后,等待初始加载完成。然后点击 文件 -> 从十六进制转储导入...
为了正确解析,我们需要提供一个带有标签的正则表达式 (regex)。
^\s*(?<time>\d{4}-\d\d\-\d\dT(\d\d\:){2}\d\d.(\d){6}[Z])\s(?<seqno>\d{6})\s+(?<data>[0-9a-fA-F]*)$
选择十六进制转储文件作为源。
在新对话框中,切换到 正则表达式 选项卡,并将上述正则表达式粘贴到框中。
确保数据编码为 Plain hex。
在 时间戳格式 文本框中,需要指定工具生成的模式。
%Y-%m-%dT%H:%M:%S.%fZ
注意:时间戳格式必须与此完全一致。否则将无法解析出时间戳。
在 封装 部分,将 封装类型 更改为 Wireshark Upper PDU Export。
勾选 ExportPDU 以指定 cemi 解析器。
现在您可以导入文件并分析报文。
Wireshark 时间戳:
对应的十六进制转储文件
注意:高亮显示的时间是归一化的 UTC 时间。无论时间旁边显示的时区是什么,它始终是正确的 UTC 时间。
考虑事项:
以下是一些在按照本设置指南运行此程序时可能出现的常见错误。我提供了解决方案,希望能修复该错误。
确保精确输入所有命令。运行命令时使用 "Dmainclass" 会导致程序默认为发现 KNX 服务器程序。请确保是 "DmainClass"。
确保 KNXD(如果您按照这些指南安装了它)没有运行。如果遵循本指南,则 KNXD 将使用相同的端口,且一次只能有一个进程使用串行端口。
如果您从上方复制粘贴了十六进制转储文件的内容,则可能缺少一个额外的换行符。例如,在 "SampleData1.txt" 中,github 表示显示 4 行数据,但实际上它是 4 行数据 加上 一个换行符。因此,一个可能的解决方案是,在您要导入的文件中,在最后一个数据字节之后直接按 "Enter"。
在此存储库中,我在 Sample-KNXBusDump-Telegrams.txt 文件中提供了用于创建截图的示例数据。请随意将其导入 Wireshark 自行测试。
该工具在此本地 KNX 测试平台上进行了测试。
