arm linux 支持 wifi (wpa_supplicant)
背景:
公司用的产品主板支持wifi接口,为了加强产品的功能,做wifi的底层支持。
有关知识点:浅谈 Linux 内核无线子系统
概览
主要的流程如下:
内核配置 + 有关驱动的移植 + 软件的移植 + 软件的配置
内核配置
# WIFI驱动
Networking support
<*> RF switch subsystem support --->
[*] Power off on suspend (NEW)
<*> Generic rfkill regulator driver
(防止使用wpa_supplicant会出现rfkill: Cannot open RFKILL control device错误。)
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[*] nl80211 testmode command
[*] enable powersave by default
[*] cfg80211 wireless extensions compatibility
<*> Generic IEEE 802.11 Networking Stack (mac80211)
# WIFI作为AP热点的额外配置
Device Drivers --->
[*] Network device support --->
[*] Wireless LAN --->
<*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
[*] Support downloading firmware images with Host AP driver
[*] Support for non-volatile firmware download
wpa软件移植
根据有关资料,移植wifi有关驱动各工具如下:
软件包 | 说明 |
---|---|
WirelessTools | 只支持WEP认证方式 |
wpa_supplicant | 支持WPA认证方式 |
hostapd | hostapd能够使得无线网卡切换为master模式,模拟AP(通常可以认为是路由器)功能软AP(Soft AP) |
dhcpcd | dhcpcd是DHCP client的实现,可以作为后台守护进程运行。 |
一个脚本编译 wpa_supplicant:
##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
# File Name: make.sh
# Created : Tue 10 Dec 2019 05:42:56 PM CST
#!/bin/sh
BUILD_HOST=arm-linux
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 | awk -F\b '{ print $1 }'`
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
}
make_openssl () {
cd ${BASE}/source/${OPENSSL}
echo "SSL ABOUT"
./Configure --prefix=${OUTPUT_PATH}/${OPENSSL} os/compiler:${ARM_GCC}
pre_make_ssl
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
生成结果的目录结构如下:
$ tree install/wpa_supplicant
install/wpa_supplicant
├── usr
│ └── local
│ └── sbin
│ ├── wpa_cli
│ ├── wpa_passphrase
│ └── wpa_supplicant
└── wpa.conf
将install中wpa_supplicant/usr/local/sbin下的可执行程序拷贝到板子上
拷贝install中的wpa_supplicant/wpa.conf 一并拷出。
wpa软件配置
运行wifi服务:
nohup wpa_supplicant -D nl80211 -i wlan0 -c $CONFIG > log &
-c 用于指定配置
使用wpa_supplicant工具主要有2种途径:
1.基于配置文件的使用
在运行 wpa_supplicant 时指定
-c 配置文件名
这种使用方法一般只针对连接知道ssid与psk的网络连接
2.wpa_cli 交互式控制
wpa_cli 是wpa_supplicant 的交互客户端,可完成
通过配置文件
方法做不到的复杂操作。
注意,wpa_cli 需要在 wpa_supplicant 已经执行的情况下才有效(最好是是使用nohup .. & > log
这样的方式运行)
- 扫描网络并获取结果:
# 扫描网络
wpa_cli -i wlan0 scan
# 获取当前结果
wpa_cli -i wlan0 scan_result
- 添加网络连接:
NID=`wpa_cli -i wlan0 add_network`
SSID=test_wifi_name
wpa_cli -i wlan0 set_network $NID ssid '$SSID'
# 无密码时的连接
wpa_cli -i wlan0 set_network $NID key_mgmt NONE
# 有密码时的连接
wpa_cli -i wlan0 set_network $NID psk '$PASSWD"'
# 设置网络属性(默认即可)
wpa_cli -i wlan0 set_network $NID priority 2
wpa_cli -i wlan0 set_network $NID scan_ssid 1
# 启动网络
wpa_cli -i wlan0 enable_network $NID
wpa_cli -i wlan0 select_network $NID
获取当前网络状态
wpa_cli -i wlan0 status
断开网络连接
wpa_cli -i wlan0 disable_network $NID
wpa_cli -i wlan0 remove_network $NID
- 保存网络配置到当前使用的配置文件中(一般用于未连接状态时)
wpa_cli -i wlan0 save_config
一般,本人会使用交互式的命令进行网络扫描,将结果过滤到文件中再根据前端调用发过来的SSID与PSK,生成一份临时的配置文件以后
最后重启 wpa_supplicant 时,指定好 临时的配置文件,再获取> 当前网络的状态,以实现wifi的后续使用(分配IP)
连接wifi的环境已经搭建好了。
有关dhcp自动分配IP的部分请参考《arm linux 移植 udhcp 与 使用》
arm linux 支持 wifi (wpa_supplicant)的更多相关文章
- Linux下Wi-Fi的实现:wireless_tools和wpa_supplicant
平台为hi35XX,在Liunx下借助wireless_tools和wpa_supplicant(因为现在的无线WIFI网络大多是wpa加密.所以需要移植wpa_supplicant工具)等工具实现w ...
- 嵌入式Linux利用Wifi搭建无线服务器(物联网实践之无线网关)
在 http://www.cnblogs.com/heat-man/p/4564539.html中,在嵌入式Linux开发板上我们从最底层实现了一个智能家居的远程控制系统,然而采取的是用网线连接到交换 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- ARM Linux 3.x的设备树(Device Tree)
http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1. ...
- ARM Linux启动代码分析
前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...
- ARM Linux 3.x的设备树(Device Tree)
1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...
- 【转】 ARM Linux 3.x的设备树(Device Tree)
1. ARM Device Tree起源 http://blog.csdn.net/21cnbao/article/details/8457546 Linus Torvalds在2011年3月1 ...
- arm linux kernel启动之start_kernel
了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...
- 【转】ARM Linux 3.x的设备树(Device Tree)
原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1. ARM Device Tree起源 Linus Torvalds在201 ...
随机推荐
- MySQL高级-索引1
1.索引是什么 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构. 可以理解为“排好序的快速查找数据结构” 在数据之外,数据库系统还维护着满足特定查找算法的 ...
- hutoolJava工具类的使用
前言 安装 友情开源项目 Hutool相关博客(软文) 捐赠使用公开 核心(Hutool-core) 克隆 支持泛型的克隆接口和克隆类 类型转换 类型转换工具类-Convert 自定义类型转换-Con ...
- 6 JavaScript函数&内置构造&函数提升&函数对象&箭头函数&函数参数&参数的值传递与对象传递
JavaScript函数:使用关键字function定义,也可以使用内置的JavaScript函数构造器定义 匿名函数: 函数表达式可以存储在变量中,并且该变量也可以作为函数使用. 实际上是匿名函数. ...
- 小程序云开发使用where查询遇到的问题
想用小程序云开发的where查询,结果不论输入什么都是不报错,开始没注意,后来发现输入数据库中有的数据时,给打印出来查询成功,输入数据库中没有的数据时,也会得到一个集合,只不过这个集合的长度为0而已. ...
- 3_07_MSSQL课程_Ado.Net_委托、事件
委托和事件的区别? (1)委托是一个类. 事件是一个委托类型的实列. (2)委托可以在定义委托实列的类的外部触发执行.(不安全) 事件只能能在定义它的类的内部触发执行.(安全),类外部只能注册事件的响 ...
- tensorflow变量的使用(02-2)
import tensorflow as tf x=tf.Variable([1,2]) a=tf.constant([3,3]) sub=tf.subtract(x,a) #增加一个减法op add ...
- LeetCode 345. Reverse Vowels of a String(双指针)
题意:给定一个字符串,反转字符串中的元音字母. 例如: Input: "leetcode" Output: "leotcede" 法一:双指针 class So ...
- Linux命令:ip命令
ip命令功能:配置网络属性 一.ip link 系列 ip link ip [-s] link show # 查看默认信息 ip link show eth0 ip link show ...
- CentOS7编译安装httpd-2.4.41
安装参考环境: CentOS Linux release 7.5.1804 (Core) 一.安装依赖包 httpd安装的依赖包 # yum -y install pcre-devel # yum - ...
- 工作脚本拆分xml文并重定向数据
sed -n '/<N/p' CM-ENB-SRVIDENTIFYBASEBSRTDD-2C-ALLV2.9.0-20191209020003.xml.gz.xml|awk -F"&g ...