板卡自带了一个wifi拨号上网的脚本程序。
程序编写
#!/bin/sh cnt1=`ps aux | grep hostapd | grep -v grep | wc -l` #计算正在运行的 hostapd 进程的数量 if [ "$cnt1" != "0" ];then killall hostapd > /dev/null fi #如果 hostapd 进程的数量不为零(即有进程在运行),则停止所有 hostapd 进程 ifconfig uap0 down function usage() { echo "Usage: -i <wifi> -s <ssid> -p <password>" echo "eg: ./wifi.sh -i mlan0 -s elf -p NONE " echo " -i : mlan0 or mlan1" echo " -s : wifi ssid" echo " -p : wifi password or NONE" } function parse_args() { while true; do case "$1" in -i ) wifi=$2;echo wifi $wifi;shift 2 ;; -s ) ssid=$2;echo ssid $ssid;shift 2 ;; -p ) pasw=$2;echo pasw $pasw;shift 2 ;; -h ) usage; exit 1 ;; * ) break ;; esac done } #定义一个函数 parse_args,用于解析传入的命令行参数,并根据参数设置对应的变量 if [ $# != 6 ] then usage; exit 1; fi #检查传入的参数数量是否为6(包括脚本名称在内)。如果不是,则输出使用说明并退出 parse_args $@ #调用 parse_args 函数来解析命令行参数 if [ -e /etc/wpa_supplicant.conf ] then rm /etc/wpa_supplicant.conf fi #如果 /etc/wpa_supplicant.conf 文件存在,则删除它 echo \#PSK/TKIP >> /etc/wpa_supplicant.conf echo ctrl_interface=/var/run/wpa_supplicant >>/etc/wpa_supplicant.conf echo ctrl_interface_group=0 >>/etc/wpa_supplicant.conf echo update_config=1 >>/etc/wpa_supplicant.conf echo network={ >>/etc/wpa_supplicant.conf echo ssid=\"$ssid\" >>/etc/wpa_supplicant.conf echo scan_ssid=1 >>/etc/wpa_supplicant.conf if [ $pasw == NONE ] then echo key_mgmt=NONE >>/etc/wpa_supplicant.conf else echo psk=\"$pasw\" >>/etc/wpa_supplicant.conf echo key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE >>/etc/wpa_supplicant.conf echo group=CCMP TKIP WEP104 WEP40 >>/etc/wpa_supplicant.conf fi echo } >>/etc/wpa_supplicant.conf #创建新的 /etc/wpa_supplicant.conf 配置文件,配置文件包括网络的基本设置、SSID 和#密码等 ifconfig -a|grep mlan0 |grep -v grep > /dev/null if [ $? -eq 0 ] then ifconfig mlan0 down > /dev/null fi #检查 mlan0 网络接口是否存在,如果存在,则关闭它 ifconfig -a|grep mlan1 |grep -v grep > /dev/null if [ $? -eq 0 ] then ifconfig mlan1 down > /dev/null fi ifconfig -a|grep eth0 |grep -v grep > /dev/null if [ $? -eq 0 ] then ifconfig eth0 down > /dev/null fi ifconfig -a|grep eth1 |grep -v grep > /dev/null if [ $? -eq 0 ] then ifconfig eth1 down > /dev/null fi ifconfig -a|grep usb0 |grep -v grep > /dev/null if [ $? -eq 0 ] then ifconfig usb0 down > /dev/null fi ps -fe|grep wpa_supplicant |grep -v grep > /dev/null if [ $? -eq 0 ] then kill -9 $(pidof wpa_supplicant) fi #查找是否有wpa_supplicant进程运行,如果有则kill掉 sleep 1 ifconfig $wifi up > /dev/null sleep 1 #启动$wifi接口 (wpa_supplicant -Dnl80211,wext -i$wifi -c/etc/wpa_supplicant.conf >/dev/null) & echo "waiting..." sleep 3 wpa_cli -i$wifi status |grep COMPLETED |grep -v grep >/dev/null if [ $? -eq 0 ] then udhcpc -i $wifi echo "Finshed!" else echo "try to connect again..." sleep 3 wpa_cli -i$wifi status |grep COMPLETED |grep -v grep >/dev/null if [ $? -eq 0 ] then udhcpc -i $wifi echo "nameserver 114.114.114.114" > /etc/resolv.conf echo "Finshed!" else echo "************************************************" echo "connect faild,please check the passward and ssid" kill -9 $(pidof wpa_supplicant) exit 1 fi fi #尝试连接Wi-Fi网络并获取IP地址,若失败则重新尝试,最终若连接仍失败则输出错误#信息并终止wpa_supplicant进程 |
该脚本主要用于配置WiFi网络连接。脚本通过命令行参数 `-i`, `-s`, `-p` 来获取WiFi的相关信息,然后根据这些信息配置 `/etc/wpa_supplicant.conf` 文件,并启动 `wpa_supplicant` 来连接WiFi。接下来的步骤包括使WiFi网络接口起来,使用wpa_cli确认连接是否成功。成功后使用 udhcpc 获取 IP 地址。如果连接失败,则输出错误信息,并尝试重新连接。
具体步骤如下:
1.检查并终止hostapd进程。如果hostapd正在运行,则使用killall命令终止它。
2.关闭uap0接口。
3.定义usage和parse_args函数。usage函数提供了脚本的使用说明,parse_args函数解析命令行参数,如Wi-Fi接口(-i)、SSID(-s)和密码(-p)。
4.检查参数个数。吐过参数数量不等于6,则调用usage函数并退出。
5.生成wpa_supplicant.conf 配置文件。删除旧的配置文件(如果存在),然后创建新的配置文件,写入 SSID 和密码等信息。
6.关闭其他网络接口。确保 mlan0、mlan1、eth0、eth1 和 usb0 接口都被关闭。
7.终止 wpa_supplicant 进程。如果 wpa_supplicant 进程正在运行,则杀死它。
8.配置并启动 wpa_supplicant。启动 wpa_supplicant 以连接到指定的 Wi-Fi 网络。
9.检查连接状态并获取 IP 地址。使用 wpa_cli 检查连接状态,如果连接成功,则使用 udhcpc 获取 IP 地址。如果连接失败,则再次尝试并最终报告失败。
开发板测试
root@ELF2:~#chmod 777 wifi.sh root@ELF2:~#./wifi.sh -i 8723 -s p50 -p xx000628 |