1. 程式人生 > >基於wpa_supplicant庫的WIFI連線功能實現--wpa_cli命令解析

基於wpa_supplicant庫的WIFI連線功能實現--wpa_cli命令解析

從這裡開始,就正式進入到主題了,筆者分幾節來介紹如何一點點實現基於wpa_supplicant庫的WIFI連線功能。最終實現的就是類似於智慧手機上的wifi連線介面功能。開發平臺是linux3.2.0+qt4.5.2,硬體平臺不再說明,假定讀者已經做好了硬體的驅動適配和wpa_supplicant庫移植,這部分筆者先不做記錄,主要是wifi驅動筆者還沒研究好,作為以後的研究點吧。下面筆者先對wpa_supplicant和wpa_cli進行簡單介紹並解析其命令,因為最終程式就是依賴於這些命令實現的。

先給大家推薦一本書:深入理解Android:WiFi模組 NFC和GPS卷,這本書作者絕對是無線方面高手,如果想全面瞭解WIFI相關知識,建議閱讀此書。市面上講linux WIFI的書很少,這本不管是對理論還是程式碼分析,都比較細緻。筆者後面講解內容核心點都是圍繞如何去實現最終功能,所以沒辦法面面俱到,如果某個點讀者想深入瞭解,就從上面的書上去找。

  • 先大體介紹下wpa_supplicant

wpa_supplicant是一個開源軟體專案,它實現了Station對無線網路進行管理和控制的功能。wpa_supplicant有兩個版本,分別是6和8。版本6中沒有網絡卡作為Soft AP相關原始碼。目錄結構如下:
·hostapd:當手機進入Soft AP模式時,手機將扮演AP的角色,故需要hostapd來提供AP的功能。
·wpa_supplicant:Station模式,也叫Managed模式。
·src:hostapd和wpa_supplicant中都包含了一些通用的資料結構和處理方法,這些內容都放在此src目錄中。
以下凡是對wpa_supplicant都簡稱為WPAS

  • 軟體架構

WPAS是C/S結構中的Server端,Linux/UNIX平臺中,Client端利用Unix域socket與其通訊。linux平臺目前常用的Client端wpa_cli(無介面的命令列程式)和wpa_gui(UI用Qt實現)。

我們就是仿照wpa_cli來做我們自己的連線程式。下面就來看看wpa_cli是如何工作的。

  • 準備工作
    先移植好WPAS,然後用如下命令啟動server端:
    wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf -B
    配置檔案/etc/wpa_supplicant.conf 可以先寫如下資訊
ctrl_interface
=/var/run/wpa_supplicant

啟動成功後就可以執行wpa_cli客戶端了。
wpa_cli支援兩種模式:互動模式命令列模式
互動模式就是直接執行wpa_cli,然後輸入各種命令即可

[email protected]:~# wpa_cli
wpa_cli v0.6.9
Copyright (c) 2004-2009, Jouni Malinen <[email protected]> and contributors

This program is free software. You can distribute it and/or modify it
under the terms of the GNU General Public License version 2.

Alternatively, this software may be distributed under the terms of the
BSD license. See README and COPYING for more details.


Selected interface 'wlan0'

Interactive mode

> status
bssid=74:1f:4a:b2:e5:b3
ssid=QK-2
id=2
pairwise_cipher=WEP-104
group_cipher=WEP-104
key_mgmt=NONE
wpa_state=COMPLETED
ip_address=192.168.100.13
> 

每次輸入完畢後只需要敲回車就能執行命令,然後又可以輸入新的命令。

命令列模式就是我們普遍使用的模式,比如:

[email protected]:~# wpa_cli status
Selected interface 'wlan0'
bssid=74:1f:4a:b2:e5:b3
ssid=QK-2
id=2
pairwise_cipher=WEP-104
group_cipher=WEP-104
key_mgmt=NONE
wpa_state=COMPLETED
ip_address=192.168.100.13
[email protected]:~# 
  • 命令分析

我們先來看下都有什麼命令:執行help後可以看到一堆命令,筆者僅挑選我們需要的命令進行列舉:

1.status [verbose] = get current WPA/EAPOL/EAP status

此命令是用來得到當前WPAS的狀態,比如是掃描狀態還是連線狀態等等。

2.list_networks = list configured networks
列出所有儲存的AP資訊,這個要注意,執行此命令得到的配置資訊並非配置檔案中的AP列表,可以理解為當前記憶體中儲存的配置列表。首先啟動WPAS後,WPAS會從配置檔案讀取已經有的配置資訊進行初始化,比如筆者現在配置檔案如下:

root@am335x:~# vi /etc/wpa_supplicant.conf 

