文章目录



本文在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