gpt4 book ai didi

java - 如何检测局域网中的特定设备?

转载 作者:行者123 更新时间:2023-12-03 11:19:20 28 4
gpt4 key购买 nike

我正在构建一个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);
    }
    }
    我在这里看到的是,对于我网络中的大多数内容,返回的主机名只是IP地址,而不是我在路由器中看到的主机名。我以为可以将主机名用作识别器,以检测特定的设备并了解它们在什么位置,但是这种小的poc似乎无法正常工作。那么,如何才能很好地识别设备?
    是否已有Java(或Javascript)和ESP8266的库/解决方案? (如果实现“智能家居”设备,则感觉像是一个常见问题)。

    最佳答案

    我们没有发现局域网中设备的唯一方法。
    通常,设备不扫描网络,而是使用多播或广播协议(protocol)来宣布它们的存在,或者在(通常是外部的)预配置服务器上会合。
    一些设备使用mDNS-宽松地基于DNS协议(protocol),它们会多播数据包以通告其在网络上的存在。苹果在其产品中使用mDNS。它在Android上支持不佳,并且在Windows上需要其他软件。 mDNS名称通常在.local域中。
    某些设备使用UPNPSSDP-Belkin的Wemo系列产品可以做到这一点。 UPNP和SSDP是基于XML和SOAP的过于复杂的协议(protocol),对于RAM和处理能力有限的设备(例如ESP8266和ESP32)来说,它们是不理想的选择。
    有些设备只是使用自己的协议(protocol)。 Haiku的“Big Ass Fan”生产线可以做到这一点-他们广播带有本地协议(protocol)的UDP数据包,该协议(protocol)至少在最初很容易受到各种问题的攻击。除非您真的知道自己在做什么,否则我不建议您走这条路。其他已建立的协议(protocol)已经有机会解决了这些错误。除非您有协议(protocol)设计方面的经验,否则您将更有可能重新发明其他协议(protocol)所遇到的问题,而不是出色的 Shiny 的新可发现性协议(protocol)。
    这些类型的设备将定期广播或多播一个宣布自己的数据包,或者您正在调用“集线器”的事物将广播或多播一个请求,而这些设备将响应该请求。
    并非所有设备都提供用于直接控制所连接的LAN的接口(interface)。有些只是与远程服务器会合。在这种情况下,您可以通过要求服务器枚举它们来发现它们,然后通过该服务器进行控制。 Google的Nest产品以这种方式工作-初始配置通过蓝牙完成;之后,这些应用将通过远程服务器与设备进行通信。
    通常以这种方式进行集合的设备使用集合服务器的名称进行预配置,但是在网络供应过程中,它们也可能使用服务器的名称进行配置(通常,应用程序与它们进行通信以共享wifi凭据;它也可能共享有关以下内容的信息:集合服务器)。
    除非我们正在调试网络或进行某种类型的安全扫描,否则我们通常不扫描IP地址块中的名称或主动探测新设备。
    您描述的扫描IP地址块的过程是有问题且不可靠的。它起作用的唯一原因是某些路由器从设备的DHCP请求中选取了设备的名称(或者可以将路由器配置为知道设备的名称)。路由器还处理网络上设备的DNS,通常是将它们转发到ISP的DNS服务器或网络所有者将其配置为使用的DNS服务器。它会拦截对其名称知道并回复的设备的DNS请求,而不是将其转发到外部DNS服务器。
    您还必须了解网络配置才能正确执行此操作。网络仅是/24吗?如果是/22怎么办?还是/16?如果网络配置为/8,您是否准备扫描2 ^ 24个IP地址?
    尽管路由器可能会拦截名称和返回地址的请求,但不一定会拦截地址和返回名称的名称。
    扫描还会产生不必要的网络流量。尽管您的“集线器”扫描看起来可能不多,但是如果您运行的是来自不同制造商的多台扫描仪,则缩放效果不佳。
    如果您的“集线器”绕过路由器的DNS请求,那么它也将无法解析路由器提供的名称。
    同样,并非所有路由器都这样做。它不是Internet体系结构的一部分,而是某些路由器提供的一项便利功能。您不能依靠它工作。
    您还可以尝试对网络进行主动扫描,尝试与网络上的每个IP地址进行通信。我们这样做是为了进行网络调试,但是连续运行以检测新设备将是与网络进行交互的一种敌对方式。
    网络基础设施设备-交换机和路由器-当然会维护网络上所有 Activity 设备的列表。您可以使用SNMP(简单网络管理协议(protocol))访问这些列表,但是很少有用户交换机和路由器支持SNMP。允许使用随机软件访问网络基础结构是网络安全的噩梦。
    最好的选择是像mDNS这样的简单多播/广播协议(protocol)。请勿扫描,宣布或要求。它 react 灵敏,不会给网络造成负担,不依赖于路由器的特性,也不会使网络管理员讨厌您。

    关于java - 如何检测局域网中的特定设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64943788/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com