基於ARM板s3c2440---wifi網卡

基礎知識

wifi網卡有兩種工作模式:

  • 一種是無線終端模式(STA):這個模式就是我們平時用手機連接wifi時的模式,相當於客戶端。
  • 一種是無線熱點模式(AP):家裏的無線路由器均是這個模式,手機開熱點給朋友使用時也是出於該 模式下。

在使用無線網時,我們都知道需要無線網的密碼,以及通過無線網進行網上衝浪或者下載app,這裏就涉及無線網的安全性,無線網的安全性由兩部分組成:認證和加密。

  • 認證:只有路由器或者服務器允許的設備才能連接到無線網(即知道無線網的密碼或者暴力破解密碼)
  • 加密:確保數據的完整性和保密性,保證數據在傳輸過程中不被篡改或者丟失。

常用的認證方式有以下四種:

  1. 開放共享
  2. 共享密鑰認證
  3. 802.11x認證
  4. PSK認證
    其中802.11x認證和PSK認證具有較高的安全性。

常用的加密算法有三種:

  1. WEB加密
  2. TKIP加密
  3. CCMP加密

在這裏插入圖片描述
公共場所常見的wifi:連接wifi使用瀏覽器驗證,通過用戶自己的手機號以及驗證碼進行驗證,AP上傳給服務器進行數據的驗證,這種是802.11x的驗證方式。

無線網卡的選擇-----rt2800

  • VID和PID

對於一個陌生的USB網卡設備我們先將其插入PC機獲得VID和PID。在設備管理器中,找到該無線網卡,右鍵屬性,詳細信息中選中硬件id就能看到VID和PID。
在這裏插入圖片描述

配置內核、移植wifi網卡

在這裏插入圖片描述
Wi-Fi Device IDs in Linux網站中可以看到所有網卡文件在wireless裏面,因此在內核中找到相應的文件
在這裏插入圖片描述
使用grep命令尋找

	
grep "0x3070" drivers/net/wireless/ -nr

得到
在這裏插入圖片描述
或者使用find命令(注意:該方式必須知道文件的全名)

find -name rt2800usb.c

得到
在這裏插入圖片描述
進入rt2x00目錄,打開Makefile
在這裏插入圖片描述
找到rt2800usb.c在配置中的參數設置,用這個參數在配置內核時搜索,實行相應的配置
在這裏插入圖片描述
根據配置選項,depend on是以來的配置(只要以來中有一個是配置爲模塊,該選項就只能配置成模塊);selects是該選項爲Y時,selects中的選項自動配置爲y,爲m時自動配置爲模塊。

注意:可能某些選項由於依賴沒有開,可能會找不到,將依賴一個一個全配置了就出現了!

除了以上配置項,還需要安裝一個庫的配置項
在這裏插入圖片描述
這就是在insmod時出現某些函數找不到的原因
在這裏插入圖片描述
然後重新編譯內核make uImage && make modules(如果配置爲某塊,該步必須做,然後將某塊拷貝到網絡文件系統)
在這裏插入圖片描述

使用網卡

使用前需要下載該wifi網卡的固件rt2870.bin,找到網頁中
firmware在這裏插入圖片描述點進去,按最新版本下載,解壓後找到其中的rt2870.bin,拷貝到文件系統的/lib/firmware/下即可

如果是模塊,又不想每次都去加載模塊
可以在/etc/init.d/rcS 寫如下代碼:

insmod /lib/modules/3.4.2/rt2x00lib.ko
insmod /lib/modules/3.4.2/rt2x00usb.ko
insmod /lib/modules/3.4.2/rt2800lib.ko
insmod /lib/modules/3.4.2/rt2x00usb.ko

