Dav*_*erg 5 java network-programming iot esp8266 esp8266wifi
我正在构建一个 IoT 解决方案,我将多个设备连接到我的本地网络,我想将这些设备连接到控制我的解决方案的集线器。
连接新设备后,我想将其与集线器连接并为其命名以进行识别。我想以自动方式实现检测(所以我不必手动输入 IP 地址)。例如,当网络中存在 Chromecast 时,我可以在手机的流媒体应用程序中看到它。所以我想做一些类似的事情来将集线器与设备连接起来。
到目前为止,我的想法是有两种方法可以做到这一点:
这些方法中的任何一种是否比另一种更受欢迎,在这种情况下为什么?
进行扫描时,无论我选择哪个方向,最有效的扫描方式是什么?我正在使用 Java 进行实现,到目前为止我所拥有的是:
int timeout = 100;
for (int i = 1; i < 255; i++)
{
String host = subnet + "." + i;
if (InetAddress.getByName(host).isReachable(timeout))
{
String hostname = InetAddress.getByName(host).getHostName();
String canonicalHostName = InetAddress.getByName(host).getCanonicalHostName();
System.out.println(host + " is reachable. Hostname: " + hostname + ", CanonicalHostName: " + canonicalHostName);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到的是,对于我网络中的大多数内容,返回的主机名只是 IP 地址,而不是我在路由器中看到的主机名。我想我可以使用主机名作为识别器来检测特定设备并了解它们的位置 - 但是这个小 poc 似乎不起作用。那么如何才能很好地识别设备呢?
是否有任何适用于 Java(或 Javascript)和 ESP8266 的库/解决方案可以做到这一点?(如果实施“智能家居”设备,感觉就像一个常见问题)。
我们没有单一的方法来发现局域网上的设备。
设备通常不是扫描网络,而是使用多播或广播协议来宣布它们的存在,或者它们会聚在(通常是外部)预先配置的服务器上。
一些设备使用mDNS - 松散地基于 DNS 协议,它们多播数据包以宣传它们在网络上的存在。Apple 在其产品中使用 mDNS。它在 Android 上的支持很差,并且在 Windows 上需要额外的软件。mDNS 名称通常在.local域中。
一些设备使用UPNP和SSDP - Belkin 的 Wemo 系列产品就是这样做的。UPNP 和 SSDP 是基于 XML 和SOAP 的过于复杂的协议,对于 RAM 和处理能力有限的设备(如 ESP8266 和 ESP32)来说,它们是糟糕的选择。
有些设备只是推出自己的协议。Haiku 的“Big Ass Fan”系列就是这样做的——他们使用一种自产协议广播 UDP 数据包,该协议至少在最初容易受到各种问题的影响。我不建议走这条路,除非你真的知道你在做什么。其他已建立的协议已经有机会消除错误。除非你在协议设计方面有经验,否则你更有可能重新发明其他协议所存在的问题,而不是一个美妙的闪亮的新可发现性协议。
这些类型的设备将定期广播或多播一个数据包来宣布自己,或者你称之为“集线器”的东西会广播或多播一个请求,设备会响应该请求。
并非所有设备都提供直接控制它们所连接的 LAN 的接口。有些只是与远程服务器会合。在这种情况下,您可以通过要求服务器枚举它们来发现它们,并通过该服务器控制它们。Google 的 Nest 产品就是这样工作的——初始配置是通过蓝牙完成的;之后,应用程序通过远程服务器与设备进行通信。
以这种方式集合的设备通常预先配置有集合服务器的名称,但它们也可能在网络配置期间使用服务器名称进行配置(通常应用与它们通信以共享 wifi 凭据;它也可能共享有关会合服务器也是如此)。
我们通常不会扫描 IP 地址块中的名称或主动探测新设备,除非我们正在调试网络或进行某种安全扫描。
您描述的扫描 IP 地址块的过程存在问题且不可靠。它工作的唯一原因是某些路由器从设备的 DHCP 请求中获取设备的名称(或者路由器可能被配置为知道设备的名称)。路由器还为网络上的设备处理 DNS,通常是将它们转发到 ISP 的 DNS 服务器或网络所有者配置为使用的 DNS 服务器。它拦截其知道名称的设备的 DNS 请求并自行回复,而不是将它们转发到外部 DNS 服务器。
您还必须了解网络配置才能正确执行此操作。网络只有/24吗?如果是 /22 呢?或/16?如果网络配置为 /8,您准备好扫描 2^24 个 IP 地址了吗?
尽管路由器可能会拦截对名称和返回地址的请求,但它不一定会拦截地址和返回名称的名称。
扫描还会产生不必要的网络流量。虽然您的一个“中心”扫描可能看起来不多,但如果您有来自不同制造商的多台扫描仪在运行,它就不能很好地扩展。
如果您的“集线器”绕过路由器进行 DNS 请求,那么它也将无法解析路由器提供的名称。
也并非所有路由器都这样做。它不是 Internet 架构的一部分,而是某些路由器提供的便利功能。你不能依赖它工作。
您还可以尝试主动扫描网络,尝试与其上的每个 IP 地址进行通信。我们这样做是为了网络调试,但不断运行它来检测新设备将是一种与网络交互的恶意方式。
网络基础设施设备——交换机和路由器——当然维护网络上所有活动设备的列表。您可以使用SNMP(简单网络管理协议)访问这些列表,但很少有消费者交换机和路由器支持 SNMP。允许随机软件访问您的网络基础设施是网络安全的噩梦。
最好的选择是像 mDNS 这样的简单多播/广播协议。不要扫描、宣布或请求。它反应灵敏,不会给网络带来负担,不依赖路由器的特性,不会让网络管理员讨厌你。
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |