1. 程式人生 > >Linux下Wi-Fi的實現:wireless_tools和wpa_supplicant

Linux下Wi-Fi的實現:wireless_tools和wpa_supplicant

erl 密碼 fig 而是 tar.gz 方式 控制 nec dbm

轉載於:https://www.cnblogs.com/lidabo/p/6069455.html

平臺為hi35XX,在Liunx下借助wireless_tools和wpa_supplicant(因為現在的無線WIFI網絡大多是wpa加密。所以需要移植wpa_supplicant工具)等工具實現wifi的過程。

一、移植wireless_tools

1. 下載並編譯wireless_tools

tar zxf wireless_tools.29.tar.gz(網上下載)

cd wireless_tools.29

make

成功後會在當前目錄生成iwspy,iwpriv,iwlist以及iwconfig等文件。

2. 拷貝文件

我們只需將這四個文件拷備到文件系統的sbin目錄,然後將當前目錄的libiw.so.29庫文件拷到文件系統的lib目錄,無線網絡工具即安裝完成。

二、加載無線網卡驅動模塊

網上有很多無線驅動模塊,可移植性很好。呵呵,我的是利用XX無線網卡公司提供的網卡驅動源碼,修改下Makefile(1.網卡選擇 2.平臺 3.內核路徑和工具鏈)以及os/linux下的config.mk(一般不需要修改),make得到的。

insmod rtutil5572sta.ko。 insmod rt5572sta.ko insmod rtnet5572sta.ko

三、指令的使用

1. 掃描可用的無線網絡

iwlistwifi-name scanning

其中wifi-name為無線網卡的名字,比如網卡eth0就是系統默認的網卡名字, wifi-name可以用ifconfig查看,一般為ra0(無線網卡),不過,需要ifconfig ra0 up

2. 掃描網絡信息

iwlistra0 scan

===>rt_ioctl_giwscan.11(11) BSS returned, data->length = 1427

ra0 Scan completed :

Cell 01 - Address:C4:CA:D9:1D:9E:A0

Protocol:802.11b/g/n

ESSID:""

Mode:Managed

Frequency:2.412 GHz(Channel 1)

Quality=7/100 Signal level=-87 dBm Noise level=-82 dBm

Encryption key:off

Bit Rates:54 Mb/s

如上:ESSID項的值即為無線網絡的名字,如上的“TXJ”等。如果值為空,說明在無線路由勾選了隱藏ESSID的選項。ESSID是很關鍵的,如果被隱藏了,也不是不能連接,而是需要破解,用到其他的工具,非常麻煩。

3. 設置要連接的網絡類型

iwprivra0 set NetworkType=Infra

4. 設置要連接的無線網絡的安全模式

iwprivra0 set AuthMode=WPA2PSK

5. 設置網絡加密方式:(CCMP即為AES)

iwprivra0 set EncrypType=TKIP

6. 設置連接時的密碼

iwprivra0 set WPAPSK=******* //********為加密網絡的密碼

7. 連接該網絡:有兩種方式:

<1> 用iwpriv命令

iwpriv ra0 set SSID=TXJ

<2> 用iwconfig命令

iwconfigra0 essid TXJ

至此,如果密碼正確,就可以連接上網絡TXJ了。

8. 查看狀態

iwpriv ra0 connStatus

當然,你也可以用iwconfig命令查看狀態。

四、wpa_supplicant

wpa_supplicant本是開源項目源碼,被谷歌修改後加入android移動平臺,它主要是用來支持WEP,WPA/WPA2和WAPI無線協議和加密認證的,而實際上的工作內容是通過socket(不管是wpa_supplicant與上層還是 wpa_supplicant與驅動都采用socket通訊)與驅動交互上報數據給用戶,而用戶可以通過socket發送命令給wpa_supplicant調動驅動來對WiFi芯片操作。 簡單的說,wpa_supplicant就是WiFi驅動和用戶的中轉站外加對協議和加密認證的支持。