啓動wifi網卡

  • 設置網卡IP地址(注意:單板裝載上無線網卡後就是兩個網卡,同一單板的兩個網卡不能同一網段,這樣只能讓前一個網卡地址生效,原因在這裏
ifconfig wlan0 up
ifconfig wlan0 192.168.1.110

此時使用ifconfig就會看到無線網卡已經啓動成功

無線終端模式—STA

  • iw:可用於OPEN、WEP這兩種”認證/加密”,以及掃描WIFI熱點等;

  • wpa_supplicant:可用於前面4種”認證/加密”;

  • hostapd:能夠使得無線網卡切換爲AP模式;

  • dhcp:STA模式使WIFI網卡動態獲取IP,AP模式分配IP;

工具iw的使用

  • 編譯libnl庫

在使用前先編譯libnl庫

tar xzf libnl-3.2.23.tar.gz
cd libnl-3.2.23/
./configure --host=arm-linux --prefix=$PWD/tmp
修改 lib/addr.c 添加宏(宏來自內核源碼)
make(第一次make會找不打某些宏,修改 lib/addr.c後就能編譯了,直接去內核中搜索相關宏,然後貼進去就好)
make install

把編譯出來的頭文件應該放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

cd tmp/include/libnl3
sudo cp netlink -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

把編譯出來的庫文件應該放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把編譯出來的庫文件應該放入NFS文件系統的lib目錄:
/work/nfs_root/fs_mini_mdev_new/lib
  • iw工具的編譯
tar xjf iw-3.11.tar.bz2
cd iw-3.11/
修改Makefile:
CC = "arm-linux-gcc"
NL3xFOUND := Y
#LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))
#CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME))

在info.c的代碼前面添加
#define htole16(X)  (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)
  • 使用
iw list  // 列出WIFI網卡的性能
iw dev wlan0 scan   // 掃描WIFI AP
iw dev wlan0 scan | grep SSID:RedMi

iw wlan0 connect RedMi  // 連接到WIFI AP:RedMi (open)

手機熱點名字:RedMi

	
iw dev wlan0 link//查看狀態

iw wlan0 disconnect//斷開連接

這裏OPEN模式。
注意:手機熱點的網段是192.168.43.1,所以wlan0的ip也需要設置在該網段下;路由器網段是192.168.1.1

注意:如果需要ping外網,需要設置域名服務器(DNS)和網關
修改/etc/resolv.conf,添加DNS:nameserver 192.168.1.1,如果是手機熱點爲nameserver 192.168.43.1;
設置網關,輸入命令:route add default gw 192.168.1.1,如果是手機熱點爲route add default gw 192.168.43.1;

工具wpa_supplicant的使用

  • libopenssl編譯
tar xzf openssl-1.0.1d.tar.gz
cd openssl-1.0.1d/
./config shared no-asm --prefix=$PWD/tmp
修改Makefile:
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc

make
make install
安裝:
把編譯出來的頭文件應該放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

把編譯出來的庫文件應該放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把編譯出來的庫文件應該放入NFS文件系統的lib目錄:
/work/nfs_root/fs_mini_mdev_new/lib
  • wpa_supplicant編譯
tar xzf wpa_supplicant-2.0.tar.gz 
cd wpa_supplicant-2.0/wpa_supplicant/
cp defconfig .config
修改.config加上一行: CONFIG_LIBNL32=y
修改Makefile:
CC=arm-linux-gcc

make
make DESTDIR=$PWD/tmp install

使用
mkdir -p /var/run/wpa_supplicant ----一個目錄,用於wpa_supplicant和wpa_cli的socket通信

1.open模式
plaintext.conf配置文件(/etc/plaintext.conf)內容:

ctrl_interface=/var/run/wpa_supplicant
    network={
            ssid="RedMi"			//wifi名字
            key_mgmt=NONE		//密碼
    }

連接:wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
查看狀態:wpa_cli -iwlan0 status
設置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1

2.WEP/WEP
wep.conf配置文件內容:

ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="RedMi"
        key_mgmt=NONE
        wep_key0="baiwenwang123"---密碼必須13位
        wep_tx_keyidx=0
}

連接:wpa_supplicant -B -c/etc/wep.conf -iwlan0
查看狀態:wpa_cli -iwlan0 status
設置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1

3.WPA(TKIP)
wpa-psk-tkip.conf配置文件內容:

ctrl_interface=/var/run/wpa_supplicant  # 一個目錄,用於wpa_supplicant和wpa_cli的socket通信
network={
        ssid="dswei"
        proto=WPA  # proto: list of accepted protocols, 可取WPA,RSN
                   # If not set, this defaults to: WPA RSN
        key_mgmt=WPA-PSK # 認證方式
                         # If not set, this defaults to: WPA-PSK WPA-EAP
        pairwise=TKIP    # If not set, this defaults to: CCMP TKIP
        group=TKIP       # If not set, this defaults to: CCMP TKIP WEP104 WEP40 
        psk="baiwenwang12"
}

連接:wpa_supplicant -B -c/etc/wpa-psk-tkip.conf -iwlan0
查看狀態:wpa_cli -iwlan0 status
設置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1

4.WPA2(AES)—目前大部分wifi使用的模式、密碼8位及以上
wpa_wpa2.conf配置文件內容:

ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        psk="baiwenwang123"
}

連接:wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
查看狀態:wpa_cli -iwlan0 status
設置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1

注:以上所有配置文件均可設置多個連接,類似你的手機可以記住辦公室的wifi信息,同樣可以記住家裏wifi信息
格式如下:

ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        psk="baiwenwang123"
}
network={
        ssid="Programer"
        psk="baiwenwang"
}

在連接上手機或者路由器後,如果需要使用外網,還需要設置網關以及域名服務器(DNS)

修改/etc/resolv.conf添加DNS:
nameserver 192.168.1.1

開發板命令行輸入:route add default gw 192.168.1.1設置網關

工具DHCP的使用

在連接wifi後需要自己設置網關參數,這樣不是特別方便,因此引入DHCP,自動分配ip地址,連接好wifi後

dhclient wlan0

即可實現網關參數的自動分配設置

腳本自動化

在開發板執行完init進程後,開始執行第一個用戶的子進程,根據inittab中的順序進行執行
在這裏插入圖片描述
如上圖,首先執行rcS這個腳本(掛接其他文件系統、配置網絡等),這裏面可以自己添加想要自動執行的命令,例如裝載驅動以及運行其他腳本文件之類的;在啓動shell(命令行)以/dev/console作爲控制檯;組合鍵ctrl+alt+del是重啓;shutdown是關機
在這裏插入圖片描述
閒話:分析一下這個rcS
mount -a:根據/etc/fstab中的內容進行文件系統的掛接
echo /sbin/mdev > /proc/sys/kernel/hotplug -----啓動熱拔插事件,所有熱拔插都會調用 /sbin/mdev
mdev -s自動創建系統所需要的設備節點

wifi自動連接

在插入wifi模塊的時候就能自動啓動,實現自動連接無線AP。

  • 創建配置文件/etc/mdev.conf
wlan0 0:0 777 * /sbin/auto_wifi.sh
mdev.conf的格式:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

device regex:正則表達式,表示哪一個設備
uid: owner
gid: 組ID
octal permissions:以八進制表示的屬性
@:創建設備節點之後執行命令
$:刪除設備節點之前執行命令
*: 創建設備節點之後 和 刪除設備節點之前 執行命令
command:要執行的命令
  • 創建/sbin/auto_wifi.sh腳本文件
#!/bin/sh
if [ $ACTION = "add" ];
then                                              
   wpa_supplicant -B -c/etc/wpa_wpa2.conf  -iwlan0
   wpa_cli -a/sbin/wpa_action.sh -B
else                     
   killall wpa_supplicant
   killall wpa_cli 
   killall dhclient
fi

並賦予執行權限

chmod +x /sbin/auto_wifi.sh 

注意:/etc/wpa_wpa2.conf文件名字一定要寫正確

  • 創建wpa_action.sh
#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; then
   echo connect $IFNAME, dhclient for it > /dev/console
   dhclient $IFNAME
fi
if [ "$CMD" = "DISCONNECTED" ]; then
   echo disconnect $IFNAME, kill dhclient for it > /dev/console
   killall dhclient
fi

並賦予執行權限

chmod +x /sbin/wpa_action.sh

使用無線網卡的AP功能

AP功能就是講無線網卡設置爲可以供其他客戶端連接的模式

  • 編譯hostpad工具
