linux下wifi實現
平臺為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. 拷貝檔案
我們只需將這四個檔案拷備到檔案系統的s
二、載入無線網絡卡驅動模組
網上有很多無線驅動模組,可移植性很好。呵呵,我的是利用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>:橋介面名稱