WIFI wpa_supplicant的移植和使用(3)

keep study發表於2020-11-14

2. 使用WIFI網路卡: iw, wpa_supplicant,dhcp
2.1 概念: 認證/加密
無線加密的多種方法及其區別(WEP WPA TKIP EAP)
http://wenku.baidu.com/link?url=DlLntlD490hAeIIbE-CO4QfAzgUC-gOTA7FCwS_XanOJMFzkyhQrFIB38ULKCcQIVFyDqqSWNWyq5kVtYAoJKjjf9pmZLu17-hVQ922WeaG

以手機上WIFI熱點為例,有4種常用的"認證/加密"
a. open
b. WEP
c. WPA(TKIP)
d. WPA2(AES)

2.2 編譯、使用iw,wpa_supplicant,dhcp
a. 舊工具iwconfig, iw是它的替代者, 可用於這2種"認證/加密": open, WEP
a.1 
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 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

a.2 
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網路卡的效能
ifconfig wlan0 up
iw dev wlan0 scan   // 掃描WIFI AP
iw wlan0 connect dswei  // 連線到WIFI AP:dswei (open)
iw wlan0 connect dswei keys d:0:baiwenwang123 // 連線到WIFI AP:dswei (WEP)
                            d: default, 0: 第0個密碼 
ifconfig wlan0 192.168.1.55
ping 192.168.1.1

iw wlan0 disconnect

b. wpa_supplicant : 可用於上述4種"認證/加密"
b.1 先編譯它的依賴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


b.2 要有一個配置檔案.config
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
① OPEN
wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
wpa_cli -iwlan0 status  // 檢視狀態
ifconfig wlan0 192.168.1.55
ping 192.168.1.1

配置檔案內容為:
ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        key_mgmt=NONE
}

② WEP/WEP
wpa_supplicant -B -c/etc/wep.conf  -iwlan0
wpa_cli -iwlan0 status  // 檢視狀態
ifconfig wlan0 192.168.1.55
ping 192.168.1.1

配置檔案:
ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        key_mgmt=NONE
        wep_key0="baiwenwang123"
        wep_tx_keyidx=0
}

③WPA(TKIP)
wpa_supplicant -B -c/etc/wpa-psk-tkip.conf  -iwlan0
wpa_cli -iwlan0 status  // 檢視狀態
ifconfig wlan0 192.168.1.55
ping 192.168.1.1

配置檔案
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"
}

④ WPA2(AES)
wpa_supplicant -B -c/etc/wpa_wpa2.conf  -iwlan0
wpa_cli -iwlan0 status  // 檢視狀態
ifconfig wlan0 192.168.1.55
ping 192.168.1.1

配置檔案:
ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        psk="baiwenwang123"
}

另:
wpa_cli可工作於"命令模式"和"互動模式"

⑤ 配置檔案裡設定多個network:
ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="dswei"
        psk="baiwenwang123"
}
network={
        ssid="Programer"
        psk="baiwenwang"
}

⑥ 訪問外網:
修改/etc/resolv.conf新增DNS:
nameserver 192.168.1.1

設定閘道器:
route add default gw 192.168.1.1

c. dhcp : 使得WIFI網路卡動態獲取IP
c.1 編譯、安裝
tar xzf dhcp-4.2.5-P1.tar.gz
cd dhcp-4.2.5-P1
./configure --host=arm-linux ac_cv_file__dev_random=yes

cd bind
修改Makefile:
./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue

tar xzf bind.tar.gz
cd bind-9.8.4-P2
修改 lib/export/dns/Makefile.in 
gen: ${srcdir}/gen.c
        ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
改為
gen: ${srcdir}/gen.c
        ${BUILD_CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}

cd ../..
make DESTDIR=$PWD/tmp install

把檔案複製到NFS
sudo cp bin/* /work/nfs_root/fs_mini_mdev_new/bin/
sudo cp sbin/* /work/nfs_root/fs_mini_mdev_new/sbin/
sudo cp etc/dhclient.conf.example //work/nfs_root/fs_mini_mdev_new/etc/dhclient.conf
sudo cp etc/dhcpd.conf.example //work/nfs_root/fs_mini_mdev_new/etc/dhcpd.conf

sudo cp client/scripts/linux /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
chmod +x /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
並修改
#!/bin/bash
改為
#!/bin/sh


c.2 使用:
mkdir -p /var/db
wpa_supplicant -B -c/etc/wpa_wpa2.conf  -iwlan0
dhclient wlan0

c.2 一接入WIFI網路卡,就自動執行wpa_supplicant等
參考第2期視訊第28課熱拔插
cat /etc/mdev.conf 
wlan0 0:0 777 * /sbin/auto_wifi.sh

cat /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 

    一連線上WIFI AP, 就自動執行dhclient
建立一指令碼:    
cat /sbin/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

wpa_cli -a/sbin/wpa_action.sh -B


3. 使用WIFI網路卡的AP功能

參考: 移植hostapd,搭建無線熱點 - 積水成淵 - 部落格頻道 - CSDN.NET.htm
http://blog.csdn.net/daydring/article/details/16337047

3.1 下載原始碼: http://w1.fi/hostapd/
3.2 編譯、安裝
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目錄

3.3 使用
a. hostapd的配置檔案: WPA/WPA2
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
wpa=3
wpa_passphrase=baiwenwang
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

把配置檔案存為/etc/myhostapd.conf
啟動 hostapd: hostapd -B /etc/myhostapd.conf

b. 啟動 dhcpd
修改配置檔案/etc/dhcpd.conf,新增:
subnet 192.168.1.0 netmask 255.255.255.0 {                       
  range 192.168.1.10 192.168.1.100;                              
  option domain-name-servers 192.168.1.1;                        
  option routers 192.168.1.1;                                    
}    

建立空檔案/var/db/dhcpd.leases:
> /var/db/dhcpd.leases

ifconfig wlan0 192.168.1.1
dhcpd -cf /etc/dhcpd.conf wlan0


3.4 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

3.5 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.6 修改/etc/mdev.conf自動啟動AP模式
cat /etc/mdev.conf 
wlan0 0:0 777 * /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

注意事項:
對於包含了AR9271網路卡驅動的核心,有一個問題:
在上電之前就接上了網路卡,那麼系統啟動後無法識別出這個網路卡。
解決方法:
1.上電後再接網路卡
2.把驅動編譯為模組,當系統啟動後再insmod: 可以在上電之前就接網路卡

可能原因:ath9k_htc.ko要用到韌體, 但是韌體要到根檔案系統被掛載後才能訪問

4. 仿手機寫一個WIFI操作程式
有這幾個功能:
a. 自動掃描WIFI熱點
b. 點選某個WIFI熱點後會去連線它, 必要時讓你輸入密碼
c. 曾經連線過的WIFI熱點會保留它的密碼等資訊, 以後會自動連線

wpa_supplicant  <===== wpa_cli
依照wpa_cli, 給wpa_supplicant發各種命令, 比如:
scan
add_network, set_network, select_network
save_config

核心:wpa_cli 通過 wpa_request 向 wpa_supplicant 發出命令,並得到結果

相關文章