移植wpa_supplicant工具到arm linux平台

效果

在这里插入图片描述

一个脚本

#!/bin/sh
BUILD_HOST=/disk_4/toolchain/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf
ARM_GCC=${BUILD_HOST}-gcc
BASE=`pwd`
OUTPUT_PATH=${BASE}/install
OPENSSL=openssl-1.0.2t
WPA_SUPPLICANT=wpa_supplicant-0.7.3

make_dirs() {
    cd ${BASE}
    mkdir  compressed  install  source -p
}

tget () { #try wget
    filename=`basename $1`
    echo "Downloading [${filename}]..."
    if [ ! -f ${filename} ];then
        wget $1
    fi

    echo "[OK] Downloaded [${filename}] "
}

download_package () {
    cd ${BASE}/compressed
    #下载包
    tget https://www.openssl.org/source/${OPENSSL}.tar.gz
    tget http://w1.fi/releases/${WPA_SUPPLICANT}.tar.gz
}

tar_package () {
    cd ${BASE}/compressed
    ls * > /tmp/list.txt
    for TAR in `cat /tmp/list.txt`
    do
        tar -xf $TAR -C  ../source
    done
    rm -rf /tmp/list.txt
}

pre_make_ssl () {
    cd ${BASE}/source/${OPENSSL}
    startLine=`sed -n '/install_html_docs\:/=' Makefile`
    echo $startLine
    # 为了避免 多行结果
    for startline in $startLine
    do
        lineAfter=99
        endLine=`expr $startline + 999`
        sed -i $startline','$endLine'd' Makefile
        echo "install_html_docs:" >> Makefile
        echo "\t@echo skip by Schips" >> Makefile
        echo "install_docs:" >> Makefile
        echo "\t@echo skip by Schips" >> Makefile
        echo "# DO NOT DELETE THIS LINE -- make depend depends on it." >> Makefile
        break
    done
}
pre_make_ssl_rm_char ()
{
 	# 匹配-m64字符串 替换为xx
	#sed -i "s/-m64/xx/g" Makefile
	# 匹配-m64字符串 替换为空
	sed -i "s/-m64//g" Makefile
	sed -i "s/-m32//g" Makefile
}
make_openssl () {
    # 编译安装 ssl
    cd ${BASE}/source/${OPENSSL}
    echo "SSL ABOUT"
    #./Configure --prefix=${OUTPUT_PATH}/${OPENSSL}  os/compiler:${ARM_GCC}
    #pre_make_ssl

	#通过配置生成Makefile文件
	./config no-asm shared --prefix=${OUTPUT_PATH}/${OPENSSL} --cross-compile-prefix=${BUILD_HOST}- #-static
	#删除Makefile文件中-m64编译选项
	pre_make_ssl_rm_char
    make && make install
}


make_wpa () {
    cd ${BASE}/source/wpa*/wpa*
    cp defconfig .config
    echo "CC=${ARM_GCC} -L${OUTPUT_PATH}/${OPENSSL}/lib"  >> .config
    echo "CFLAGS += -I${OUTPUT_PATH}/${OPENSSL}/include"  >> .config
    echo "LIBS += -L${OUTPUT_PATH}/${OPENSSL}/lib" >>  .config
    make && make install DESTDIR=${BASE}/install/wpa_supplicant/
    cp ${BASE}/source/wpa*/wpa*/examples/wpa-psk-tkip.conf ${BASE}/install/wpa_supplicant/wpa.conf
    # 在ctrl_interface 当前行下插入 update_config=1
    sed -i '/ctrl_interface/aupdate_config=1' ${BASE}/install/wpa_supplicant/wpa.conf
}

make_dirs
download_package
tar_package
make_openssl
make_wpa

使用获取ssid

wifi信号名获取

#进行扫描wifi信号
wpa_cli -i wlan0 scan
#将扫描结果给/root/wifilog.txt文件中
wpa_cli scan_result > /root/wifilog.txt

wifilog.txt内容如下:

Selected interface 'wlan0'
bssid / frequency / signal level / flags / ssid
04:d3:b5:71:c8:50       2437    -47     [WPA2-PSK-CCMP][WPS][ESS]       GNNGAP518
#打印 ESS 关键字段所在的行
awk '/ESS/' /root/wifilog.txt
#获取关键字段"ESS"所在行,第5列的字符串
awk '/ESS/ {print $5}' /root/wifilog.txt
#获取关键字段"ESS"所在行,以空格分隔 若第五列内容非空则打印 每行第5列的字符串 保存到/tmp/SSID.txt文件中
awk -F " " '/ESS/ {if($5!=""){print $5}}' /root/wifilog.txt>/tmp/SSID.txt

将awk保存为脚本文件,给外部调用

#!/bin/awk
awk -F " " '/ESS/ {if($5!=""){print $5}}'

简洁运行获取输出到文件

在这里插入图片描述

使用

1、etc目录下建立文件
在这里插入图片描述
2、生成的sbin目录下的wap_cli … 移动到开发板的/usr/sbin目录下

5、启动服务

wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B

3、扫描

4、配置好热点信息

C方式获取SSID信息

运行效果

在这里插入图片描述

源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>

#define PRINT_ERRMSG(STR) fprintf(stderr,"line:%d,msg:%s,eMsg:%s\n", __LINE__, STR, strerror(errno))

/*扫描参数,扫描哪个wifi 扫描结果存在哪个文件*/
const char *ScanScript="/root/scanwifi.sh";
const char *Wlan_Num="wlan0";
const char *SSIDFile="/tmp/SSID.txt";
/*
 * 将指定字符替换为指定字符合并
 *
 * sourch源字符 destch目标字符 destbuf目标缓冲区
 *
 * 成功:返回拼接数量 失败返回:0
 * */
static int str_replace_ch(const char *file ,char *destbuf,char sourch ,char destch)
{
	FILE* fp;
	char buf[512] = {0};
	char * find;
	int str_lenth = 0;
	if(destbuf == NULL)
	{
		return 0;
	}
	fp = fopen(file, "r");
	if(NULL == fp) {
		PRINT_ERRMSG("fopen");
	}
	while((fgets(buf,64,fp))!=NULL)
	{
		find = strchr(buf, sourch);
		if(find)  //如果地址不是NULL
		{
			*find = destch;  //替换
			find++;
			*find = '\0';
			//计算累积长度
			str_lenth += strlen(buf);
			if(str_lenth > 100)
			{
				return str_lenth;
			}
			//装载
			strcat(destbuf ,buf);
			//清空
			memset(buf, 0, 512);
		}
	}
	fclose(fp);
	return str_lenth;
}

/*启动rt8188EU wifi扫描功能,读取ssid
 *
 * wpa_cli方式
 * */
int ScanSSIDSignal(char *pSsid)
{
	int ret = -1;
	char str[100];
	memset(str, '\0', sizeof(str));
	sprintf(str ,"%s %s %s" ,ScanScript ,Wlan_Num ,SSIDFile);
	ret = system(str);
	if(ret != 0)
	{
		return ret;/*执行失败*/
	}
	memset(str, '\0', sizeof(str));
	//执行成功,读取文件中的SSID信号表
	return str_replace_ch(SSIDFile ,pSsid ,'\n' ,' ');
}

int main(void)
{
		char ssidbuff[128] = {0};
		ScanSSIDSignal(ssidbuff);
		printf("扫描结果:%s",ssidbuff);
}

编译

arm-linux-gnueabihf-gcc -o scanwifi scanwifi_test.c

将编译生成的可执行件发送到开发板中运行

创建扫描脚本

保存文件名为:scanwifi.sh

#! /bin/sh
argc=$#
input_par=$1
wifi_list=$2

do_scan_wifi(){
if [ $argc -ne 0 ]; then
    #扫描wifi信号
    wpa_cli -i $input_par scan
    ret=$?
    if [ $ret -eq 0 ]; then
      echo "SCAN OK"
      sleep 3
    else
      echo "SCAN FAIL";exit $ret 
    fi
else
    filename=`basename $0`
    echo "USAGE ${filename} wifinanme saveSSIDfile"
    exit 65
fi
}

#获取扫描结果
do_get_wifi_ssid(){
  wpa_cli scan_result|awk -F " " '/ESS/ {if($5!=""){print $5}}'>$wifi_list
  ret=$?
  if [ $ret -eq 0 ]; then 
    echo "GET SCAN RESULT OK" 
  else 
    echo "GET SCAN RESULT FAIL"&& exit $ret
  fi 
}
do_scan_wifi
do_get_wifi_ssid
exit $?

设置ssid与key

在这里插入图片描述
以下脚本保存为:switchssid.sh添加可执行权限

#!/bin/sh
argc=$#
input_par=
#wifi config file path
wifi_config=

do_switch_par(){
  #如果小于3
  if [ $# -lt 3 ]; then
    filename="do_switch_par"
    echo "USAGE ${filename} ssid wificonfig_file num"
    exit 65
  fi
  if [ $3 -eq 5 ]; then
      o_par=$(awk 'NR==5{if($1!=""){print $1}}' $2)
  fi
  if [ $3 -eq 6 ]; then
      o_par=$(awk 'NR==6{if($1!=""){print $1}}' $2)
  fi
  sed -i "s/$o_par/$1/g" $wifi_config
  ret=$?
  if [ $? = 0 ]; then 
      echo "SET wifi OK" 
  else
      echo "SET wifi FAIL"&& exit $ret
  fi
}

if [ $argc -le 1 ]; then
  filename=`basename $0`
  echo "USAGE ${filename} ssid wificonfig_file"
  exit 65
elif [ $argc -eq 2 ]; then
	wifi_config=$2
	input_par="ssid=\"$1\""
  echo $input_par $wifi_config
	do_switch_par $input_par $wifi_config 5
	exit $?
elif [ $argc -eq 3 ]; then
	wifi_config=$3
	input_par="ssid=\"$1\""
  echo $input_par
	do_switch_par $input_par $wifi_config 5
	input_par="psk=\"$2\""
  echo $input_par
	do_switch_par $input_par $wifi_config 6
	exit $?
fi

exit $?
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值