ctrl_interface=/var/run/wpa_supplicant
update_config=1

network={
        ssid="coff_tes"
        psk="1234567890"
        disabled=1
}

network={
        ssid="QK-1"
        psk="1234567890"
        disabled=1
}

那麼此時用list得到資訊如下:

> list
network id / ssid / bssid / flags
0       coff_tes        any     [DISABLED]
1       QK-1    any     [DISABLED]
> 

這是初始化狀態,如果後面我們用了連線命令,這個時候再list會發現配置項增多,而配置檔案在執行save_config之前是不會改變的。後邊筆者會再列出來。

3.add_network = add a network
增加一個配置項,這個命令只會增加一個配置項ID,但是配置還並沒有任何內容,相當於佔位。

> list
network id / ssid / bssid / flags
0       coff_tes        any     [DISABLED]
1       QK-1    any     [DISABLED]
> add_network
2

> list
network id / ssid / bssid / flags
0       coff_tes        any     [DISABLED]
1       QK-1    any     [DISABLED]
2               any     [DISABLED]
> 

此時就多了一個2號配置項,但是還沒有任何內容

4.set_network
這個命令非常重要,使用了設定配置的ssid、密碼等資訊,假如2號我們想設定成一個名為“test2”,加密方式為WPA方式的AP,密碼為“1234567890”。那麼可以這麼寫:

set_network 2 ssid "test2"
set_network 2 psk "1234567890"

此時再執行list發現有了ssid配置

> list
network id / ssid / bssid / flags
0       coff_tes        any     [DISABLED]
1       QK-1    any     [DISABLED]
2       test2   any     [DISABLED]

這裡必須要簡單講下WIFI的加密了,想要詳細瞭解的讀者還是建議去讀《深入理解Android:WiFi模組》。我們在設定路由時候通常會看到有個加密項,加密選項分為:NONE/WEP/WPA(WPA2)三種方式,現在普通路由一般只有兩個了,WEP基本已經不適用了,讀者可以用手機作為WIFI熱點測試下。這裡不去講述三種加密方式的概念和原理,而是分別就每種加密方式列出其連線方式。

  • NONE方式
    當所需要連線的AP加密方式為NONE時候,不需要密碼設定,此時假如已經執行了add_network命令添加了新的配置項且index=2,需要連線的AP名稱為”coffee”,首先增加配置項的ssid:
    set_network 2 ssid “coffee”
    然後指明此配置項屬於NONE方式加密:
    **set_network 2 key_mgmt

  • WPA(WPA2)方式
    這是我們現在最常用的方式,也是最安全的加密方式。這個上面已經提到了,此方式需要設定ssid和密碼。
    set_network 2 ssid “coffee” //設定ssid
    set_network 2 psk “1234567890” //設定密碼

  • WEP方式
    這種方式現在很少見了,不過也提一下:
    set_network 2 ssid “coffee” //設定ssid
    set_network 2 key_mgmt NONE
    set_network 2 wep_key0 “1234567890” //設定密碼
    set_network 2 wep_tx_keyidx 0

5.select_network
這個命令就相當於連線命令了,當用前面的“新增”和“配置”命令完成AP的配置後,就可以用這個命令來連線想要連線的AP了。比如上面增加了2號AP後,直接用下面命令就可以連線新的AP。

select_network 2

當然,只要配置項有的都可以連線,並不是只能連線新加的AP。看下此命令的幫助資訊:

select_network <network id> = select a network (disable others)

注意括號內容,也就說執行此命令後,WPAS會開始嘗試連線選定的AP,並且會把配置項中其它的AP disable,為什麼這麼做呢,筆者在編寫連線程式時曾經嘗試使用此命令後立馬使能所有配置項中的AP,結果發現想要連線的AP根本連線不上,WPAS會自動連線到其它已經儲存的AP上,即使你的密碼等配置是正確的。這是因為AP在首次連線的時候,輸入密碼後會有個客戶端和AP“握手”的流程,就是驗證身份,但是此過程中WPAS仍然會去嘗試連線其它的配置項,而已經儲存的配置項會更快的連線到AP,就導致了新加入的AP無法成功連線。

6.scan和scan_results
這兩個命令是配合使用的,scan是讓硬體執行掃描操作,它會掃描附近所有的AP並把掃描結果存入記憶體。如果我們要檢視掃描結果,需要用scan_results。


> scan
OK
> scan_results<2>CTRL-EVENT-SCAN-RESULTS 

