Ubuntu 20.04下mDNS本地缓存清除及设备在线检测技术咨询
解决mDNS缓存导致NDI设备离线检测延迟的问题
1. 主动发送mDNS查询包验证设备状态
绕过Avahi本地缓存,直接构造符合mDNS协议的UDP查询包(目标地址224.0.0.51,端口5353),查询目标NDI设备对应的服务记录(通常是_ndi._tcp.local类型)。如果在1-2秒的超时时间内未收到设备的响应包,即可判定设备已离线:
- C++可通过
libpcap或原始套接字实现数据包的发送与接收; - Java可使用
DatagramSocket完成UDP包的收发操作,注意严格遵循mDNS协议规范设置查询包的QR位(设为0表示查询)及目标设备完整域名。
2. 调整Avahi缓存超时参数
修改/etc/avahi/avahi-daemon.conf配置文件,缩短缓存条目存活时间,降低延迟:
- 找到
[server]段,添加或修改以下参数:cache-ttl=30 # 将缓存条目有效期设为30秒,可按需调小 # cache-entries-max=0 # 禁用缓存(不推荐,会增加网络开销) - 修改后重启Avahi服务:
sudo systemctl restart avahi-daemon
3. 监听Avahi服务状态回调
利用Avahi的客户端API注册监听,直接获取服务的移除事件:
- C++使用
libavahi-client库,创建AvahiServiceBrowser并注册回调函数,处理AVAHI_SERVICE_REMOVE事件; - Java可使用
JmDNS库(不依赖系统Avahi),通过ServiceListener的serviceRemoved方法监听服务下线通知。
注:该方法仅对主动发送mDNS离开(Goodbye)包的设备有效,断电等异常离线场景仍需结合其他方式补充验证。
4. 直接调用NDI SDK的设备检测接口
依托NDI自身的SDK实现设备状态检测,比依赖系统mDNS更可靠:
- 使用NDI SDK提供的
NDI_find_create_v2()等函数,定期扫描网络中的NDI设备(比如每2秒扫描一次); - 若连续多次扫描均未找到目标设备,立即触发停止录制逻辑。
内容的提问来源于stack exchange,提问作者burtmacklin16
相关产品推荐
相关产品推荐

