问题
- 瑞米派为什么只能SD和WIFI二选一
- 瑞米派如何切换wifi和sd设备树
- 瑞米派怎么实现正常的wifi使用
解决
1.为什么要二选一
Remi Pi 单板 SDIO 作为通信接口使用。SDIO 信号采用多路复用器芯片 SN74CBTLV3257PWR,分别连接到 Micro SD 卡电路和 WiFi/BT 模块电路。WiFi 和 Micro SD 功能,不能同时使用。
2.切换设备树
注意:如果你使用的是官方提供的内核源码,./linux_kernel/arch/arm64/boot/dts/myir/里面的r9a07g044.dtsi、mys-rzg2l-smarc-base.dtsi、mys-rzg2l-wifi.dts这些设备树源码没有改动,如有改动但是没有改动(scif1,sdhi1,sdhi1: mmc@11c10000)这些也是没问题的。编译过后会将WiFi驱动编译到内核。
a.首先进入到开发板的uboot(开发板)
b.输入下面指令(开发板)
=> setenv fdt_file mys-rzg2l-wifi.dtb
=> setenv sdhi_sw "if test MYS-RZG2L = MYS-RZG2L ; then switch_sdhi1 wifi; fi"
=> saveenv
c.断电重启
d.查看wanl0(开发板)
//输入
ifconfig wlan0
//打印
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether c8:fe:0f:3d:91:a6 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
到此我们成功启用了wifi设备
3.wifi正常使用
查看附近的wifi(开发板)
//输入
iw dev wlan0 scan | grep SSID
//打印
root@localhost:~# iw dev wlan0 scan | grep SSID
SSID: wifitest1
SSID: czh
SSID: Arthurwang xiaomi 14 pro
* SSID List
SSID: DNUI-CUCC
SSID:
证明wifi驱动可用
---------------------------------------------------------------------------------------------------------------------------------
如果你有兴趣,你可以接着往下看。如果时间少任务多,直接看最后的脚本
---------------------------------------------------------------------------------------------------------------------------------
添加wifi(开发板)
//输入wpa_passphrase WiFi名字 密码 >> /etc/wpa_supplicant.conf
root@localhost:~# wpa_passphrase myir 12345678 >> /etc/wpa_supplicant.conf
查看已有wifi信息(开发板)
//输入
cat /etc/wpa_supplicant.conf
输出
root@localhost:~# cat /etc/wpa_supplicant.conf
network={
ssid="myir"
#psk="12345678"
psk=ab02e1d0a945f2961080c1a1325614507f44014bae268b55b20b2bbbb5ab6b8f
key_mgmt=WPA-PSK
}
/*记得手动添加一个*/key_mgmt=WPA-PSK
停止一切网络进程(开发板)
# 停止可能冲突的服务
killall wpa_supplicant
ip addr flush dev wlan0
启动wpa_supplicant(开发板)
# 启动wpa_supplicant并指定完整的接口名称wlan0
wpa_supplicant -B -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0
获取IP地址(开发板)
# 释放旧IP地址
udhcpc -i wlan0 -R
# 获取新IP地址
udhcpc -i wlan0
验证(开发板)
# 检查连接状态
iw dev wlan0 link
# 检查IP地址
ip addr show wlan0
# 测试互联网连接
ping -c 4 8.8.8.8
注意:还有一个坑,eth0和wanl0的路由问题,当你先设置的eth,那你很可能不能通wifi上网,我们需要改一下
ip route show
# 删除当前默认路由
ip route del default via 192.168.137.1
# 添加新的默认路由通过WiFi网关
ip route add default via 192.168.0.1 dev wlan0
以上就是全部步骤,但是重启开机后需要手动连接,手动获取tcp,手动配置路由,所以,有了下面的内容
自动连接
- 创建WiFi连接脚本
- 创建systemd服务
- 设置开机自启
- 检查状态
1.创建脚本(开发板)
#!/bin/bash
# 文件名: /usr/local/bin/setup-wifi.sh
# 配置日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /var/log/wifi-setup.log
}
# 确保脚本以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "此脚本必须以root权限运行"
exit 1
fi
log "开始WiFi配置"
# 预定义的WiFi网络列表(按优先级排序)
declare -A WIFI_NETWORKS
# 格式: WIFI_NETWORKS[SSID]=密码
WIFI_NETWORKS["DIY_CLUB_5G"]="DIYCLUB205"
WIFI_NETWORKS["myir"]="123456"
WIFI_NETWORKS["备用WiFi名称"]="备用WiFi密码"
# 可添加更多网络...
# 停止现有的wpa_supplicant进程
killall wpa_supplicant 2>/dev/null
log "已停止现有wpa_supplicant进程"
# 创建基础wpa_supplicant配置
cat > /etc/wpa_supplicant.conf << EOF
ctrl_interface=/var/run/wpa_supplicant
update_config=1
EOF
log "已创建基础wpa_supplicant配置"
# 启动wpa_supplicant
wpa_supplicant -B -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0
if [ $? -ne 0 ]; then
log "启动wpa_supplicant失败"
exit 1
fi
log "已启动wpa_supplicant"
sleep 2
# 扫描可用WiFi网络
log "开始扫描可用WiFi网络..."
iw dev wlan0 scan > /tmp/wifi_scan_result
if [ $? -ne 0 ]; then
log "WiFi扫描失败"
exit 1
fi
# 提取扫描到的SSID列表
log "提取扫描结果中的SSID..."
AVAILABLE_SSIDS=$(grep -i ssid /tmp/wifi_scan_result | awk -F': ' '{print $2}' | sort | uniq)
log "发现的SSID: $AVAILABLE_SSIDS"
# 尝试连接匹配的网络
CONNECTED=0
for SSID in "${!WIFI_NETWORKS[@]}"; do
if echo "$AVAILABLE_SSIDS" | grep -q "$SSID"; then
log "尝试连接到 $SSID..."
# 使用wpa_cli添加网络
wpa_cli -i wlan0 remove_network all > /dev/null
NETWORK_ID=$(wpa_cli -i wlan0 add_network | tail -n1)
wpa_cli -i wlan0 set_network $NETWORK_ID ssid "\"$SSID\"" > /dev/null
wpa_cli -i wlan0 set_network $NETWORK_ID psk "\"${WIFI_NETWORKS[$SSID]}\"" > /dev/null
wpa_cli -i wlan0 enable_network $NETWORK_ID > /dev/null
wpa_cli -i wlan0 select_network $NETWORK_ID > /dev/null
# 等待连接
attempt=0
max_attempts=10
while [ $attempt -lt $max_attempts ]; do
if iw dev wlan0 link | grep -q "Connected to"; then
log "成功连接到 $SSID"
CONNECTED=1
break
fi
log "等待连接到 $SSID... 尝试 $((attempt + 1))/$max_attempts"
sleep 2
attempt=$((attempt + 1))
done
if [ $CONNECTED -eq 1 ]; then
break
else
log "连接 $SSID 失败,尝试下一个网络"
fi
fi
done
# 如果没有连接成功
if [ $CONNECTED -eq 0 ]; then
log "无法连接到任何预存的WiFi网络"
exit 1
fi
# 获取IP地址
log "正在获取IP地址..."
udhcpc -i wlan0 -n -q
if [ $? -ne 0 ]; then
log "获取IP地址失败"
exit 1
fi
log "已获取IP地址"
# 配置DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
log "已配置DNS"
# 配置路由
# 保留通过eth0到宿主机的路由
ip route add 192.168.137.0/24 via 192.168.137.1 dev eth0 2>/dev/null
# 设置默认路由通过wlan0
# 先删除现有默认路由
ip route del default 2>/dev/null
# 添加新的默认路由
GATEWAY=$(ip route | grep "default via" | grep "dev wlan0" | awk '{print $3}')
if [ -z "$GATEWAY" ]; then
# 如果无法获取网关,使用常见默认网关
GATEWAY=$(ip addr show wlan0 | grep "inet " | awk '{print $2}' | cut -d. -f1-3).1
fi
ip route add default via $GATEWAY dev wlan0
if [ $? -ne 0 ]; then
log "设置默认路由失败"
exit 1
fi
log "已配置路由表,网关: $GATEWAY"
log "WiFi配置完成,当前路由表:"
ip route show >> /var/log/wifi-setup.log
exit 0
2.创建sysytemd服务(开发板)
# 文件名: /etc/systemd/system/wifi-setup.service
[Unit]
Description=Setup WiFi Connection and Route
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/setup-wifi.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
3.设置开机自启(开发板)
# 使脚本可执行
chmod +x /usr/local/bin/setup-wifi.sh
# 启用服务
systemctl enable wifi-setup.service
# 如果想立即启动测试
systemctl start wifi-setup.service
4.检查状态(开发板)
# 检查服务状态
systemctl status wifi-setup.service
# 查看日志
tail -f /var/log/wifi-setup.log
OK,全部完成。我们上电重启