Falcon.NET无法识别已存在的KNX IP端点问题求助
解决Falcon.NET KNX库IpDeviceDiscovery.DiscoverAsync返回空数组的问题
问题背景
使用Falcon.NET KNX库连接KNX IP端点时,隧道模式可正常通信,但调用IpDeviceDiscovery.DiscoverAsync()枚举设备时,Wireshark可捕获到UDP 3761端口的请求与响应,但返回结果始终为空数组。相关代码如下:
var ipDiscovery = new IpDeviceDiscovery { Timeout = TimeSpan.FromSeconds(1) }; var ipDeviceDiscoveryTask = ipDiscovery.DiscoverAsync(cancel); var result = await ipDeviceDiscoveryTask.ToArray();
可行解决方向
1. 延长超时时间
当前设置的1秒超时可能过短,尤其是在网络存在延迟或设备响应较慢时。尝试将超时调整为3-5秒:
var ipDiscovery = new IpDeviceDiscovery { Timeout = TimeSpan.FromSeconds(3) // 延长超时窗口 };
2. 指定本地绑定的网卡/IP
若运行程序的设备存在多网卡,IpDeviceDiscovery可能绑定到了无法接收KNX响应的网卡上。手动指定本地监听IP:
// 替换为本地能接收KNX设备响应的网卡IP var localListenIp = IPAddress.Parse("192.168.30.100"); var ipDiscovery = new IpDeviceDiscovery(localListenIp) { Timeout = TimeSpan.FromSeconds(3) };
3. 排查取消令牌状态
确认cancel令牌没有在发现过程中被意外触发,可临时移除取消令牌测试:
var result = await ipDiscovery.DiscoverAsync(CancellationToken.None).ToArray();
4. 检查本地防火墙权限
即使Wireshark能捕获数据包,程序可能被防火墙阻止接收UDP 3761端口的入站响应。检查防火墙规则,确保程序允许接收该端口的UDP流量。
5. 手动实现KNX设备发现(绕过库的解析逻辑)
由于库的DiscoverAsync方法已混淆无法调试,可自行实现UDP发现逻辑:
using (var udpClient = new UdpClient(0)) { udpClient.EnableBroadcast = true; // KNX标准搜索请求包格式 var discoverPacket = new byte[] { 0x06, 0x10, 0x02, 0x01, 0x00, 0x00 }; var broadcastEp = new IPEndPoint(IPAddress.Broadcast, 3761); await udpClient.SendAsync(discoverPacket, discoverPacket.Length, broadcastEp); udpClient.Client.ReceiveTimeout = 3000; try { var response = await udpClient.ReceiveAsync(); var deviceIp = response.RemoteEndPoint.Address; // 可根据KNX规范进一步解析响应包获取设备详细信息 Console.WriteLine($"发现KNX设备:{deviceIp}"); } catch (SocketException ex) { Console.WriteLine("未收到设备响应:" + ex.Message); } }
内容的提问来源于stack exchange,提问作者Dmitri Nesteruk
相关产品推荐
相关产品推荐

