在Web浏览器中检测IoT设备?


11

最近,我从小米那里买了几个无线中继器。到目前为止,尽管它们表现稳定,但我真的不喜欢小米的应用程序。但是,我很喜欢它实际上可以在LAN和Internet上运行的想法。考虑到小米的服务器在中国,在局域网中时,它们可以快速打开和关闭。

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

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

但是,奇怪的是,“困难的”部分(从LAN外部打开和关闭中继)很难通过MQTT服务器解决。但是我不希望不依赖外部MQTT服务器。如果我在局域网上,我想直接与中继交谈。如果不是,则通过MQTT发送命令。

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


1
欢迎来到hjf网站!目前,您的问题很广泛。如果您可以更具体一些,这将有所帮助:例如,您当前正在使用哪种语言,以及遇到什么错误/特定问题?
匿名2

1
@ anonymous2好,这是一个非常笼统的问题。我不想特别问“我可以直接从浏览器进行mDNS查询吗?” 因为答案是否定的 对此有一个标准,但没有实现。我正在寻找替代品或类似功能。
hjf

已知的MDNS主机名可以在OSX或支持它们的大多数Linuces操作系统上运行的浏览器中正常运行,尽管浏览可能无法正常工作。当然,除非安装了其他功能,否则它们将无法在不支持它们的操作系统(例如Windows或Android)上运行。
克里斯·斯特拉顿

Answers:


6

我不知道浏览器内置的任何通用本地发现功能。实际上,我认为任何功能都是安全性极高的功能,因为它允许攻击者远程配置您的网络,除非它具有手动交互步骤来启动该网络,这确实会减慢我认为您想要的工作流程。

我可以想到两件事:

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

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

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

尽管它不能满足您的所有本地要求,但我认为即使在本地操作时,也可以使用云代理方法,这将为用户带来更流畅的体验。


好答案。不是我一直在寻找,但这是我所期望的。W3C提供了NSD API,但唯一的实现是针对Google Chrome Apps。我
hjf

看来NSD API已从文档中
删除

此处提出的安全性理论具有倒退的含义:如果存在问题,则不是进行发现(浏览器)的事情,而是使自身可被发现的事情。欢迎您对可发现性的智慧发表自己的看法,但值得注意的是,这是许多个人计算机,打印机和其他设备的极为常见的默认行为。授权方操作的浏览器查找(或不查找)某些内容的意愿并没有说明未授权方发现设备的能力。
克里斯·斯特拉顿

2

如果您在设备上具有Web界面,并通过bonjour或avahi等MDNS响应程序服务将其配置为具有MDNS主机名,则可以从功能丰富的操作系统中将浏览器指向

https://livingroomlight.local

或您将其配置为自称的任何内容。

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

但是,除非您安装了附加的MDNS支持,否则这将无法在Windows上使用,尽管它可以为支持该功能的Android定制浏览器应用程序,但它不适用于现有的Android浏览器。

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

因此,虽然似乎浏览器无法找到您的设备,但如果您只记得自己所说的设备,则可以连接到该设备,并且通过执行MDNS可能会向您显示与其所有对等设备的链接搜索本身。

或者,您可以启动终端并获得答案。为此,您可以运行一个本地守护程序,该守护程序将进行MDNS搜索,并以在回送界面上提供的链接页面的形式显示结果,因此其他任何计算机均无法访问。


1
真可惜 如果支持的话,这可以是一个替代方案。我想知道在浏览器中不支持mdns-sd的原理是什么?无论如何,我认为使事情可靠运行的唯一方法是仅使用MQTT作为发现方法。有某种“通告”端点,设备可以在其中报告自身并缓存这些答案。
hjf

这不是浏览器执行的任何操作-这是操作系统对DNS的扩展实现,这意味着浏览器(或其他任何方式)可以使用诸如livingroomlight之类的名称。本地MQTT并不能真正帮助您-某些事情将会解决收集结果并呈现出来,无论它是硬件盒,PC上的守护程序还是人。
克里斯·斯特拉顿

1
但是,Android在“应用程序”中支持mDNS。可以通过应用发送mDNS查询并获取响应。为什么没有人实现mDNS-SD并将其暴露给JS?有一个标准被撤消,仅部分实施,专门用于检测Chromecast。
hjf

1
同样,因为没有人在Web浏览器中处理MDNS;它适用于扩展了基础操作系统的DNS以支持它的已知主机名。Android并非如此,尽管它通过单独的Android独特的API为应用程序提供MDNS功能,与解析域名的方式无关。
克里斯·斯特拉顿

1
这就是我的意思。为什么没有人为此而努力呢?随着物联网越来越普遍,这种API是否有可能被特定于供应商的设备锁定并且W3C取消了该标准?
hjf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.