我正在使用arduino UNO和Ethernet Shield创建一个Web服务器来响应HTTP请求。
请求由ajax XMLHttpRequest发送。
它可以正常使用静态IP地址。 但是想要arduindo获得DHCP ip,所以我可以在任何本地网络中使用它(使用DHCP)。
我想发现在本地网络上连接的arduino的ip。 所以我可以将它用作发送HTTP请求的URL。
是否可以在javascript中执行此操作?
答案 0 :(得分:3)
好的,谢谢回答上面的问题。这有助于布局网络结构和您尝试解决的问题。
两台计算机:1台网络服务器,其地址为动态(DHCP),1台网络客户端运行AJAX和HTML。浏览器如何找到DHCP服务器?
这是一个经典问题,在整个计算机网络历史中解决了许多不同的方式。我在下面提出了一些选项。
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允许用户向您的子网广播消息(在命令行尝试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;如何找到服务。
这并不像听起来那么糟糕,但我不确定Arduino是否可以处理它。找到为Arduino编写的非常小的DNS服务器,让它响应DNS请求。在浏览器上,查找一个众所周知的机器名称(例如" my-arduino.lan")。通过使Arduino成为UDP服务器(处理DNS请求)并且浏览器已经具有名称解析s / w(就像地球上的每台机器一样),这基本上解决了上述UDP问题。
我没有搜索Arduino DNS代码,它可能对Arduino来说太大了,写它可能是一个真正的PITA(痛苦的屁股)。
在此型号中,您可以将LCD连接到arduino,并在显示屏上显示其IP地址。或者,arduino可以(通过TCP)向网络上的众所周知的服务器(互联网或其他)发送消息,在那里报告其IP地址。您的浏览器可以查询该服务器,获取IP地址,然后直接联系Arduino。这引入了第三台机器,就像你自己的黑客形式的DDNS(如果你不熟悉它,请查阅它)。
如果您拥有路由器,则可以修改路由器,为Arduino分配特定的IP地址,即使使用DHCP也是如此。 这是你最好的选择。在这里,你控制网络,可以允许Arduino在仍然修复其IP地址时启动DHCP。您必须通过您的路由器API(Web或CLI)并弄清楚如何操作,它有点难以指导您,因为有数千种类型的商用和SOHO路由器。
如果你不控制路由器......
这个选项真的是你最好的选择。放弃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创建一个自定义页面代码,“查看”侦听该特定端口的设备。
这样的作品:
答案 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