如何使用javascript在本地网络中发现arduino的DHCP ip

时间:2015-11-03 06:02:38

标签: javascript arduino

我正在使用arduino UNO和Ethernet Shield创建一个Web服务器来响应HTTP请求。

请求由ajax XMLHttpRequest发送。

它可以正常使用静态IP地址。 但是想要arduindo获得DHCP ip,所以我可以在任何本地网络中使用它(使用DHCP)。

我想发现在本地网络上连接的arduino的ip。 所以我可以将它用作发送HTTP请求的URL。

是否可以在javascript中执行此操作?

3 个答案:

答案 0 :(得分:3)

好的,谢谢回答上面的问题。这有助于布局网络结构和您尝试解决的问题。

问题摘要

两台计算机:1台网络服务器,其地址为动态(DHCP),1台网络客户端运行AJAX和HTML。浏览器如何找到DHCP服务器?

选项

这是一个经典问题,在整个计算机网络历史中解决了许多不同的方式。我在下面提出了一些选项。

  1. 通过TCP扫描服务器。
  2. 通过UDP扫描服务器(需要特殊的浏览器库)。
  3. 运行DNS服务器。
  4. 让Arduino发信号通知其IP。
  5. 修改您的路由器。
  6. 不要运行DHCP - 使用静态IP。
  7. tl; dr - 如果您不控制您的路由器,请使用选项6,否则使用选项5.

    选项:扫描服务器

    我假设您知道浏览器计算机的IP地址(例如,192.168.1.17)。在这种情况下,运行从192.168.1.0到192.168.1.254的所有地址(不是.255并跳过浏览器机器的IP)测试连接到端口80.这将找到子网上的每个Web服务器,请注意,如果某些其他Web服务器也在网络上侦听,您将需要一种方法来识别您的arduino响应Web请求。在大多数(252)没有Web服务器的地址上设置,测试和等待超时也需要一些时间。你最终会找到它。

    我不是这个人的粉丝,但它完成了工作。警告:如果你没有"拥有"在网络上,有人可能会因为扫描他们的机器而生气。公司,学校或其他机构可能有关于扫描网络的政策。

    选项:来自浏览器的UDP

    这个很棒,但需要一个浏览器插件和一些奇特的编码。 UDP允许用户向您的子网广播消息(在命令行尝试ping 255.255.255.255并观察机器回显其IP)。如果arduino设置为侦听特定端口上的UDP数据包,它可以回显给UDP数据包的发送方并让该用户知道它存在。这就是DNS,DHCP,ping和Apple的Bonjour的工作方式。许多基于IP的系统通过响应UDP请求来通告服务。客户端无需知道子网上服务器的地址,他们通过众所周知的UDP端口上的广播消息发现它们。

    不幸的是,这需要修改浏览器,因为出于安全原因,Javascript不支持UDP。我理解这一点并同意安全限制。但是,它已经删除了动态服务发现的一个非常好的功能。如果你在浏览器上使用Apple,你可能会找到一个可以在Arduino上运行的Bonjour模拟器,它可能会起作用(" arduino.local"可能会附加)。如果您在浏览器中使用Windows客户端,那么Windows服务发现也可能实现这一点。我不知道Linux中可用于服务发现的内容。

    我不喜欢这些修改。浏览器,Arduino(Apple,Windows或Linux),只是因为它增加了更多移动部件,而且你依靠浏览器来“知道”#34;如何找到服务。

    选项:运行DNS服务器

    这并不像听起来那么糟糕,但我不确定Arduino是否可以处理它。找到为Arduino编写的非常小的DNS服务器,让它响应DNS请求。在浏览器上,查找一个众所周知的机器名称(例如" my-arduino.lan")。通过使Arduino成为UDP服务器(处理DNS请求)并且浏览器已经具有名称解析s / w(就像地球上的每台机器一样),这基本上解决了上述UDP问题。

    我没有搜索Arduino DNS代码,它可能对Arduino来说太大了,写它可能是一个真正的PITA(痛苦的屁股)。

    选项:Arduino信号IP

    在此型号中,您可以将LCD连接到arduino,并在显示屏上显示其IP地址。或者,arduino可以(通过TCP)向网络上的众所周知的服务器(互联网或其他)发送消息,在那里报告其IP地址。您的浏览器可以查询该服务器,获取IP地址,然后直接联系Arduino。这引入了第三台机器,就像你自己的黑客形式的DDNS(如果你不熟悉它,请查阅它)。

    选项:修改路由器

    如果您拥有路由器,则可以修改路由器,为Arduino分配特定的IP地址,即使使用DHCP也是如此。 这是你最好的选择。在这里,你控制网络,可以允许Arduino在仍然修复其IP地址时启动DHCP。您必须通过您的路由器API(Web或CLI)并弄清楚如何操作,它有点难以指导您,因为有数千种类型的商用和SOHO路由器。

    如果你不控制路由器......

    选项:使用静态IP

    这个选项真的是你最好的选择。放弃DHCP,只需设置arduino的静态IP即可。只需确保您选择的IP地址不与子网上的任何其他服务器冲突。这不应该是困难的。

    我希望这会有所帮助。

答案 1 :(得分:2)

我认为最好的两个选择:

1)当arduino启动时,从DHCP获取IP地址,arduino应该连接到您提供的众所周知的服务。此外,每个设备都应该有一个ID,由您在制造过程中定义,如mac地址或部分mac地址。

所以,你可以在盒子上打印如下: 5c4e6f.my-well-know-host.com

正如我所建议的那样,每次arduino启动时,它都会尝试连接到该服务,并传递以下参数:

POST www.my-well-know-host.com ID: 5c4e6f IP: 192.168.1.55

,在该服务中,您更新DNS表以反映此关系:

5c4e6f.my-well-know-host.com - >解析为192.168.1.55

显然,从世界上任何地方来看,主机5c4e6f.my-well-know-host.com将解析为192.168.1.55,但您只能从本地网络访问它。

提示:这是某种DDNS,但有网络发现的目的。 提示2:有一个名为MyDNS的linux dns服务,其中主机只是MySQL表中的记录,易于维护。

2)网络发现

我不知道arduino是否能够做到这一点,但是,我的想法是让arduino在任何地址上侦听特定的UDP端口,如4444。

所以,你可以构建一个Windows应用程序和Android APP(我已经为另一个目的做了一个android发现,而不是arduino),或者,我还在研究的最好的解决方案是用一些javascript创建一个自定义页面代码,“查看”侦听该特定端口的设备。

这样的作品:

  • 设备从DHCP获取IP
  • 设备启动一个线程,侦听端口 4444
  • 上的广播数据包
  • 发现应用程序侦听另一个端口,例如 4445
  • 发现应用程序使用广播数据包宣布自己 4444 端口(255.255.255.255: 4444
  • 每个设备都在侦听,并使用其标识和IP到应用程序端口 4445 进行报告。

答案 2 :(得分:0)

这是一个查找<script type="text/javascript"> var ip = "<?php echo $_SERVER['SERVER_ADDR']; ?>"; alert(ip); </script> ip:

的代码
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background"
          android:drawable="@drawable/progress_bg" />
    <item
        android:id="@android:id/secondaryProgress"
        >
        <scale
            android:drawable="@drawable/progress_bg"
            android:scaleWidth="100%"/>
    </item>
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/progress_bg"/>

</layer-list>

如果您使用的是Johnny Five框架,那么您可以在该框架中找到API