如何使用 javascript 在本地网络中发现 arduino 的 DHCP ip
How to discover a DHCP ip of an arduino in local network with javascript
我正在使用 arduino UNO 和 Ethernet Shield 创建一个 Web 服务器来响应 HTTP 请求。
请求由 ajax XMLHttpRequest 发送。
使用静态 IP 地址工作正常。
但是我想让 arduindo 获得一个 DHCP ip,这样我就可以在任何本地网络(使用 DHCP)中使用它。
我想查询连接在本地网络上的arduino的ip。
所以我可以将它用作 url 来发送 HTTP 请求。
是否可以在 javascript 中做到这一点?
这是查找 server
ip 的代码:
<script type="text/javascript">
var ip = "<?php echo $_SERVER['SERVER_ADDR']; ?>";
alert(ip);
</script>
如果您使用的是 Johnny Five 框架,那么您可以在该框架中找到 API
好的,感谢您回答我上面的问题。这有助于布局网络结构和您要解决的问题。
问题总结
两台计算机:1 台地址为动态 (DHCP) 的网络服务器和 1 台网络客户端 运行正在 AJAX 和 HTML。浏览器如何找到 DHCP 服务器?
选项
这是一个经典问题,在整个计算机网络的历史中都以许多不同的方式解决。我在下面提出了一些建议。
- 通过 TCP 扫描服务器。
- 通过UDP扫描服务器(需要特殊的浏览器库)。
- 运行 DNS 服务器。
- 让 Arduino 发出其 IP 信号。
- 修改你的路由器。
- 不要 运行 DHCP - 使用静态 IP。
tl;dr - 如果您不控制路由器,请使用选项 6,如果您控制,请使用选项 5。
选项:扫描服务器
我假设您知道浏览器计算机的 IP 地址(例如 192.168.1.17)。在这种情况下,运行 通过从 192.168.1.0 到 192.168.1.254 的所有地址(不是 .255 并跳过浏览器计算机的 IP)测试到端口 80 的连接。这将找到子网上的每个 Web 服务器,因此请注意,您需要一种方法来识别您的 arduino 是否响应了网络请求,以防其他网络服务器也在网络上侦听。在大多数(252 个)没有 Web 服务器的地址上设置、测试和等待超时也需要一些时间。你最终会找到它的。
我不是这个的粉丝,但它完成了工作。警告:如果你没有 "own" 网络,有人可能会因为你扫描他们的机器而生你的气。公司、学校或其他机构可能有关于不扫描网络的政策。
选项:来自浏览器的 UDP
这个很棒,但需要浏览器插件和一些花哨的编码。 UDP 允许向您的子网广播消息(在命令行尝试 ping 255.255.255.255
并观察机器回显其 IP)。如果 arduino 设置为在特定端口上侦听 UDP 数据包,它可以回显 UDP 数据包的发送者并让该用户知道它存在。这就是 DNS、DHCP、ping 和 Apple 的 Bonjour 的工作方式。许多基于 IP 的系统通过响应 UDP 请求来发布服务。客户端不需要知道子网上服务器的地址,它们通过众所周知的 UDP 端口上的广播消息发现它们。
不幸的是,这需要修改浏览器,因为 Javascript 出于安全原因不支持 UDP。我理解这一点并同意安全限制。但是,它删除了一个非常好的动态服务发现功能。如果您在浏览器上使用 Apple,您可能会找到一个 Bonjour 模拟器,您可以在 Arduino 上 运行 并且它可能会工作("arduino.local" 可能会附加)。如果您的浏览器使用 Windows 客户端,那么 Windows 服务发现也可能实现这一点。我不知道 Linux 中有什么可用于服务发现。
我不喜欢你的这些修改。浏览器,Arduino(Apple,Windows 或 Linux),只是因为它添加了更多移动部件,而您指望浏览器"know" 如何找到服务。
选项:运行 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 在 DHCP 中启动,同时仍然固定其 IP 地址。您必须通过您的路由器 API(Web 或 CLI)并弄清楚如何操作,这有点难指导您,因为有成千上万种类型的商业和 SOHO 路由器。
如果您不控制路由器...
选项:使用静态 IP
这个选项真的是你最好的选择。放弃 DHCP,只设置 arduino 的静态 IP。只需确保您选择的 IP 地址不与子网上的任何其他服务器冲突。那应该不难。
希望对您有所帮助。
我认为最好的2个选项:
1) 当 arduino 启动时,从 DHCP 获取 IP 地址,arduino 应该连接到您提供的众所周知的服务。此外,每个设备都应该有一个 ID,由您在制造过程中定义,例如 mac 地址或 mac 地址的一部分。
因此,您可以在包装盒上打印如下内容:5c4e6f.my-well-know-host.com
然后,正如我所建议的,每次 arduino 启动时,它都会尝试连接到该服务传递参数,例如:
POST www.my-众所周知-host.com
编号:5c4e6f
IP: 192.168.1.55
然后,在该服务中,您更新 DNS table 以反映此关系:
5c4e6f.my-众所周知-host.com -> 解析为 192.168.1.55
显然,在世界任何地方,主机 5c4e6f.my-众所周知-host.com 将解析为 192.168.1.55,但您只能从本地网络访问它。
提示:这是某种 DDNS,但具有网络发现功能。
Tip2: 有一个叫MyDNS的linux dns服务,其中的hosts只是记录在MySQL table里面,方便维护。
2) 网络发现
我不知道 arduino 是否能够做到这一点,但是,我的想法是让 arduino 在任何地址上监听特定的 UDP 端口,比如 4444。
因此,您可以构建一个 windows 应用程序和 Android 应用程序(我已经为另一个目的做了一个 android 发现,而不是 arduino),或者,最好的解决方案我仍在研究,是用一些 javascript 代码制作一个自定义页面,"looks" 用于侦听该特定端口的设备。
这样工作:
- 设备从 DHCP 获取 IP
- 设备启动一个线程监听端口4444
上的广播数据包
- 发现应用程序在另一个端口上侦听,例如 4445.
- 发现应用程序使用广播数据包向 4444 端口 (255.255.255.255:4444)
宣布自己
- 每个侦听的设备,将其标识和 IP 报告回应用程序端口 4445。
我正在使用 arduino UNO 和 Ethernet Shield 创建一个 Web 服务器来响应 HTTP 请求。
请求由 ajax XMLHttpRequest 发送。
使用静态 IP 地址工作正常。 但是我想让 arduindo 获得一个 DHCP ip,这样我就可以在任何本地网络(使用 DHCP)中使用它。
我想查询连接在本地网络上的arduino的ip。 所以我可以将它用作 url 来发送 HTTP 请求。
是否可以在 javascript 中做到这一点?
这是查找 server
ip 的代码:
<script type="text/javascript">
var ip = "<?php echo $_SERVER['SERVER_ADDR']; ?>";
alert(ip);
</script>
如果您使用的是 Johnny Five 框架,那么您可以在该框架中找到 API
好的,感谢您回答我上面的问题。这有助于布局网络结构和您要解决的问题。
问题总结
两台计算机:1 台地址为动态 (DHCP) 的网络服务器和 1 台网络客户端 运行正在 AJAX 和 HTML。浏览器如何找到 DHCP 服务器?
选项
这是一个经典问题,在整个计算机网络的历史中都以许多不同的方式解决。我在下面提出了一些建议。
- 通过 TCP 扫描服务器。
- 通过UDP扫描服务器(需要特殊的浏览器库)。
- 运行 DNS 服务器。
- 让 Arduino 发出其 IP 信号。
- 修改你的路由器。
- 不要 运行 DHCP - 使用静态 IP。
tl;dr - 如果您不控制路由器,请使用选项 6,如果您控制,请使用选项 5。
选项:扫描服务器
我假设您知道浏览器计算机的 IP 地址(例如 192.168.1.17)。在这种情况下,运行 通过从 192.168.1.0 到 192.168.1.254 的所有地址(不是 .255 并跳过浏览器计算机的 IP)测试到端口 80 的连接。这将找到子网上的每个 Web 服务器,因此请注意,您需要一种方法来识别您的 arduino 是否响应了网络请求,以防其他网络服务器也在网络上侦听。在大多数(252 个)没有 Web 服务器的地址上设置、测试和等待超时也需要一些时间。你最终会找到它的。
我不是这个的粉丝,但它完成了工作。警告:如果你没有 "own" 网络,有人可能会因为你扫描他们的机器而生你的气。公司、学校或其他机构可能有关于不扫描网络的政策。
选项:来自浏览器的 UDP
这个很棒,但需要浏览器插件和一些花哨的编码。 UDP 允许向您的子网广播消息(在命令行尝试 ping 255.255.255.255
并观察机器回显其 IP)。如果 arduino 设置为在特定端口上侦听 UDP 数据包,它可以回显 UDP 数据包的发送者并让该用户知道它存在。这就是 DNS、DHCP、ping 和 Apple 的 Bonjour 的工作方式。许多基于 IP 的系统通过响应 UDP 请求来发布服务。客户端不需要知道子网上服务器的地址,它们通过众所周知的 UDP 端口上的广播消息发现它们。
不幸的是,这需要修改浏览器,因为 Javascript 出于安全原因不支持 UDP。我理解这一点并同意安全限制。但是,它删除了一个非常好的动态服务发现功能。如果您在浏览器上使用 Apple,您可能会找到一个 Bonjour 模拟器,您可以在 Arduino 上 运行 并且它可能会工作("arduino.local" 可能会附加)。如果您的浏览器使用 Windows 客户端,那么 Windows 服务发现也可能实现这一点。我不知道 Linux 中有什么可用于服务发现。
我不喜欢你的这些修改。浏览器,Arduino(Apple,Windows 或 Linux),只是因为它添加了更多移动部件,而您指望浏览器"know" 如何找到服务。
选项:运行 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 在 DHCP 中启动,同时仍然固定其 IP 地址。您必须通过您的路由器 API(Web 或 CLI)并弄清楚如何操作,这有点难指导您,因为有成千上万种类型的商业和 SOHO 路由器。
如果您不控制路由器...
选项:使用静态 IP
这个选项真的是你最好的选择。放弃 DHCP,只设置 arduino 的静态 IP。只需确保您选择的 IP 地址不与子网上的任何其他服务器冲突。那应该不难。
希望对您有所帮助。
我认为最好的2个选项:
1) 当 arduino 启动时,从 DHCP 获取 IP 地址,arduino 应该连接到您提供的众所周知的服务。此外,每个设备都应该有一个 ID,由您在制造过程中定义,例如 mac 地址或 mac 地址的一部分。
因此,您可以在包装盒上打印如下内容:5c4e6f.my-well-know-host.com
然后,正如我所建议的,每次 arduino 启动时,它都会尝试连接到该服务传递参数,例如:
POST www.my-众所周知-host.com 编号:5c4e6f IP: 192.168.1.55
然后,在该服务中,您更新 DNS table 以反映此关系:
5c4e6f.my-众所周知-host.com -> 解析为 192.168.1.55
显然,在世界任何地方,主机 5c4e6f.my-众所周知-host.com 将解析为 192.168.1.55,但您只能从本地网络访问它。
提示:这是某种 DDNS,但具有网络发现功能。 Tip2: 有一个叫MyDNS的linux dns服务,其中的hosts只是记录在MySQL table里面,方便维护。
2) 网络发现
我不知道 arduino 是否能够做到这一点,但是,我的想法是让 arduino 在任何地址上监听特定的 UDP 端口,比如 4444。
因此,您可以构建一个 windows 应用程序和 Android 应用程序(我已经为另一个目的做了一个 android 发现,而不是 arduino),或者,最好的解决方案我仍在研究,是用一些 javascript 代码制作一个自定义页面,"looks" 用于侦听该特定端口的设备。
这样工作:
- 设备从 DHCP 获取 IP
- 设备启动一个线程监听端口4444 上的广播数据包
- 发现应用程序在另一个端口上侦听,例如 4445.
- 发现应用程序使用广播数据包向 4444 端口 (255.255.255.255:4444) 宣布自己
- 每个侦听的设备,将其标识和 IP 报告回应用程序端口 4445。