knxd连接USB KNX接口实战:udev规则与5类适配器配置手把手清单
2026/8/28 10:06:43 网站建设 项目流程

knxd连接USB KNX接口实战:udev规则与5类适配器配置手把手清单

【免费下载链接】knxd项目地址: https://gitcode.com/gh_mirrors/kn/knxd

knxd是一个运行在 Linux 上的 KNX 接口网关/路由守护进程,能连接几乎所有已知的 KNX 硬件接口,包括 USB 直连适配器、串口模块和 IP 网关。本文手把手带你搞定 knxd 连接 USB KNX 接口最容易卡住的一环——udev 规则,并给出 5 类 KNX USB 适配器的完整配置清单,让新手也能一次点亮总线。

🔌 为什么 udev 规则是绕不开的第一步

把 KNX USB 适配器插进电脑后,Linux 通常会把设备文件(如/dev/ttyACM0/dev/usb/...)分配给root用户,而 knxd 以普通用户knxd身份运行,于是出现两个经典问题:

  • ❌ 权限不足:knxd 打不开设备文件;
  • ❌ 设备歧义:再插一个同类串口设备时,knxd 连错设备。

udev 规则一次性解决两个问题:把设备所有者改成 knxd,并创建一个稳定的软链接(如/dev/knx1/dev/ttyKNX1)。

knxd 官方内置了一份 udev 规则文件 systemd/knxd.udev,安装时会被放到系统 udev 规则目录,覆盖绝大多数品牌适配器;通用规则说明见 contrib/udev/README.md:

通过 udev 规则,KNX 设备会获得 knxd 用户的访问权限,knxd 进程因此无需 root 即可读写设备,这也与 systemd 服务文件配套使用。

⚠️ 官方文件的开头就强调:不要直接修改它(升级会被覆盖),而要新建自己的规则文件,例如/etc/udev/rules.d/70-your-knxd.rules

📦 快速安装 knxd:从源码构建三步走

git clone https://gitcode.com/gh_mirrors/kn/knxd cd knxd sh bootstrap.sh ./configure --enable-usb # 开启 USB 适配器支持 make -j$(nproc) sudo make install

Debian/Ubuntu 用户请注意:官方打包已迁移到debian分支,按 README 提示先git checkout debian

systemd 环境下守护进程配置在/etc/knxd.conf,模板可参考 systemd/knxd.conf;knxd 用户由 sysusers 自动创建(见 systemd/sysusers.d/knxd.conf)。

🛠 udev 规则怎么写:两种标准句式

句式一:串口类设备(TPUART/TUL 等)——建软链接

核心思路:先用udevadm查出设备的 USB 路径,再把SYMLINK+OWNER写进规则:

# 第1步:查看设备属性,找到 ATTRS{manufacturer}=="busware.de" 那一块 udevadm info --attribute-walk /sys/bus/usb/drivers/cdc_acm/*/tty/ttyACM0

输出中的KERNELS=="xxxxxxxx"就是 USB 路径(每台机器不同)。然后写入规则文件:

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204b", KERNELS=="xxxxxxxx", SYMLINK+="knx1", OWNER="knxd"

接着验证:

udevadm test /sys/bus/usb/drivers/cdc_acm/*/tty/ttyACM0 ls -lL /dev/knx1 # 应显示 knxd 属主

句式二:USB HID 类设备(标准 KNX USB 接口)——只改属主

这类设备通过/dev/usb/XXX/YYY访问,只需要改属主。用lsusb查到厂商/产品 ID 后:

ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0e77", ATTRS{idProduct}=="0103", OWNER="knxd"

官方 systemd/knxd.udev 已内置约 20 个品牌的规则,包括:Schlaps&Partner、Siemens(导轨/嵌入式)、Weinzierl(多款)、Insta(Gira/Jung/Merten/Hager/Berker/Feller)、Busch-Jaeger、ABB STOTZ-KONTAKT、Tapko UIM-KNX、MDT SCN-USBR、SATEL、Züblin、Vimar。如果你的设备不在列表里,加一条规则并向项目提交补丁即可。

📋 5类 KNX USB 适配器配置清单

#适配器类型驱动典型设备文件关键 udev 句式
1USB HID 标准接口usb/dev/usb/X/Y只改 OWNER
2TPUART / TUL 串口tpuart/dev/ttyKNX1SYMLINK + OWNER
3FT1.2 老式串口ft12/dev/ttyXXXSYMLINK + OWNER
4FT1.2-CEMI 串口ft12cemi/dev/ttyXXXSYMLINK + OWNER
5NCN5120 芯片ncn5120/dev/ttyXXXSYMLINK + OWNER

各驱动的完整参数说明见配置文件格式文档 doc/inifile.rst。

类型1:USB HID 接口(usb 驱动)——最省事

这类接口走 HID 协议,好处是插到 Windows 上无需驱动就能开 ETS。knxd 的usb驱动会自动发现设备并自动识别 EMI1/EMI2/CEMI 协议版本,通常不需要任何选项,配置里写driver = usb即可。

  • 单个适配器:零配置,靠内置 udev 规则获得权限;
  • 多个适配器:需要用bus+device选项指定(注意官方警告:重启后总线/设备号可能变化);
  • 不确定设备号?运行findknxusb工具(源码见 src/usb/findknxusb.cpp),它会列出所有可用的 KNX USB 设备地址。

类型2:TPUART / TUL 串口适配器(tpuart 驱动)

TUL 等模块表现为 CDC-ACM 串口/dev/ttyACM0,必须走"句式一"。按上文三步做完后,配置里写:

[B.tpuart] driver = tpuart device = /dev/knx1 baudrate = 19200

device默认就是 udev 软链接/dev/ttyKNX1,所以udev 规则是必需的,不是可选项。第二个 TPUART 就照葫芦画瓢用ttyACM1knx2

💡 老坑提醒:规则里的KERNELS与 USB 端口绑定,换端口后必须更新规则——这是官方有意为之的设计。

类型3:FT1.2 老式串口适配器(ft12 驱动)

FT1.2 是较老的串口接口,把 EMI1 协议封装在串口帧里,默认波特率 19200。配置示例:

[B.ft12] driver = ft12 device = /dev/ttyUSB0 baudrate = 19200

同样先加 udev 软链接规则。还支持send-timeout(默认 0.3 秒)、send-retries等重传参数。

类型4:FT1.2-CEMI 串口适配器(ft12cemi 驱动)

新一代串口接口,CEMI 封装,默认波特率 19200,选项与 ft12 基本一致,只是把驱动名换成ft12cemi

[B.ft12cemi] driver = ft12cemi device = /dev/ttyKNX1 baudrate = 19200

类型5:NCN5120 芯片适配器(ncn5120 驱动)

NCN5120 是与 TPUART2 大部分兼容的 KNX 接口芯片,用法与 tpuart 相同,唯一区别是默认波特率 38400

[B.ncn5120] driver = ncn5120 device = /dev/knx1 baudrate = 38400

加餐:树莓派 HAT 版 TPUART

树莓派上用板载串口跑 TPUART HAT,udev 规则更简单(systemd/knxd.udev 中已有注释模板):

  • Pi 3:KERNEL=="ttyAMA0"
  • Pi 4:KERNELS=="107d001000.serial"
  • Pi 5:KERNELS=="1f00030000.serial"

⚠️ Pi 2/3 需先禁用内核串口控制台(编辑/boot/cmdline.txt去掉console=ttyAMA0);Pi 3 还需在/boot/config.txtdtoverlay=pi3-disable-btsystemctl disable hciuart,否则硬件串口被蓝牙占用、传输不稳。

📝 knxd.ini 完整配置示例

把所有连接写进/etc/knxd.ini(格式见 doc/inifile.rst),下面是一个"USB HID 接口 + systemd 服务"的典型配置:

[main] addr = 7.0.1 client-addrs = 7.0.2:8 connections = server,B.usb systemd = systemd [B.usb] driver = usb [server] server = ets_router [systemd] error-level = fatal

要点:

  • addr是 knxd 自己在总线上的地址,必填;
  • client-addrs是分配给客户端的地址段(如7.0.2:8表示 7.0.2~7.0.9),使用 server 功能时必填;
  • 老版本命令行参数可用/usr/lib/knxd_args自动转换成本 ini 格式。

✅ 验证连接成功的 3 个命令

  1. ls -lL /dev/knx1(或对应设备)——确认属主是knxd
  2. sudo systemctl restart knxd—— 干净重启守护进程;
  3. journalctl -u knxd --since "2 min ago"—— 看日志,确认驱动初始化成功、无权限错误。

💡 需要深入排错时,给启动参数加-f9 -t1023可开启详尽日志(提示见 systemd/knxd.conf)。

🩺 常见问题排查:连接失败的快速修复

症状大概率原因修复动作
打开设备无权限没写 udev 规则 / 规则未生效按句式补 OWNER,重新插拔设备
KERNELS匹配不上换了 USB 端口重跑udevadm info --attribute-walk更新规则
多适配器连错设备USB HID 类未指定地址bus+device选项或findknxusb定位
编程模式报错缺少 single 过滤驱动前加-B single
重启后设备号变了USB HID 编号漂移改用固定 USB 口或重新指定 bus/device

🏁 上手自检清单

  • 已创建knxd用户,守护进程非 root 运行
  • udev 规则文件放在/etc/udev/rules.d/70-*.rules(不改官方文件)
  • udevadm test通过后,设备属主为 knxd
  • ini 中addrclient-addrsconnections三项齐备
  • 波特率与硬件一致(tpuart 19200 / ncn5120 38400)
  • journalctl日志中无权限/超时错误

按这份清单走完,你的 USB KNX 接口就能稳定接入 knxd 了。遇到未收录的适配器型号,加一条 udev 规则并提交补丁,让后来者开箱即用——这正是 knxd 社区维护 systemd/knxd.udev 设备清单的方式。

【免费下载链接】knxd项目地址: https://gitcode.com/gh_mirrors/kn/knxd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询