极物科技 | knxd - TCP与Unix Socket接口对接
前言
KNX 作为国际标准(ISO/IEC 14543-3)拥有完全开放的协议规范与蓬勃的开源生态,knxd 正是这一开放性的最好注脚------一台普通 Linux 设备即可变身 KNX 路由器。
极物科技的产品同样构建在开放标准之上:自研 KNX 主机的极物 OS 原生支持 KNXnet/IP 路由与隧道双通道,与 knxd、ETS 等主流工具链无缝互通;配套鸿蒙、苹果、安卓三端原生 APP,深度接入 Apple HomeKit 与小度生态,支持主机远程调试------工程调试不受任何私有协议锁定。
一句话概述:本文回答"第三方程序如何直接连上knxd收发KNX报文",给出从报文格式到并发模型的完整对接方案。
本文聚焦于 knxd 的 TCP(6720端口)与 Unix Socket 应用接口,涵盖EIBnet/IP Socket报文格式、连接管理、多客户端并发、地址池租用机制,以及C语言对接示例与保活设计。

1. 接口总览
knxd 为本机/局域网应用提供两种服务接口:
| 接口 | 地址 | 适用场景 |
|---|---|---|
| TCP Socket | 主机IP:6720 |
跨主机访问、容器环境 |
| Unix Socket | /var/run/knxd |
同机进程,零网络开销 |
两个接口背后是同一套 EIBnet/IP Socket 报文格式(继承自eibd),学会一种即通吃。
2. 报文格式
2.1 帧结构
客户端与knxd之间传输的是 EIBnet/IP 报文头 + EMI帧:
text
┌─────────────┬──────────────┬─────────────┬────────────┬──────────────┐
│ 头长度(1B)=4 │ 协议版本(1B)=0x10 │ 服务类型(2B) │ 总长度(2B) │ EMI帧(N B) │
└─────────────┴──────────────┴─────────────┴────────────┴──────────────┘
常用服务类型:
| 服务类型 | 值 | 方向 |
|---|---|---|
| EIBNETDP_ACK | 0x0401 | knxd→客户端(确认) |
| TUNNEL_REQUEST | 0x0420 | 双向(数据帧) |
| EIBNETDP_DISCONNECT | 0x0409 | 双方(断开) |
2.2 完整示例
以"向组地址写入1字节"为例,一次交互:
text
客户端 → knxd(TUNNEL_REQUEST 0x0420):
27 10 00 15 04 71 00 00 11 00 bc e0 00 17 00 25 02 00 81
knxd → 客户端(EIBNETDP_ACK 0x0401):
27 10 00 08 04 01 00 00
其中EMI帧(从第9字节起)就是标准CEMI:11 00 bc e0 00 17 00 25 02 00 81------控制域、源/目的地址、TPCI/APCI与数据,与《KNX协议 - CEMI报文格式详解》一脉相承。
3. 连接生命周期
text
① connect() 建立TCP/Unix连接
② 客户端发送 OPEN(0x0420控制通道) → knxd从地址池分配个体地址并ACK
③ 双方以"发送→ACK"方式交换数据帧(每个方向独立计数)
④ 客户端发送 DISCONNECT → 释放地址池名额
3.1 地址池租用
每个Socket客户端从 [main] client-addrs 池租用一个个体地址(如15.15.3)。这个地址用于:
- knxd为客户端代发总线帧时的源地址;
- 总线设备回读应答时的寻址依据。
工程含义:地址池=并发上限。监控工具+应用+脚本同时挂机时,池子要预留足够数量。
3.2 ACK机制
Socket链路上每个数据帧都必须被ACK,未ACK的帧需重发。注意ACK只表示knxd已收到,不代表总线传输成功------若需确认总线侧结果,应监听总线回读应答(GroupValueResponse)。
4. C语言对接示例
一个最小可用的"连接并发送"骨架:
c
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = { .sin_family = AF_INET,
.sin_port = htons(6720) };
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
connect(fd, (struct sockaddr *)&addr, sizeof(addr));
/* OPEN:请求打开socket通道 */
uint8_t open[] = { 0x04, 0x07, 0x11, 0x00 }; /* hdr=4 ver=0x10? 见下 */
/* 实际实现按knxd源码约定构造,此处为结构示意 */
/* 向 1/1/1 写入 bit=1 */
uint8_t frame[] = {
0x27, 0x10, 0x00, 0x15, /* len=4? ver? svc=OPEN */
0x00, 0x15, /* 总长21 */
0x04, 0x71, 0x00, 0x00, /* 通道=0 seq=0 */
0x11, 0x00, 0xbc, 0xe0, 0x00, 0x17, /* CEMI头 */
0x00, 0x81, 0x01 /* GA=0x0017(1/1/1) APCI=write val=1 */
};
write(fd, frame, sizeof(frame));
💡 生产实现建议直接参考 knxd 自带的
libeibclient(knxd-tools同款客户端库),封装了OPEN/ACK/序号管理等全部细节,比手写协议稳妥得多。
4.1 多客户端并发模型
text
┌── 客户端A(主控APP) ── 租用 15.15.1
knxd ◀─TCP:6720──┼── 客户端B(监控脚本) ── 租用 15.15.2
└── 客户端C(调试工具) ── 租用 15.15.3
↓ 同一份总线流量镜像给所有客户端
knxd会把总线收到的报文转发给所有在线Socket客户端------这一特性让"旁路监控"零成本实现:写一个只收不发的客户端,即可完整记录总线行为。
5. 保活与容错
- TCP层:开启SO_KEEPALIVE,防止NAT/防火墙静默掐断;
- 应用层:客户端定期发送心跳帧(或周期性读取某状态地址),检测链路活性;
- 重连策略:断开后指数退避重连(1s→2s→4s...上限30s),重连成功后重新走OPEN流程租地址;
- 优雅退出:程序退出务必发送DISCONNECT释放地址池,否则池子会被僵尸连接占满。
6. 常见问题
| 现象 | 原因 | 处置 |
|---|---|---|
| 连接成功但发帧无ACK | 帧头服务类型错误 | 对照第2节格式逐字节核对 |
| 运行一段时间后连不上 | 地址池耗尽 | 扩大client-addrs,清理僵尸连接 |
| 收不到总线报文 | 只发了OPEN未订阅成功 | 核对OPEN流程与通道协商 |
| 跨主机连不上 | 6720未放行 | 防火墙放行TCP 6720 |
| 报文时通时断 | NAT超时 | 启用keepalive+应用层心跳 |
7. 注意事项
- 接口安全:TCP 6720无鉴权,暴露公网等于把总线控制权送人------仅内网开放,跨网段加防火墙白名单;
- Unix Socket权限:同机对接优先Unix Socket,注意socket文件的属组权限;
- 不要绕过ACK机制:跳序号、不等ACK连发都会触发knxd丢帧保护;
- 监控客户端零发送:旁路监控程序不要向总线发任何写帧,避免干扰调试现场;
- 与组播并存:Socket客户端的帧同样会进入组播路由域,注意与其他路由设备的地址规划不冲突。
8. 相关文档
- 《极物科技 | knxd - 部署与配置完全指南》
- 《极物科技 | knxd - knxtool命令行调试工具全解》
- 《极物科技 | KNX协议 - CEMI报文格式详解》
- 《极物科技 | KNX协议 - APCI指令与数据点类型DPT详解》
关于极物科技(ZEEWO)
极物科技(Zeewo)致力于为用户提供智能控制系统及硬件产品。我们以总线系统为技术底座,以**"稳定、可靠、快速响应"**为产品底线,是国内少有的拥有 KNX、DALI 全套软硬件自主研发能力的厂商之一。
我们的核心能力:
- 系统架构:自研极物 OS,支持多协议无界融合(KNX/DALI/CAN/RS485/IP)。
- 核心硬件:带双路 DALI 的 KNX 主机、超薄全金属定制面板、各类智选传感器及网关。
- 生态互联:深度融入 Apple HomeKit、Matter、小度、HomeAssistant 及纯血鸿蒙生态。
- 调试交付:独家支持 ETS 导出 XML 直接导入进行 APP 免编程调试,支持远程 WEB 运维。
我们的市场覆盖:
服务网点已覆盖全国核心城市(含长三角、珠三角、成渝等),并以高品质的方案深耕家居生活、酒店民宿、企业办公、疗愈康养、餐馆会所等多个细分领域。


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