bssid / frequency / signal level / flags / ssid
74:1f:4a:b2:e5:b2       2412    100     [WPA-PSK-TKIP][WPA2-PSK-TKIP]   QK-1
bc:ae:c5:a5:8c:14       2432    100     [WPA-PSK-TKIP][WPS]     QK-WIFI
50:bd:5f:75:5e:42       2462    100     [WPA-PSK-CCMP][WPA2-PSK-CCMP]   caiyiwang
e8:4e:06:21:d4:fe       2437    100     [WPA2-PSK-CCMP] cmcc-coffee
20:f4:1b:10:6c:b1       2412    95      [WPA2-PSK-CCMP] 8899
cc:af:78:08:da:3c       2462    84      [WPA2-PSK-CCMP] ALB-gl
8c:be:be:1d:6c:00       2412    74      [WPA2-PSK-CCMP] 1-Xiaomi
00:36:76:08:03:2d       2437    72      [WPA-PSK-CCMP][WPA2-PSK-CCMP]
64:d9:54:bb:3d:15       2412    60      [WPA-PSK-CCMP][WPA2-PSK-CCMP]   Baidu1788
d8:49:2f:b9:1c:01       2422    60      [WPA2-PSK-CCMP] B91C01-MG2900series
a2:18:28:21:cc:0b       2437    69      [WPA2-PSK-CCMP] ___fan______ iPhone
c0:61:18:9c:6e:3a       2462    47      [WPA2-PSK-CCMP] TP-LINK_6E3A
d8:5d:4c:36:b0:6a       2452    46      [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS]      heshangda1
c0:61:18:5d:75:4a       2462    46      [WPA-PSK-CCMP][WPA2-PSK-CCMP]   aotai
00:36:76:59:59:97       2462    43      [WPA-PSK-CCMP][WPA2-PSK-CCMP]   GUANGFU
0c:72:2c:4a:f7:6a       2462    43      [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS]      SSDZ
74:1f:4a:b2:e5:b3       2412    100     [WEP]   QK-2
> 

掃描的AP資訊包括:AP的MAC地址、通道、訊號強度、加密方式、SSID

其它命令不再列出,可以檢視幫助資訊自行測試,下一節我們就要藉助這些命令來實現我們的WIFI連線程式了,所以搞清楚這些命令的使用流程是非常有必要的。

相關推薦

基於wpa_supplicantWIFI連線功能實現--wpa_cli命令解析

從這裡開始,就正式進入到主題了,筆者分幾節來介紹如何一點點實現基於wpa_supplicant庫的WIFI連線功能。最終實現的就是類似於智慧手機上的wifi連線介面功能。開發平臺是linux3.2.0+qt4.5.2,硬體平臺不再說明,假定讀者已經做好了硬體的驅

基於樹莓派的AirPlay功能實現

手裡有一個第一代的樹莓派開發板,很長時間都沒有使用過。今天嘗試著搭建一個支援AirPlay的服務。順便回顧一下樹莓派的燒錄、配置、遠端登入等操作。 概述 AirPlay是蘋果公司的在iOS4.2及OS X Mountain Lion中加入的

基於SpringBoot的密碼找回功能實現

tro uri md5 之前 nbsp 做的 我們 info 刪除 前言 最近在做自己的項目,其中有一個大家都知道的功能就是找回密碼。這裏分享一下我的做法,因為這中間實在有太多坑了。所以記錄一下。 使用技術:SpringBoot1.5.6、JPA、SpringSecurit

Android 基於Zxing的掃碼功能實現(二)

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 引言 本篇博文是基於 Android 二維碼的掃碼功能實現(一) 文章寫的,建議閱讀這篇文章之前,先看看上篇文章。還有建議閱讀本文的同學,結合zxing的原始碼理解。 上篇部落格說明z

Keras:基於python之Keras建立模型演算法來實現預測功能的詳細攻略

Keras:基於python庫之Keras建立模型演算法來實現預測功能的詳細攻略   思路分析 1、實現分類預測:通過Keras建立模型,最終得到的模型能進行兩種預測,一是判斷出類別,二是給出屬於相應類別概率。 (1)、在Keras中,可以利用predict_class()

Android 基於Socket的長連線實現一個實時推送的功能

