移植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 $?