tar xzf hostapd-2.0.tar.gz
cd hostapd-2.0/
cd hostapd/
cp defconfig .config
修改.config, 加一行: CONFIG_LIBNL32=y
修改Makefile:
CC=arm-linux-gcc
make
make DESTDIR=$PWD/tmp install
把生成的hostapd  hostapd_cli複製到NFS的bin目錄
  • 使用
    創建/etc/hostapd.conf配置文件
    1.open模式
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1

# 認證/加密方式
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0

2.WEP模式

ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1


macaddr_acl=0
auth_algs=2
ignore_broadcast_ssid=0
wep_key0="baiwenwang123"
wep_default_key=0

3.WAP/WAP2模式

ctrl_interface=/var/run/hostapd
ssid=S3C2440
#hw_mode=g
channel=1
interface=wlan0
#bridge=br0
driver=nl80211
macaddr_acl=0

# 認證/加密方式
auth_algs=1
wpa=3
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

註釋:
ctrl_interface:爲了後面hostapd_cli鏈接上hostapd;
ssid:無線熱點名字;
hw_mode:指定802.11協議,其中a=IEEE 802.11a,b=IEEE 802.11b, g=IEEE 802.11g;
channel:設定無線信道;
interface:指定使用哪一個無線網卡;
bridge:指定所處網橋,對於一個同時接入公網、提供內部網和無線接入的路由器來說,設定網橋很有必要;
driver:指定無線驅動;
macaddr_acl:指定MAC地址過濾規則:
       0表示允許除禁止列表外的設備;
       1表示只允許在允許列表的設備;
       2表示使用外部RADIUS服務器;
accept_mac_file:指定允許MAC列表文件所在路徑;
deny_mac_file:指定禁止MAC列表文件所在路徑;
auth_algs:指定採用哪種認證算法,採用位域(bit fields)方式來制定;
      1表示使用WPA;
      2表示使用WEP;
      3表示使用WPA/WEP;
wpa:指定WPA類型,採用位域(bit fields)方式來制定;
   1表示使用WPA;
   2表示使用WPA2;
   3表示使用WPA2/WPA;
wpa_passphrase:WIFI的密鑰;
wpa_key_mgmt:PSK爲個人AP,不使用服務器認證;
wpa_pairwise:指定WPA的加密方式;
rsn_pairwise:指定WPA2的加密方式;

  • 啓動dhcpd
    連接wifi後,AP端需要給客戶端分配ip地址

創建/etc/dhcpcd.conf配置文件(之前的配置文件可以重命名)

subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.10 192.168.2.100;
  option domain-name-servers 192.168.2.1;
  option routers 192.168.2.1;
}

指定了子網IP起始地址、子網掩碼、動態分配的IP範圍、DNS服務器、路由。

  • 手動操作AP模式
#1.啓動無線網卡,並設置IP
ifconfig wlan0 up
ifconfig wlan0 192.168.1.1

#啓動AP和DHCP
hostapd -B /etc/hostapd.conf
dhcpd -cf /etc/dhcpcd.conf wlan0
#停止命令
killall hostapd
killall dhcpd
#查看狀態
hostapd_cli all_sta
#查看熱點配置
	
hostapd_cli get_config

#查看已經連接的設備
	
iw dev wlan0 station dump

  • 自動使用無線AP模式
    1.創建/etc/mdev.conf(就是講之前的腳本文件改一下)
wlan0 0:0 777 * /sbin/auto_wifi_ap.sh

2.創建/sbin/auto_wifi_ap.sh

cat /sbin/auto_wifi_ap.sh 
#!/bin/sh
if [ $ACTION = "add" ]; 
then
   hostapd -B /etc/myhostapd.conf
   ifconfig wlan0 192.168.1.1
   dhcpd -cf /etc/dhcpd.conf wlan0
else
   killall hostapd
   killall dhcpd
fi

賦予權限

	
chmod +x /sbin/auto_wifi_ap.sh

至此無線網卡使用過程完畢,需要注意的是腳本的格式以及熱拔插的流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章