通过mDNS发现Shelly设备

Shelly设备(如许多现代智能家居设备)通过mDNS(多播DNS)在本地网络上进行自我广播。在本文中,我们将解释:
什么是mDNS 以及 Shelly 设备如何使用它
如何通过mDNS发现Shelly设备(包括命令行工具)
使用 Python 进行自动发现(链接到我们的示例脚本)
故障排除与技巧
什么是mDNS?
mDNS(多播DNS)是一种在RFC 6762中定义的协议,允许设备在LAN(局域网)上相互发现无需中央 DNS 服务器。它通过在UDP 端口 5353 到一个多播组。常见的mDNS实现包括 上发送和接收类似 DNS 的查询来实现。苹果的 Bonjour和 Linux 上的Avahi。
为什么这对 Shelly 设备很重要? 因为每个 Shelly 设备都会使用特定的服务类型(_shelly._tcp.local.),任何支持mDNS的工具都可以检测到这些广播,并显示如IP地址和固件版本等详细信息,而且由于mDNS通常与 DNS-SD(有时称为其“表亲”)提供了一种按类型(例如_shelly._tcp.local.
),所以此功能对 Shelly 设备尤为重要。
如何通过mDNS发现Shelly设备
Shelly的mDNS服务类型
Shelly 设备会在此服务类型下进行广播:
代码
默认情况下,每个 Shelly 设备会公告:
_shelly._tcp.local.实例名称(服务名称)
:通常看起来像
shelly2pmg4-7c2c67640b38._shelly._tcp.local.主机名(服务器)
(例如
)Shelly2PMG4-7C2C67640B38.local.
IP 地址端口
(
)-
80TXT 记录
包含关键属性:
gen:代数(例如
)4
app:设备名称/型号(例如
)ver: Firmware版本(例如,
S2PMG4
)
1.5.99
命令行发现工具
macOS:dns-sd 对于 Shelly 服务:
代码
你会看到 Shelly 设备的显示。
dns-sd -B _shelly._tcp解析
代码
dns-sd -L "shelly2pmg4-7c2c67640b38" _shelly._tcp local
代码
Lookup shelly2pmg4-7c2c67640b38._shelly._tcp.local DATE: ---Fri 21 Feb 2025--- 10:38:08.309 ...STARTING... 10:38:08.611 shelly2pmg4-7c2c67640b38._shelly._tcp.local. can be reached at Shelly2PMG4-7C2C67640B38.local.:80 (interface 24) gen=4 app=S2PMG4 ver=1.5.99
Linux:avahi-browse如有必要,安装:
sudo apt-get update sudo apt-get install avahi-utils
浏览查找
_shelly._tcp
服务:
avahi-browse --resolve --terminate --parsable _shelly._tcp | grep "^="
这会以表格形式显示每个 Shelly 设备的 IP、端口和 TXT 数据(包括 gen、app、ver)。你会看到类似如下内容:
=;eth0;IPv4;ShellyWallDisplay-00A90BA7352B;_shelly._tcp;local;ShellyWallDisplay-00A90BA7352B.local;192.168.1.134;80;"discoverable=false" "ver=2.3.1" "gen=2" "app=WallDisplay" =;eth0;IPv4;ShellyWallDisplay-000822858F3D;_shelly._tcp;local;ShellyWallDisplay-000822858F3D.local;192.168.7.208;80;"discoverable=false" "ver=2.3.2" "gen=2" "app=WallDisplay" =;eth0;IPv6;shellypstripg4-7c2c67642200;_shelly._tcp;local;ShellyPStripG4-7C2C67642200.local;fd62:7244:6b44:daec:7e2c:67ff:fe64:2200;80;"ver=1.5.99-dev113814" "app=PowerStrip" "gen=4" =;eth0;IPv6;shelly2pmg4-7c2c677a0220;_shelly._tcp;local;Shelly2PMG4-7C2C677A0220.local;fd62:7244:6b44:daec:7e2c:67ff:fe7a:220;80;"ver=1.5.99-dev114895" "app=S2PMG4" "gen=4" =;eth0;IPv4;shelly2pmg4-7c2c677a0220;_shelly._tcp;local;Shelly2PMG4-7C2C677A0220.local;192.168.9.14;80;"ver=1.5.99-dev114895" "app=S2PMG4" "gen=4" =;eth0;IPv4;shellyhtg3-84fce63f8908;_shelly._tcp;local;ShellyHTG3-84FCE63F8908.local;192.168.9.209;80;"ver=1.1.0" "app=HTG3" "gen=3" =;eth0;IPv4;ShellyWallDisplay-00A90BA735AC;_shelly._tcp;local;ShellyWallDisplay-00A90BA735AC.local;192.168.2.7;80;"discoverable=false" "ver=2.3.0" "gen=2" "app=WallDisplay"
使用 Python 进行自动发现
对于完全自动化的方法,请尝试我们的示例 Python 脚本,它使用了zeroconf 库和rich 库:
扫描在可配置的时间窗口内的_shelly._tcp.local.收集
每个设备的主机名、IP 地址、TXT 记录等。排序
它们(可选)按代数、固件版本、设备名称等。打印
示例用法 一个包含所有已发现 Shelly 设备的彩色表格。
代码:
--scan-time 15
表示扫描持续 15 秒。
--sort gen按 TXT 记录中的
gen字段排序结果。
你会看到如下输出:
代码
服务名称 服务器IP地址 端口 设备名称 版本 代数 其他属性 ----------------------- --------------------------- ----------------- ---- ----------- -------- --- ----------------- shelly2pmg4-7c2c67640b38 Shelly2PMG4-7C2C67640B38.local. 192.168.1.15 80 S2PMG4 1.5.99 4 N/A ... 发现的设备总数:1
检查组播流量
某些路由器或防火墙会阻止
UDP 端口 5353同一网络段(mDNS使用)。请确保您的防火墙和网络设置允许多播流量。
确保
解析器(你的电脑或脚本)和处于Shelly 设备同一二层子网。组播数据包通常不会穿越 VPN或网络段,除非特别配置。测试其他工具
如果
Python 脚本找不到设备,或者你想用其他工具测试,试试dns-sd
(macOS)或
avahi-browse耐心等待
(Linux)以确认Shelly设备确实通过mDNS进行自我广播。
扫描时间更长一些
Shelly 设备可能需要几秒钟才能响应。如果你怀疑有设备未显示,(例如 15–30 秒)。我们重视您的反馈!
感谢您花时间阅读我们的文章!它是否对您有帮助或有趣?
您的见解能帮助我们改进。我们非常感激任何反馈。如果您有时间,
请通过以下电子邮件与我们分享:
Integration@shelly.com