【Linux】Ubuntu22.04 USB-RTL8821cu 无线设备断网

1.查看无线网设备

nmcli device

2.连接无线网

nmcli connection add type wifi con-name "连接名" ifname wlx646e97100940 ssid "WiFi名"
nmcli connection modify "连接名" wifi-sec.key-mgmt wpa-psk
nmcli connection modify "连接名" wifi-sec.psk "WiFi密码"

3.启动连接

nmcli connection up "连接名"

4.删除时候用

nmcli connection down "连接名"
nmcli connection delete "连接名"

5.关闭省电模式

sudo iw dev wlx646e97100940 set power_save off
sudo iw dev wlx646e97100d49 set power_save off

6.修改配置文件WIFI省电模式
vi /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf

[connection]
wifi.powersave = 2

7.创建文件
vi /etc/modprobe.d/usb-nosuspend.conf

options usbcore autosuspend=-1

vi /etc/udev/rules.d/85-usb-power.rules

ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="on"

8.创建后重载规则

sudo udevadm control --reload-rules
sudo udevadm trigger

9.重启设备

reboot

10.创建检测脚本

#!/bin/bash

# 目标WiFi网络名称
TARGET_WIFI="WTCCN Warehouse"
# 测试通信的IP地址列表
TEST_IPS=("10.66.135.1" "10.66.132.1")
# 无线网卡USB设备ID
USB_ID="0bda:c811"

# 日志函数
log() {
    echo "$(date '+%Y年 %m月 %d日 %H:%M:%S'): $1"
}

# 检查网络连接
is_connected_to_wifi() {
    nmcli -t -f NAME connection show --active | grep -q "^$TARGET_WIFI$"
    return $?
}

# 测试单个IP的网络连通性
can_ping_ip() {
    local ip="$1"
    ping -c 3 -W 2 "$ip" > /dev/null 2>&1
    return $?
}

# 检查所有IP的连通性
check_all_ips() {
    local all_failed=true

    for ip in "${TEST_IPS[@]}"; do
        if can_ping_ip "$ip"; then
            log "与 $ip 通信正常"
            all_failed=false
            break  # 只要有一个能通就退出循环
        else
            log "与 $ip 通信失败"
        fi
    done

    if $all_failed; then
        log "所有IP地址通信均异常"
        return 1
    else
        log "至少有一个IP地址通信正常"
        return 0
    fi
}

# 模拟USB重新插拔
reset_usb_adapter() {
    log "开始重置USB无线网卡..."

    for device in /sys/bus/usb/devices/*; do
        if [[ -e "$device/busnum" && -e "$device/devnum" ]]; then
            busnum=$(cat "$device/busnum")
            # 只重置指定总线上的设备(例如Bus 001)
            if [ "$busnum" -eq 1 ]; then
                echo "Resetting device on Bus $busnum: $(cat $device/product 2>/dev/null || echo 'Unknown')"
                echo 0 > "$device/authorized"
                sleep 1
                echo 1 > "$device/authorized"
            fi
        fi
    done

    # 等待网络服务稳定
    sleep 5
    systemctl restart NetworkManager 2>/dev/null
    sleep 10

    # 尝试重新连接
    log "尝试重新连接到WiFi..."
    nmcli connection up "$TARGET_WIFI" 2>/dev/null

    # 检查是否连接成功
    sleep 5
    if is_connected_to_wifi; then
        log "WiFi重新连接成功"
    else
        log "WiFi重新连接失败"
    fi
}

# 主函数
main() {
    log "开始网络检查..."

    if is_connected_to_wifi; then
        log "已连接到 $TARGET_WIFI"

        # 检查所有IP的连通性
        if check_all_ips; then
            log "网络通信正常,无需操作"
        else
            log "所有IP地址通信异常,重置网卡..."
            reset_usb_adapter
        fi
    else
        log "未连接WiFi,重置网卡..."
        reset_usb_adapter
    fi

    log "检查完成"
    echo "----------------------------------------------------------------------------"
}

# 执行主函数
main "$@"

💬 评论 (0)

发表评论

支持 Markdown · 请遵守评论规范