一、问题
三台设备:Windows,Ubuntu,开发板。
我的Windows在每次开机后,无法ping通开发板,开发板可以ping通Windows;
Windows和另一台局域网内的Ubuntu可以相互ping通;
Ubuntu和开发板可以相互ping通。
二、分析
奇怪的是,我使用开发板ping一次Windows,那么Windows就可以ping开发板了。查看arp项,发现Windows端建立了对应的arp项。如果是Windows发起的ping,就无法建立这个arp。
另外,在Windows端查看arp项,发现Ubuntu和开发板的mac地址居然是同一个,看来路由转发似乎容易出问题。
我的网络结构是一个主路由器,一个从路由器,使用无线桥接的方式,连接到主路由器。
Windows连接主路由器,Ubuntu和开发板连接从路由器。
那么问题可能在路由转发上,从路由器的桥接可能有问题。
三、解决方案
方案1
既然ping一次能建立连接,那就用这种方法让开发板每隔一段时间,自动发起ping。这样相当于Windows会间隔一段时间被动建立arp。
编辑一个ping脚本,增加执行权限:
#!/bin/bash# 指定要ping的IP地址
IP_ADDRESS="192.168.1.100"# 无限循环
while true; do# 使用ping命令检查IP地址ping -c 1 $IP_ADDRESS# 等待10分钟sleep 600
done
开发板用的Ubuntu系统,建立服务是最高效的方式,新建一个服务源文件:
/etc/systemd/system/ping_once.service
[Unit]
Description=Ping a specified IP address every 10 minutes[Service]
ExecStart=/home/orangepi/ping_once.sh
Restart=always[Install]
WantedBy=multi-user.target
路径指向脚本。
# 开启服务
sudo systemctl enable ping_once.service
sudo systemctl start ping_once.service
# 关闭服务
sudo systemctl stop ping_once.service
# 查看状态
sudo systemctl status ping_once.service
ping一次本身占用的资源就不大,加上服务在管理,这个脚本在rk3588的开销微乎其微。开启服务后每次开机都会启动,关闭服务则不会自启动。
该方法实测可行,不过比较野,属于用魔法打败魔法。
方案2
将所有设备放到同一个子网。
此时我将Windows连接到从路由器,并手动设置静态IP。
此时Windows端的arp表正常了,显示了对应网卡的mac,并且可以正常ping。
总的来说,应该是我的路由桥接设置的有问题,暂时先放一放,只能让Windows委屈一下,连接百兆的从路由了。