最近,我从小米那里买了几个无线中继器。到目前为止,尽管它们很稳定,但我真的不喜欢小米的应用程序。但是,我很喜欢它实际上可以在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和端口转发的问题)。

评论

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

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

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

#1 楼

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

我可以想到两件事:


Chromecast的可发现性已融入Chrome。在引入之前,它曾经是一个单独的插件。但是,这仍然需要手动执行步骤,以使用户触发搜索,然后手动选择将设备详细信息传递回页面/ javascript。 (这在iirc的封面下使用SSDP)
WebBluetooth扫描支持。这遵循与Chromecast发现类似的模型,用户必须启动扫描,然后他们必须手动从浏览器找到的设备中进行选择,这些详细信息将传递回页面中的javascript。

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

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

评论


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

– hjf
18 Mar 7 '18 at 15:01

看来NSD API已从文档中被杀死:w3.org/TR/discovery-api

– hardillb
18 Mar 7 '18 at 17:54

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

–克里斯·斯特拉顿(Chris Stratton)
18 Mar 8 '18在4:15



#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搜索,并以仅在回送界面上提供的链接页面的形式显示结果,因此其他任何计算机均无法访问。

评论


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

– hjf
18年8月8日在11:59

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

–克里斯·斯特拉顿(Chris Stratton)
18 Mar 8 '18 at 17:46



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

– hjf
18 Mar 8 '18 at 20:52

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

–克里斯·斯特拉顿(Chris Stratton)
18 Mar 9 '18 at 0:49



这就是我的意思。为什么没有人为此而努力呢?随着物联网越来越普遍,这种API是否有可能被特定于供应商的设备锁定并且W3C取消了该标准?

– hjf
18 Mar 9 '18 at 13:52