背景:
我实际上是 Arduino 初学者,正在学习通过以太网将其连接到互联网。
我没有使用更常用的(更容易)的以太网屏蔽(基于 Wiznet W5100/W5200 芯片),而是使用 ENC28J60 芯片的以太网屏蔽 - 不同之处在于 TCP“处理(?)”必须由软件完成,而 W5100/W5200 芯片则由硬件内置)。
我正在使用库来处理代码中的繁重工作。我并不完全理解,但已经成功将 Arduino 设置为 Web 服务器和 Web 客户端。
问题:
我的问题是一致性。通常情况下,Arduino+以太网模块不会被路由器检测到,因此无法工作,因为它没有获得 IP 地址。这不是 LAN 电缆问题;当我将其连接到计算机时,它会显示在路由器的客户端表中,但当我将其连接到设备(即通过以太网模块连接到 Arduino)时,它不会显示。
我的问题是:路由器如何检测计算机/连接的设备?在 Google 上搜索后,我得到了“计算机如何检测路由器?”的结果;我希望反过来。
我想大致了解一下路由器是如何进行检测的,因为我无法确定连接失败是在设备端,还是路由器端。
我对网络技术一窍不通,但熟悉 PING 和 DHCP 与固定 IP 地址的概念 - 所有这些都因实际连接而无法实现 - 而这正是我的障碍所在。如果能提供任何外行解释或至少一些故障排除技巧来找出问题的真正所在,我将不胜感激。
答案1
所有路由器都至少有两个网络接口。为了回答这个问题,假设一个典型的家庭设置,其中路由器只有两个接口 - WAN 以太网和 LAN + 无线以太网(通常桥接在一起,因此实际上是一个接口)。
实际情况是路由器在其 WAN 接口上发出 DHCP 请求,然后 ISP 的 DHCP 服务器以公共 IP 信息进行响应。然后路由器使用该信息配置 WAN 接口的 IP。
路由器本身通常运行自己的 DHCP 服务器,该服务器会将 IP 分配给通过 LAN 连接的用户。它根本不会将 IP 分配给 WAN 接口。
另一种选择是 APIPA,设备会在 APIPA 范围内随机选择一个 IP,发出 ARP 来查看是否有其他人正在使用它,如果没有人回复,则开始使用它。如果您想使用 APIPA 子网以外的任何子网,这很糟糕。
IPv6 自动配置的工作原理类似。
我对 Ardunio 没有太多经验,但听起来你需要在其中的某个地方使用 DHCP 客户端功能。
答案2
路由器几乎肯定具有 DHCP 功能 - 动态 IP 地址分配。DHCP 客户端发送没有任何地址的广播,本地网络上的 DHCP 服务器看到该广播后,会向发送者返回一个包含 IP 地址的数据包。(这是可能的,因为以太网本地使用 MAC 地址,这些地址在每个设备中都是硬编码的)
您的路由器可能有一个表格,显示 DHCP 分配给 MAC 地址 - 您的 Arduino 出现在其中吗?
答案3
路由器无法检测计算机,计算机也无法检测路由器(IPV6 计算机可以检测路由器)。
路由器在将流量发送到路由器(默认网关)之前无法识别网络上的任何计算机。现在,如果您的路由器设置为 DHCP 服务器,那么每次配置为使用 DHCP(默认为 true)的计算机都会发送 DHCP 请求。路由器会收到此请求,并向计算机提供 IP 地址。在此状态下,路由器可以识别计算机。
如果您启动了 Arduino 并且它没有获取 IP 地址并且它没有在您的路由器上列为 DHCP 客户端,那么 Arduino 或其网络连接就有问题(假设网络上的其他一切都没有问题)。
我建议您连接到 Arduino 并尝试刷新 IP 地址。同时查看 eth0 或 eth1 的状态,这将告诉您它是否已连接到网络。