wpa_supplicant由網卡公司提供,呵呵,同樣,網上也有很多相關資料,如下:

1.生成wpa_supplicant(網上下載,本人未試)

1.1下載並解壓wpa_supplicant需要的源碼

tarxvfz wpa_supplicant-0.7.2.tar.gz

tarxvfz wpa_supplicant-0.5.8.tar.gz

tarzxvf openssl-0.9.8e.tar.gz

1.2編譯openssl庫

將wpa_supplicant中的補丁拷貝到openssl中:

cp wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/

建立openssl編譯目標路徑:

mkdir /usr/local/ssl

修改openssl-0.9.8e目錄下的makefile文件,修改內容如下:

CC=arm-none-linux-gnueabi-gcc

AR=arm-none-linux-gnueabi-ar

RANLIB=arm-none-linux-gnueabi-ranlib

INSTALLTOP=/usr/local/ssl

OPENSSLDIR=/usr/local/ssl

然後編譯openssl:

make & make install

正常編譯後,在/usr/local/ssl中將會出現ssl庫。

1.3編譯wpa_supplicant

cd wpa_supplicant-0.5.8

cp defconfig .config

在.config中添加如下代碼:

CC=arm-none-linux-gnueabi-gcc-L /usr/local/ssl/lib/

CFLAGS+= -I/usr/local/ssl/include/

LIBS+= -L/usr/local/ssl/lib/

然後編譯:

make

經過編譯後的wpa_supplicant源程序可以看到兩個主要的可執行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的關系就是服務和客戶端的關系:後臺運行wpa_supplicant,使用wpa_cli來搜索、設置、和連接網絡。

2.把RT2870STA.dat文件復制到/etc/Wireless/RT2870STA 目錄下

1.1 mkdir -p /etc/Wireless/RT2870STA //創建多層目錄。

1.2 cp /mnt/rt5370/RT2870STA.dat /etc/Wireless/RT2870STA

3.首先關閉本地網卡,再啟動wifi網卡

#ifconfig eth0 down (如果非同一ip段,不需要關閉)

ifconfig ra0 up

啟動網卡後,會不斷出現錯誤:BIRIdx(1): RXDMALen not multiple of 4.[43507], BulkInBufLen = 416) 修改./MODULE/include/iface/rtmp_usb.h問題就能夠解決掉。 #define RXBULKAGGRE_SIZE 12 該為8

4.設置網卡參數

ifconfig ra0 192.168.2.188

#ifconfig ra0 broadcast 192.168.2.255 (廣播地址,默認)

#ifconfig ra0 netmask 255.255.255.0(子網掩碼,默認)

5.編寫wpa_supplicant.conf配置文件

ctrl_interface=/var/run/wpa_supplicant

network={

ssid="TXJ" //路由器名稱

scan_ssid=1

key_mgmt=WPA-EAP WPA-PSK IEEE8021XNONE

pairwise=TKIP CCMP

group=CCMP TKIP WEP104 WEP40

psk="xxxxx" //密碼

}

6.啟動命令

mkdir -p /var/run/wpa_supplicant

/mnt/rt5370/wpa_supplicant -Dwext-ira0 -c /etc/wpa_supplicant.conf

7.命令查看狀態

/mnt/rt5370/iwpriv ra0 connStatus //iwpriv文件放在/mnt/rt5370/目錄下,所以,需要這樣運行指令。

成功 ra0 connStatus:Connected(AP:TXJ[E0:05:C5:CF:F0:56])

然後,就可以ping通192.168.2.1,說明連接上路由器了。那麽,工作就完成了。

附:

-i<ifname>: 網絡接口名稱

-c<conf>:配置文件名稱

-C<ctrl_intf>:控制接口名稱

-D<driver>:驅動類型

-p<driver_param>:驅動參數

-b<br_ifname>:橋接口名稱

rt5370支持WPS,rt3070不支持

Linux下Wi-Fi的實現:wireless_tools和wpa_supplicant