Arduino实现mDNS广播触发avahi记录冲突报错及运行不稳定问题排查
问题根因
- SRV记录结构不符合mDNS规范
按照RFC 6763 DNS-SD规范,_apple-midi._udp.local是服务类型名称,仅用于PTR记录的所有者字段,而SRV记录的所有者字段应该是服务实例名,格式为[设备名]._apple-midi._udp.local。你当前代码中SRV记录的所有者字段直接填了服务类型名称,和PTR记录的所有者重复,导致avahi认为收到了同一名下的冲突记录,触发重置逻辑。 - 公告发送频率严重超标
mDNS规范要求,设备完成网络连接后仅需在启动阶段发送2次间隔1s的公告,后续常规公告间隔为120s。你当前代码每750ms就发送一次全量公告,高频发送的相同记录会被avahi判定为其他设备发起的记录抢占,持续触发冲突检测。 - Cache-Flush位使用不当
你给所有记录都添加了Cache-Flush标记,该标记的作用是通知接收方立即覆盖同一名下的旧缓存。你高频发送带该标记的相同记录,会反复触发avahi的缓存重置流程,既导致报错,也会让avahi-browse的展示结果随机波动。
修复建议
- 修改SRV记录的所有者字段,将前缀改为你的设备名
mymdnstest,完整所有者为mymdnstest._apple-midi._udp.local - 将公告发送间隔从750ms调整为120000ms(120秒),启动时可以额外多发送2次间隔1秒的公告加快发现速度
- 仅在首次公告、IP地址变更时为记录添加Cache-Flush标记,常规周期性公告可以不带该标记
内容的提问来源于stack exchange,提问作者Folkert van Heusden
相关产品推荐
相关产品推荐

