视频监控—开发板上WIFI网卡的使用(1)-STA模式
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3),无线WIFI网卡(RT3070)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:OV7740_CSP_DS_1.51 datasheet、S3C2440 datasheet
- 开发环境:Linux-4.13.0-41内核(虚拟机)、arm-linux-gcc-4.3.2工具链、linux-3.4.2内核(开发版根文件系统)
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
-
视频监控—开发板上WIFI网卡的使用(1)-STA模式
一、WIFI的认证和加密方式
无线网络,是指无需布线就能实现各种通信设备互联的网络。根据网络覆盖范围的不同,可以将无线网络划分为无线广域网(WWAN)、无线局域网(WLAN)、无线城域网(WMAN)和无线个人局域网(WPAN),其中在日常生活汇总应用最广泛的就是无线局域网(WLAN)。
对于网络安全的保证,主要通过网络的认证与加密来实现。
第一阶段(认证/加密):Open / Open、Open / WEP、WEP / WEP
- 认证方式——开放系统认证(Open)或 共享密钥认证(Shared)。
在开放系统认证时,启用WEP,此时,WEP在传输数据时加密,对认证没有任何作用;
在共享密钥认证,必须启用WEP,WEP不仅用于认证,也用于在传输数据时加密 - 加密方式——有线等效保密(WEP),使用对称加密算法(即发送方和接收方的密钥是一致的)
第二阶段(WPA标准):802.1x / TKIP, WEP、PSK / TKIP, WEP
- 认证方式——802.1x来进行认证、授权和密钥管理 或 预共享密钥(PSK)
- 加密方式——临时密钥完整性协议(TKIP)也是对称加密方法
第三阶段(WPA2):802.1x / CCMP(AES-CCMP), TKIP, WEP、PSK / CCMP(AES-CCMP), TKIP, WEP
- 认证方式——802.1x来进行认证、授权和密钥管理 或 预共享密钥(PSK)
- 加密方式——高级加密标准(AES-CCMP)
对于网络安装的发展,现存的3种标准:无加密、WPA、WPA2,其的安装性是递增的,对于认证方式802.1x 与 PSK,二者的原理如下:
- 对于802.1x,其需要的认证设备有如下三种,当访问网络的设备认证时,需通过认证服务器来进行设备的认证,认证成功后才可连接上AP。
- 对于PSK,其需要的认证设备有如下两种,当访问网络的设备认证时,当访问网络的设备输入的密码与AP事先设置好的密码一致时,就可以连接上AP,这种也是我们日常生活中所使用较为广泛的,如手机开热点
二、iw工具的使用
1、解压、配置、编译、安装依赖库libnl
- 解压:
tar xzf libnl-3.2.23.tar.gz
- 配置:
cd libnl-3.2.23/
./configure --host=arm-linux --prefix=$PWD/tmp
- 编译
出现错误:
解决方法:
修改lib/addr.c
,添加宏(宏来自内核源码)
/* Supported address families. */
#define AF_UNSPEC 0
#define AF_UNIX 1 /* Unix domain sockets */
#define AF_LOCAL 1 /* POSIX name for AF_UNIX */
#define AF_INET 2 /* Internet IP Protocol */
#define AF_AX25 3 /* Amateur Radio AX.25 */
#define AF_IPX 4 /* Novell IPX */
#define AF_APPLETALK 5 /* AppleTalk DDP */
#define AF_NETROM 6 /* Amateur Radio NET/ROM */
#define AF_BRIDGE 7 /* Multiprotocol bridge */
#define AF_ATMPVC 8 /* ATM PVCs */
#define AF_X25 9 /* Reserved for X.25 project */
#define AF_INET6 10 /* IP version 6 */
#define AF_ROSE 11 /* Amateur Radio X.25 PLP */
#define AF_DECnet 12 /* Reserved for DECnet project */
#define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/
#define AF_SECURITY 14 /* Security callback pseudo AF */
#define AF_KEY 15 /* PF_KEY key management API */
#define AF_NETLINK 16
#define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */
#define AF_PACKET 17 /* Packet family */
#define AF_ASH 18 /* Ash */
#define AF_ECONET 19 /* Acorn Econet */
#define AF_ATMSVC 20 /* ATM SVCs */
#define AF_RDS 21 /* RDS sockets */
#define AF_SNA 22 /* Linux SNA Project (nutters!) */
#define AF_IRDA 23 /* IRDA sockets */
#define AF_PPPOX 24 /* PPPoX sockets */
#define AF_WANPIPE 25 /* Wanpipe API Sockets */
#define AF_LLC 26 /* Linux LLC */
#define AF_CAN 29 /* Controller Area Network */
#define AF_TIPC 30 /* TIPC sockets */
#define AF_BLUETOOTH 31 /* Bluetooth sockets */
#define AF_IUCV 32 /* IUCV sockets */
#define AF_RXRPC 33 /* RxRPC sockets */
#define AF_ISDN 34 /* mISDN sockets */
#define AF_PHONET 35 /* Phonet sockets */
#define AF_IEEE802154 36 /* IEEE802154 sockets */
#define AF_CAIF 37 /* CAIF sockets */
#define AF_ALG 38 /* Algorithm sockets */
#define AF_NFC 39 /* NFC sockets */
#define AF_MAX 40 /* For now.. */
执行make
:
-
安装
make install
最终:在tmp
目录下有如下
-
把编译出来的头文件应该放入交叉编译工具的对应目录中:
进入tmp/include
,执行sudo cp * -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
进入tmp/include/libnl3
,执行sudo cp netlink -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
-
把编译出来的库文件应该放入交叉编译工具的对应目录中:
进入tmp/lib
,执行sudo cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
-
把编译出来的库文件中的
.so
文件放入开发板根文件系统的lib目录:sudo cp *so* -d /work/nfs_root/fs_mini_mdev_new/lib
2、解压、配置、编译、安装iw工具
- 解压:
tar xjf iw-3.11.tar.bz2
- 修改Makefile:
进入到iw-3.11/
,修改Makefile为如下:
10 CC = "arm-linux-gcc"
29 NL3xFOUND := Y
79 #LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))
80 #CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME))
-
编译
出现错误:
解决方法;
在info.c的代码前面添加
#define htole16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)
执行make
:
-
把编译出来的
iw
可执行文件拷贝到开发板根文件系统的bin
目录下:
执行cp iw /work/nfs_root/fs_mini_mdev_new/bin
3、使用iw工具
-
iw list
——列出WIFI网卡的性能
-
ifconfig wlan0 192.168.1.101
——配置无线网卡ip
-
iw dev wlan0 scan
——扫描附近的WIFI AP
-
ifconfig wlan0 up
——启用无线网卡设备 -
iw wlan0 connect xxx
——连接到WIFI AP:xxx:检测到的网络名(open——无认证) -
iw wlan0 connect xxx keys d:0:baiwenwang123
——连接到WIFI AP:xxx:检测到的网络名 (WEP),keys:密码,d: default, 0: 第0个密码 -
iw wlan0 disconnect
——断开网络连接
三、wpa_supplicant工具的使用
1、解压、配置、编译、安装依赖库libopenssl
- 解压:
tar xzf openssl-1.0.1d.tar.gz
- 配置:
./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
-
编译
出现错误:
解决方法:
删除Makefile中这句话的-m64
执行make
-
安装
出现错误:
解决方法:
执行sudo rm -f /usr/bin/pod2man
重新执行make install
-
把编译出来的头文件应该放入交叉编译工具的对应目录中:
进入tmp/include
,执行sudo cp * -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
-
把编译出来的库文件应该放入交叉编译工具的对应目录中:
进入tmp/lib
,执行sudo cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
-
把编译出来的库文件中的
.so
文件放入开发板根文件系统的lib目录:sudo cp *so* -d /work/nfs_root/fs_mini_mdev_new/lib
2、解压、配置、编译、安装wpa_supplicant工具
-
解压:
执行tar xzf wpa_supplicant-2.0.tar.gz
-
配置
执行cd wpa_supplicant-2.0/wpa_supplicant/
进入目录
执行cp defconfig .config
,新建.config
文件
修改.config
加上一行:CONFIG_LIBNL32=y
-
修改Makefile
在wpa_supplicant-2.0/wpa_supplicant
目录下的Makefile,修改为CC=arm-linux-gcc
-
编译
执行make
-
安装
执行make DESTDIR=$PWD/tmp install
生成的tmp目录下有如下文件:
-
把编译出来的可执行文件拷贝到开发板根文件系统的
bin
目录下:
执行cp iw /work/nfs_root/fs_mini_mdev_new/bin
3、使用wpa_supplicant工具
在/wpa_supplicant-2.0/wpa_supplicant/examples
目录在,有许多的配置项供不同的模式进行选择。
下面的xxx/xxx模式代表的是,认证/加密方式。
3.1 连接open/open的WIFI
- 拷贝
plaintext.conf
配置文件到开发板文件系统的/etc
目录下,执行cp plaintext.conf /work/nfs_root/fs_mini_mdev_new/etc
- 修改配置文件为如下内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
ssid="dswei" # 网络名称:dswei
key_mgmt=NONE # 认证方式:无
}
- 在开发板文件系统下,新建文件,执行
mkdir -p /var/run/wpa_supplicant
- 建立连接,执行
wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
- 查看连接状态,执行
wpa_cli -iwlan0 status
3.2 连接WEP/WE的WIFI
- 拷贝
wep.conf
配置文件到开发板文件系统的/etc
目录下,执行cp wep.conf /work/nfs_root/fs_mini_mdev_new/etc
- 修改配置文件为如下内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
ssid="dswei" # 网络名称:dswei
key_mgmt=NONE # 认证方式:无
wep_key0="baiwenwang123" # 网络密码
wep_tx_keyidx=0
}
- 建立连接,执行
wpa_supplicant -B -c/etc/wep.conf -iwlan0
- 查看连接状态,执行
wpa_cli -iwlan0 status
3.3 连接WPA(TKIP)的WIFI
- 拷贝
wpa-psk-tkip.conf
配置文件到开发板文件系统的/etc
目录下,执行cp wpa_psk_tkip.conf /work/nfs_root/fs_mini_mdev_new/etc
- 修改配置文件为如下内容:
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
3.4 连接WPA2(AES)的WIFI
- 拷贝
wpa_wpa2.con
配置文件到开发板文件系统的/etc
目录下,执行cp wpa_wpa2.conf /work/nfs_root/fs_mini_mdev_new/etc
- 修改配置文件为如下内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
ssid="dswei" # 网络名称:dswei
key_mgmt=NONE # 认证方式:无
}
- 建立连接,执行
wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
- 查看连接状态,执行
wpa_cli -iwlan0 status
3.5 在配置文件中设置多个network
在配置文件中设置多个network,如下图:
当开发板上的无线网卡连接的第一个网络dswei
断开时,则会顺序下去连接在配置文件中的网络Programer
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
psk="baiwenwang123"
}
network={
ssid="Programer"
psk="baiwenwang"
}
3.6 访问外网
当无线网卡已经连接上WIFI且WIFI是可以上网的,需要访问如www.baidu.com
的网站,需要进行如下步骤:
-
修改
/etc/resolv.conf
添加DNS:
执行vi /etc/resolv.conf
,添加nameserver 192.168.1.1
-
设置网关
执行route add default gw 192.168.1.1
-
访问外网,执行
ping www.baidu.com
四、dhcp工具的使用
上述使用iw、wpa_supplicant工具,都需要手动的设置无线网卡的IP,使用dhcp工具,则可以自动分配无线网卡的IP与网关。
1、解压、配置、编译、安装dhcp工具
-
解压
执行tar xzf dhcp-4.2.5-P1.tar.gz
-
配置
进入到dhcp-4.2.5-P1
目录,执行./configure --host=arm-linux ac_cv_file__dev_random=yes
-
修改
3.1 修改Makefile:
进入到bind
目录,修改为./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue
3.2 修改 lib/export/dns/Makefile.in :
解压tar xzf bind.tar.gz
,进入到cd bind-9.8.4-P2
目录,修改vi 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}
-
编译
退出到dhcp-4.2.5-P1
目录,执行make
-
安装
执行make DESTDIR=$PWD/tmp install
-
把编译出来的文件拷贝到开发板根文件系统的对应目录下:
进入到tmp/usr/local
目录,执行:
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
并修改开发板根文件系统vi etc/dhclient-script
#!/bin/bash
改为
#!/bin/sh
2、使用
2.1 简单使用
执行:
mkdir -p /var/db
wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
dhclient wlan0
执行完毕后,此时dhclient
自动分配无线网卡的ip
2.2 自动连接WIFI与配置无线网卡的ip
步骤1:一连接上WIFI AP, 就自动执行dhclient,自动配置无线网卡的ip
1.1 创建脚本/sbin/wpa_action.sh,执行vi /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
1.2 添加权限,执行chmod +x /sbin/wpa_action.sh
步骤2:一接入WIFI网卡,就自动执行wpa_supplicant,连接网络
2.1 添加配置文件/etc/mdev.conf
,执行vi /etc/mdev.conf
,内容为wlan0 0:0 777 * /sbin/auto_wifi.sh
2.2 添加脚本/sbin/auto_wifi.sh
,执行vi /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
2.3 添加权限,执行chmod +x /sbin/auto_wifi.sh
经过步骤1和步骤2的设置后,
当wifi网卡插上开发板后:
- 触发热拔插机制,调用
/etc/mdev.conf
配置文件,执行里面的/sbin/auto_wifi.sh
脚本 - 执行
/sbin/auto_wifi.sh
脚本,如果检测到是添加设备,则会走第一个分支,执行wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
,根据/etc/wpa_wpa2.conf
配置文件,进行网络的认证与连接 - 后执行
/sbin/auto_wifi.sh
脚本中的wpa_cli -a/sbin/wpa_action.sh -B
,调用/sbin/wpa_action.sh
脚本,接收的信号为CONNECTED
,则走第一个分支,执行echo connect $IFNAME, dhclient for it > /dev/console 与 dhclient $IFNAME
,自动分配无线网卡的ip
当wifi网卡从开发板拔出后:
- 触发热拔插机制,调用
/etc/mdev.conf
配置文件,执行里面的/sbin/auto_wifi.sh
脚本 - 执行
/sbin/auto_wifi.sh
脚本,此时检测到删除设备,则走第二个分支,执行killall wpa_supplicant、 killall wpa_cli 与 killall dhclient
,结束相关进程。