- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个IoT解决方案,其中将有多个设备连接到我的本地网络,我想连接到控制我的解决方案的集线器。
连接新设备后,我想将其与集线器连接,并为其命名以进行标识。我想以自动方式实现检测(因此,我不必手动输入IP地址)。作为示例,当网络中存在Chromecast时,我可以在手机的流式应用程序中看到它。因此,我想做类似的事情将集线器与设备连接起来。
到目前为止,我的想法是这样做的两种方法:
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似乎无法正常工作。那么,如何才能很好地识别设备?
最佳答案
我们没有发现局域网中设备的唯一方法。
通常,设备不扫描网络,而是使用多播或广播协议(protocol)来宣布它们的存在,或者在(通常是外部的)预配置服务器上会合。
一些设备使用mDNS-宽松地基于DNS协议(protocol),它们会多播数据包以通告其在网络上的存在。苹果在其产品中使用mDNS。它在Android上支持不佳,并且在Windows上需要其他软件。 mDNS名称通常在.local
域中。
某些设备使用UPNP和SSDP-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/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!