0

0

Python 设备发现的 bonjour 集成

舞夢輝影

舞夢輝影

发布时间:2026-02-17 10:11:02

|

705人浏览过

|

来源于php中文网

原创

最稳方案是用 zeroconf:纯 python、支持 py3.7–3.12、跨平台、无需编译;注意 linux 多播禁用和 windows 防火墙拦截,服务发现需显式指定类型并调 get_service_info() 解析。

python 设备发现的 bonjour 集成

Python 里用 zeroconf 做 Bonjour 设备发现最稳

直接说结论:别碰 pybonjour(已十年没维护,Py3.8+ 编译报错),也别自己封装 dns-sd 命令行——zeroconf 是当前唯一靠谱、纯 Python、支持 Py3.7–3.12 的 Bonjour/mDNS 实现。

它底层用系统 socket 监听 5353/udp,不依赖本地 avahi-daemon 或 macOS mdnsresponder,跨平台行为一致。但要注意:Linux 默认可能禁用多播,Windows 防火墙常拦截,这是 80% 的“搜不到设备”问题根源。

  • 安装只用 pip install zeroconf,不用编译,无 C 依赖
  • 服务发现必须显式指定 ServiceBrowser 类型,比如 _http._tcp.local.,不能只写 _http
  • 回调函数里拿到的 service_name 是完整名(如 MyPrinter._ipp._tcp.local.),解析前得先调 Zeroconf.get_service_info()
  • 别在主线程直接 time.sleep(10) 等结果——ServiceBrowser 是异步的,要用 threading.Event().wait()asyncio 配合 AsyncZeroconf

ServiceInfo 解析失败常见原因

拿到服务名后调 zeroconf.get_service_info() 返回 None,不是代码写错了,大概率是网络层没通:

  • 目标设备没真正注册 mDNS 服务(用 macOS 的 dns-sd -B _http._tcp 或 Linux 的 avahi-browse -at 先确认能被系统原生命令看到)
  • Python 进程没权限发多播包(Linux 上检查 net.ipv4.ip_forwardnet.ipv4.conf.all.send_redirects 是否为 0;Docker 容器需加 --network=host
  • 服务刚上线,但 get_service_info() 调太早(mDNS 响应有毫秒级延迟),加个 time.sleep(0.2) 再查
  • 传参时类型写错:get_service_info(type, name)type 必须带结尾点(_http._tcp.local.),name 也必须带结尾点(MyPrinter._http._tcp.local.

如何避免服务监听卡死或漏事件

ServiceBrowser 启动后不退出,靠回调驱动,但默认行为容易掉事件:

小邮包 包月订购包年程序
小邮包 包月订购包年程序

小邮包-包月订购包年服务网,该程序由好买卖商城开发,程序采用PHP+MYSQL架设,程序商业模式为目前最为火爆的包月订制包年服务模式,这种包年订购在国外网站已经热火很多年了,并且已经发展到一定规模,像英国的男士用品网站BlackSocks,一年的袜子购买量更是达到了1000万双。功能:1、实现多产品上线,2、不用注册也可以直接下单购买,3、集成目前主流支付接口,4、下单发货均有邮件提醒。

下载

立即学习Python免费学习笔记(深入)”;

  • 回调函数里别做耗时操作(比如同步 HTTP 请求),否则会阻塞整个零配置事件循环——改用 threading.Threadasyncio.to_thread() 拆出去
  • 设备下线事件(remove_service)默认不触发,除非你在构造 ServiceBrowser 时传 handlers=[MyHandler] 并实现 remove_service 方法
  • 同一台机器跑多个 Python 进程监听相同服务类型?会互相干扰。每个进程必须用独立的 Zeroconf 实例,且监听端口不能冲突(可指定 addr="0.0.0.0" + port=0 让系统自动分配)
  • Windows 上如果用 WSL2,宿主机和子系统网络隔离,zeroconf 在 WSL2 里搜不到 Windows 本机广播的服务——要么全切到宿主机跑,要么启用 WSL2 的 UDP 多播转发(需 Win11 22H2+)

生产环境必须关掉的调试开关

开发时开 logging.getLogger("zeroconf").setLevel(logging.DEBUG) 很方便,但上线必须关:

  • DEBUG 日志会把每条 mDNS 包的原始 DNS 报文全打出来,IO 开销大,还可能泄露设备名/IP
  • 更隐蔽的问题:某些嵌入式设备(如 ESP32 的 Arduino mDNS 库)对高频查询敏感,DEBUG 模式下 zeroconf 会主动发 probe 查询,可能触发设备限流甚至断连
  • 关闭方式不是删日志行,而是显式设为 WARNINGlogging.getLogger("zeroconf").setLevel(logging.WARNING)
  • 如果你用 python -m zeroconf 命令行工具调试,记得它默认是 DEBUG 级,别误当生产脚本用

真要查线上 mDNS 通不通,用 tcpdump -i any port 5353 看原始包比看 Python 日志更准——毕竟 zeroconf 只是用户态解析器,链路层丢包它根本不知道。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

348

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

425

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

786

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

357

2025.07.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

94

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1135

2023.07.26

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号