瑞米派RZ/G2L开发板WIFI问题最终解决办法(自动连接WiFi)

问题

  1. 瑞米派为什么只能SD和WIFI二选一
  2. 瑞米派如何切换wifi和sd设备树
  3. 瑞米派怎么实现正常的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,手动配置路由,所以,有了下面的内容

自动连接

  1. 创建WiFi连接脚本
  2. 创建systemd服务
  3. 设置开机自启
  4. 检查状态

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,全部完成。我们上电重启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值