systemd 实践-WIFI自动重连

本文在systemd简介基础上,利用systemd提供的服务实现WIFI连接的管理

1、编辑wifi重连服务

在/etc/systemd/system目录下,创建wifi_relink.service,并在文件中输入以下内容

[Unit] 
Description=Wifi relink service 
After=storage-gadget-init.service 

[Service] Type=simple 
RemainAfterExit=yes 
ExecStart=/usr/bin/relink3220.sh 

[Install] 
WantedBy=basic.target

wifi重连服务在系统的存储服务启动后启动,执行脚本为/usr/bin/relink3220.sh,并被添加到basic.target目标下,说明开机自启动。

2、编辑wifi重连脚本

创建/usr/bin/relink3220.sh文件,内容如下:

  1. 首先检测wifi模块是否插入到板卡上,并查看wifi模块的型号,根据型号(WIFI5->2b42; WIFI6→2b43)加载对应的驱动。
  2. 检查网口是否使能(up)
  3. 检查wpa配置文件是否存在
  4. 读取wifi连接状态,ip地址信息;
  5. 进入状态机,若wifi已连接,则判断是否拿到ip,调用udhcpc获取ip;若wifi正在扫描,则跳过;若wifi断开,则调用wpa进行连接。

该脚本每5秒执行一次。

#!/bin/sh 	 
while true do sleep 5  
	#check wifi module type and load the driver 
	wifi_module_type=`lspci | grep "01:00.0 Ethernet controller: Marvell Technology Group Ltd." | awk {'print $9'}`  
	
    case $wifi_module_type in 
	2b42)  
        mlan=`lsmod | grep mlan` 
        if [ "x$mlan"=="x" ];then 	
	        modprobe mlan 	
	        sleep 1 	
	        modprobe moal drv_mode=1 ps_mode=2 auto_ds=2 cfg80211_wext=0xf cal_data_cfg=none fw_name=nxp/pcieuart8997_combo_v4.bin 	
	        sleep 5 
	    fi 
    ;;  
    2b43)  
        mlan_wifi6=`lsmod | grep mlan_wifi6` 
        if [ "x$mlan_wifi6"=="x" ];then 	
            modprobe mlan_wifi6 	
            sleep 1 	
            modprobe moal_wifi6 drv_mode=1 ps_mode=2 auto_ds=2 cfg80211_wext=0xf cal_data_cfg=none fw_name=nxp/pcieuart9098_combo_v1.bin 	
            sleep 5 
            fi
    ;;  
    *) 
        echo "relink3220.sh:error undefined module types" 
    ;;  
    esac  
    #check mlan0 is ON 
    mlan_status=`ifconfig |grep mlan0 | awk {'print $1'}` 
    #echo "[ADV] $mlan_status" 
    if [ "x$mlan_status" == "x" ];then 	
        echo "please waiting for mlan0 up..." 	
        ifconfig mlan0 up 
    fi   
    #check wifi is configured (if file wpa.conf exist) 
    if [ ! -f "/etc/wpa_supplicant.conf" ];then 	
        echo "Not find wifi config file" 	
        continue 
    fi  
    #check wifi is connect 
    wifi_status=`wpa_cli -i mlan0 status |grep wpa_state |cut -d "=" -f2` 
    ip_address=`wpa_cli -i mlan0 status  |grep ip_address |cut -d "=" -f2`  

    case $wifi_status in 
    COMPLETED) 
        #check if get ip  
        if [ "x$ip_address"=="x" ];then 	
            udhcpc_pid_list=`ps -aux | grep udhcpc |grep mlan0 | awk {'print $2'}` 	
            if [ "x$udhcpc_pid_list" == "x" ];then 		
                for(( i=0;i<${#udhcpc_pid_list[@]};i++)) do 			
                    kill ${udhcpc_pid_list[i]}; 			
                    echo  "[ADV] kill ${udhcpc_pid_list[i]}" 		
                done 	
            fi 	
            udhcpc -i mlan0 	
            sleep 10 
        else 	
            echo "getip:${ip_address}" 
        fi  
    ;; 
        
    SCANNING) 
    ;; 
    
    *) 
        killall wpa_supplicant 
        wpa_supplicant -d -B -i mlan0 -c /etc/wpa_supplicant.conf -Dnl80211 
    ;;        
    esac 
done

3、修改wifi配置

系统运行中若需要修改wifi连接信息,可直接修改/etc/wpa_supplicant.conf文件,并重新启动wifi重连服务。

root@imx8mprsb3720a1:/usr/bin# cat /etc/wpa_supplicant.conf  
ctrl_interface=/var/run/wpa_supplicant 
ctrl_interface_group=0 
update_config=1 
network={ ssid="Advantecher" psk="Advantech@1983"}
systemctl restart wifi_relink.sh

network设置

systemd-networkd.service 是用于管理网络的系统服务。

它能够检测并配置网络连接,/etc/systemd/network目录下存放了网口的配置文件。网络设备的Network文件必须以 .network 作为后缀名,否则将被忽略。 一旦与Network文件匹配的网卡出现,对应的Network文件就会立即生效。

本文使用network分别配置eth0、eh1、mlan0的ip信息,并通过路由跳数设置网口的优先级。跳数越少,优先级越高。以下例子中eth0优先级最高、其次是eth1、最后是mlan0.

若要修改网口的优先级,只需要修改下面的配置文件中的metric的数值,并重启systemd-networkd服务:(要设置PPP拨号最高优先级,可将其他网口的优先级调低)

systemctl restart systemd-networkd

eth0:配置为静态网口,固定ip地址为192.168.0.1,所在网络为192.168.0.0/24,路由条数为150

[Match]    
Name=eth0        
KernelCommandLine=!root=/dev/nfs 

[Link] 
RequiredForOnline=no 

[Network]    
DHCP=no    
Address=192.168.0.1/24    
DNS=8.8.8.8    
DNS=114.114.114.114    

[Route]        
Gateway=192.168.0.254        
Metric=150

eth1:配置为动态网口,ip地址通过dhcp协议获取,并设置dns服务器地址,路由跳数为200

[Match]    
Name=eth1        
KernelCommandLine=!root=/dev/nfs 

[Link] 
RequiredForOnline=no 

[Network]    
DHCP=yes    
DNS=8.8.8.8    
DNS=114.114.114.114     

[DHCP]        
RouteMetric=200

mlan0:wifi连接后生成的网口,同样使用DHCPC获取动态ip地址

[Match]    
Name=mlan0        
KernelCommandLine=!root=/dev/nfs 
[Link] RequiredForOnline=no 
[Network]    
DHCP=yes    
DNS=8.8.8.8    
DNS=114.114.114.114     

[DHCP]        
RouteMetric=300
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值