背景:

公司用的产品主板支持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)的更多相关文章

  1. Linux下Wi-Fi的实现:wireless_tools和wpa_supplicant

    平台为hi35XX,在Liunx下借助wireless_tools和wpa_supplicant(因为现在的无线WIFI网络大多是wpa加密.所以需要移植wpa_supplicant工具)等工具实现w ...

  2. 嵌入式Linux利用Wifi搭建无线服务器(物联网实践之无线网关)

    在 http://www.cnblogs.com/heat-man/p/4564539.html中,在嵌入式Linux开发板上我们从最底层实现了一个智能家居的远程控制系统,然而采取的是用网线连接到交换 ...

  3. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  4. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  5. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  6. 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 ...

  7. 【转】 ARM Linux 3.x的设备树(Device Tree)

    1.    ARM Device Tree起源 http://blog.csdn.net/21cnbao/article/details/8457546 Linus Torvalds在2011年3月1 ...

  8. arm linux kernel启动之start_kernel

    了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...

  9. 【转】ARM Linux 3.x的设备树(Device Tree)

    原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1.    ARM Device Tree起源 Linus Torvalds在201 ...

随机推荐

  1. python--脚本传参与shell脚本传参(位置参数)

    写一个最简单的shell脚本,了解shell脚本是如何传参 1. vim test1.sh name=$1 age=$2 echo ${name} echo ${age} 2.调用脚本并传参 sh t ...

  2. golang数据库操作初体验

    在golang中,提供了标准的数据库接口database/sql包,做过数据库开发的应该知道,不同的数据库有不同的数据库驱动.比如mysql等,我们可以去找 https://golang.org/s/ ...

  3. 小白学 Python 爬虫:Selenium 获取某大型电商网站商品信息

    目标 先介绍下我们本篇文章的目标,如图: 本篇文章计划获取商品的一些基本信息,如名称.商店.价格.是否自营.图片路径等等. 准备 首先要确认自己本地已经安装好了 Selenium 包括 Chrome ...

  4. 2.ORM框架添加,修改,删除操作

    创建了表对象,代码如下: from flask import Flask from flask_sqlalchemy import SQLAlchemy app=Flask(__name__) # 配 ...

  5. 2020新春公益赛 writeup

    简单的招聘系统 无需注册账号,admin'or 1#登陆,到blank page页面,在输入key处发现有注入点: /pages-blank.php?key=1%27+union+select+1%2 ...

  6. 吴裕雄--天生自然ORACLE数据库学习笔记:数据表对象

    create table students( stuno ) not null, --学号 stuname ), --姓名 sex ), --性别 age int, --年龄 departno ) n ...

  7. Aho-Corasick (AC) 自动机

    基础:AC自动机是建立在 trie 树和 kmp 基础之上的,为什么这么说,因为AC自动机是基于字典树的数据结构之上的,其次它是一个自动机,用到了 kmp 的失配数组的思想. 应用:在模式匹配的问题中 ...

  8. IIS URL Rewrite(URL 重写)-使用教程

    IIS URL Rewrite(URL 重写)-使用教程 作者:vkvi 来源:千一网络(原创) 日期:2011-8-17  http://www.cftea.com/c/2011/08/9CRXOL ...

  9. 三、linux基础-常用命令man_cd_|_find_ln_>_history

    3通用命令3.1 man命令man pwd      来查看该命令的全部帮助手册备注:命令最终是在内核中执行的,但是内核并无法直接识别,所以先通过shell执行,然后再交给内核执行3.2 cd 命令c ...

  10. Linux centosVMware 集群介绍、keepalived介绍、用keepalived配置高可用集群

    一.集群介绍 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heartbeat. ...