實現此功能需要考慮的幾點: 1)如何保證Socket長連線一直存在並有效執行 2)通過Service執行Socket,當服務端有資料時,通過廣播或者handler來更新UI 具體效果,來上程式碼: @Override public void run() { try

基於矢量數據的逆地理編碼功能實現

逆地理編碼 地圖矢量數據 地圖地物搜索 地圖範圍搜索 地圖框選搜索 地理編碼和逆地理編碼概述地理編碼,是指將大家熟悉的地址文字描述,轉換為經緯度,如輸入某某省、某某市、某某路,在地圖上根據經緯度定位到輸入的地圖上的某個點,直觀的顯示所在位置。逆地理編碼是指將經緯度轉化為大家都能看懂文字描述

CentOS6基於源碼編譯安裝LAMP實現WordPress功能和xcache功能

lamp、wordpress、php-xcache前言:APR(Apache portable Run-time libraries,Apache可移植運行庫)的目的如其名稱一樣,主要為上層的應用程序提供一個可以跨越多操作系統平臺使用的底層支持接口庫。php的加速器xcache:基於PHP的特殊擴展機制如op

搜索引擎之全文搜索算法功能實現基於Lucene)

lucene java 算法 搜索引擎 之前做去轉盤網的時候,我已經公開了非全文搜索的代碼,需要的朋友希望能夠前去閱讀我的博客。本文主要討論如何進行全文搜索,由於本人花了很長時間設計了新作:觀點,觀點對全文搜索的要求還是很高的,所以我又花了不少時間研究全文搜索,你可以先體驗下:點我搜索。廢話也

生成EXCEL文件是經常需要用到的功能,我們利用一些開源可以很容易實現這個功能

ger gets dispose != mps x11 xls del lai 方法一:利用excellibrary,http://code.google.com/p/excellibrary/ excellibrary是國人寫的開源組件,很容易使用,可惜貌似還不支持.xl

基於邏輯卷LVM的MySQL、mariadb數據備份還原詳細實現

快照恢復數據庫 lvm 前提是數據庫的數據是放在邏輯卷上的; 數據庫數據和日誌分開存放;正常情況下數據和日誌是放在兩個獨立的磁盤上,如果是raid的話,那麽就無所謂了。創建分區: [root@mysql ~]$fdisk /dev/sda Command (m for

基於Orangpi Zero和Linux ALSA實現WIFI無線音箱(二)

memfree 線程 取數據 edit 這一 緩沖 一起 說了 cpp 作品已經完成,先上源碼: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,這是第二篇,主要講述發送端程序的原理和過程。 第一篇

基於Orangpi Zero和Linux ALSA實現WIFI無線音箱(三)

http 和源 cal 快速實現 播放音樂 lis 類型 ive 此外 作品已經完成,先上源碼: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,這是第三篇,主要講述接收端程序的原理和過程。 第一篇

python之selectors 基於epoll的TP傳輸層實現和 Windows之IOCP

  在之前的部落格中已經總結過分別在windows和linux作業系統下實現socket高併發(I/O非同步)的方法,可以參考基於epoll的TP傳輸層實現和Windows之IOCP   下面對Python中實現socket高併發的selectors庫進行總結,官方參考文件:https://docs.pyt

Android 二維碼開發功能實現(四)------基於Zxing實現編碼功能(生成二維碼,一維碼等)

Android 二維碼開發功能實現(四)------基於Zxing實現編碼功能(生成二維碼,一維碼等) 前言 關於Google的開源庫Zxing,前面也寫了幾遍文章進行介紹.我們先簡單的回顧一下! Android 二維碼的掃碼功能實現(一) 這篇文章主要介紹了,Zxi

Linux——虛擬機器實現wifi上網功能,DNS的設定,nmcli命令

一、虛擬機器如何實現wifi上網功能 本節內容原理: 真機——>充當路由器 虛擬機器——>通過真機(路由器)實現wifi上網 首先:檢視真機ip:172.25.254.64,並給電腦連線wifi 真機ping百度——>成功 編輯配置檔案(

基於freemark,ssm和Oracle實現的分頁功能

freemark頁面`<#list mesgList as mesg> m e

常用介面限流功能實現基於Guava設計

Guava是一組核心庫,包括新的集合型別(例如multimap和multiset),不可變集合,圖形庫,函式型別,記憶體快取以及用於併發,I / O,雜湊,基元的API /實用程式,反射,字串處理等等! 本示例只使用了Guava工具包的RateLimiter類,進行API的限流。 限

Linux系統下中 在命令列中實現Wifi 連線的方法

Linux系統下中 在命令列中實現Wifi 連線的方法 from:https://www.cnblogs.com/chaobest/articles/6693161.html 無論何時要安裝一款新的 Linux 發行系統,一般的建議都是讓您通過有線連線來接到網際網路的。 這主要的原因有兩

基於java的收藏排行功能之一:前端實現

1 需求:實現瀏覽器端的使用者收藏排行功能,同時實現搜尋、分頁功能。後臺實時提供資料更新 2 技術:html、JQuery、 3 頁面展示: 4前端頁面程式碼實現: <!DOCTYPE html> <html lang="en"> <