在网络浏览器中检测物联网设备?

物联网 MQTT ESP8266 智能插头
2021-05-30 00:07:57

最近我从小米买了几个wifi继电器。虽然到目前为止它们一直很稳定,但我真的不喜欢小米的应用程序。但是,我确实喜欢它实际上在 LAN 和 Internet 上都可以工作的想法。考虑到小米的服务器在中国,在 LAN 中它们的打开和关闭速度非常快。

所以我想推出我自己的基于 ESP8266 的继电器(我知道我可以准备好硬件,所以这是一个奖励)。我的问题是,如何从网页自动检测网络上的继电器?

从“应用程序”我可以使用 SSDP、mDNS-SD 或 UPNP 来检测事物。但是我还没有找到有关这是否可以从网络浏览器(基本上是 Android 上的 Chrome)中实现的信息。自从我将气象站网页更改为渐进式 Web 应用程序后,我就被迷住了。我真的很喜欢这样的想法,即事物只是网页而不是您必须安装的应用程序。PWA 也填补了离线模式的空白。

奇怪的是,通过 MQTT 服务器解决“困难”部分(从 LAN 外部打开和关闭继电器)是微不足道的。但我不想依赖外部 MQTT 服务器。如果我在 LAN 上,我想直接与中继通话。如果没有,则通过 MQTT 发送命令。

当然,我可以依靠服务器来查询中继,但在这种情况下,我需要互联网连接(如果我的 MQTT 服务器在“云”上),或家庭托管服务器。我家里确实有一台服务器,即使我没有,树莓派也可以轻松填补这一空白。但理想的情况是在通过 LAN(在这种情况下为 Wifi)与设备通话时甚至不需要服务器。我更喜欢尽可能保持P2P,并且只在我在WAN上时使用MQTT作为后备(MQTT解决了CG-NAT和端口转发的问题)。

2个回答

我不知道浏览器内置的任何通用本地发现功能。事实上,我认为任何功能都是一种安全性,因为它允许攻击者远程分析您的网络,除非它有手动交互步骤来启动它,这会真正减慢我认为您的目标的工作流程。

我可以想到两件事很接近:

  1. Chromecast 的可发现性已融入 Chrome。这曾经是一个单独的插件,然后才被推出。但这仍然需要一个手动步骤到用户触发搜索的地方,然后手动选择要传递回页面/javascript 的设备详细信息。(这在 iirc 下使用 SSDP)

  2. WebBluetooth 扫描支持。这遵循与 Chromecast 发现类似的模型,用户必须启动扫描,然后他们必须从浏览器找到的设备中手动选择哪些详细信息将传递回页面中的 javascript。

我使用 WebBluetooth 方法来发现本地灯开关(我在 pi 零上有一个 BLE 应用程序,用于控制 Belkin WeMo 灯泡https://github.com/hardillb/physical-web-lightswitch)。它可以工作,但不是无缝的,因为它需要至少 2 个用户交互才能发现单个设备。

虽然它不能满足您所有的本地要求,但我认为即使在本地操作时使用云代理方法也会获得更流畅的用户体验。

如果您的设备上有 Web 界面,并通过 MDNS 响应程序服务(例如 bonjour 或 avahi)将其配置为具有 MDNS 主机名,那么在功能强大的操作系统中,您只需将浏览器指向

https://livingroomlight.local

或者你配置它来调用它自己的任何东西。

这将在 OSX、iOS 和大多数 Linuces 上运行的浏览器开箱即用,所有这些都支持系统级别的 MDNS 主机名解析。

但是,除非您安装附加的 MDNS 支持,否则这将无法在 Windows 上运行,并且它不适用于现有的 Android 浏览器,尽管可以为支持它的 Android 制作自定义浏览器应用程序。

浏览器通常不支持发现网络上的未知实例,但通常通过操作系统 API 和命令行工具dns-sd(OSX) 和avahi-browse(Linux))提供支持。

因此,虽然浏览器可以找到您的设备似乎并不明显,但如果您能简单地记住您对其中一个设备的称呼,您就可以连接到它,并且它可能会通过执行 MDNS 向您显示指向所有对等设备的链接搜索本身。

或者您可以启动终端并获得答案。就此而言,您可以运行一个本地守护程序,它会执行 MDNS 搜索并将结果显示为在环回接口上提供的链接页面,因此任何其他机器都无法访问。