第三阶段应用层——2.8 视频监控—开发板上WIFI网卡的使用(1)-STA模式

视频监控—开发板上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的认证和加密方式

  无线网络,是指无需布线就能实现各种通信设备互联的网络。根据网络覆盖范围的不同,可以将无线网络划分为无线广域网(WWAN)、无线局域网(WLAN)、无线城域网(WMAN)和无线个人局域网(WPAN),其中在日常生活汇总应用最广泛的就是无线局域网(WLAN)

  对于网络安全的保证,主要通过网络的认证与加密来实现

第一阶段(认证/加密):Open / Open、Open / WEP、WEP / WEP

  • 认证方式——开放系统认证(Open)或 共享密钥认证(Shared)
    开放系统认证时启用WEP,此时,WEP在传输数据时加密,对认证没有任何作用;
    共享密钥认证,必须启用WEPWEP不仅用于认证,也用于在传输数据时加密
  • 加密方式——有线等效保密(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

  1. 解压:
    tar xzf libnl-3.2.23.tar.gz
  2. 配置:
    cd libnl-3.2.23/
    ./configure --host=arm-linux --prefix=$PWD/tmp
    在这里插入图片描述
  3. 编译
    出现错误:
    在这里插入图片描述
    解决方法:
    修改 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
在这里插入图片描述

  1. 安装
    make install
    在这里插入图片描述
    最终:在tmp目录下有如下
    在这里插入图片描述

  2. 把编译出来的头文件应该放入交叉编译工具的对应目录中
    进入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

  3. 把编译出来的库文件应该放入交叉编译工具的对应目录中
    进入tmp/lib,执行sudo cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

  4. 把编译出来的库文件中的.so文件放入开发板根文件系统的lib目录sudo cp *so* -d /work/nfs_root/fs_mini_mdev_new/lib


2、解压、配置、编译、安装iw工具

  1. 解压:
    tar xjf iw-3.11.tar.bz2
  2. 修改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))
  1. 编译
    出现错误:
    在这里插入图片描述
    解决方法;
    在info.c的代码前面添加
    #define htole16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)
    执行make
    在这里插入图片描述

  2. 把编译出来的iw可执行文件拷贝到开发板根文件系统的bin目录下
    执行cp iw /work/nfs_root/fs_mini_mdev_new/bin


3、使用iw工具

  1. iw list——列出WIFI网卡的性能
    在这里插入图片描述

  2. ifconfig wlan0 192.168.1.101——配置无线网卡ip
    在这里插入图片描述

  3. iw dev wlan0 scan——扫描附近的WIFI AP
    在这里插入图片描述

  4. ifconfig wlan0 up——启用无线网卡设备

  5. iw wlan0 connect xxx——连接到WIFI AP:xxx:检测到的网络名(open——无认证)

  6. iw wlan0 connect xxx keys d:0:baiwenwang123——连接到WIFI AP:xxx:检测到的网络名 (WEP),keys:密码,d: default, 0: 第0个密码

  7. iw wlan0 disconnect——断开网络连接


三、wpa_supplicant工具的使用


1、解压、配置、编译、安装依赖库libopenssl

  1. 解压:
    tar xzf openssl-1.0.1d.tar.gz
  2. 配置:
    ./config shared no-asm --prefix=$PWD/tmp
  3. 修改Makefile中的个别项如下:
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc
  1. 编译
    出现错误:
    在这里插入图片描述
    解决方法:
    删除Makefile中这句话的-m64
    在这里插入图片描述
    执行make
    在这里插入图片描述

  2. 安装
    出现错误:
    在这里插入图片描述
    解决方法:
    执行sudo rm -f /usr/bin/pod2man
    重新执行make install
    在这里插入图片描述

  3. 把编译出来的头文件应该放入交叉编译工具的对应目录中
    进入tmp/include,执行sudo cp * -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

  4. 把编译出来的库文件应该放入交叉编译工具的对应目录中
    进入tmp/lib,执行sudo cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

  5. 把编译出来的库文件中的.so文件放入开发板根文件系统的lib目录sudo cp *so* -d /work/nfs_root/fs_mini_mdev_new/lib


2、解压、配置、编译、安装wpa_supplicant工具

  1. 解压:
    执行tar xzf wpa_supplicant-2.0.tar.gz

  2. 配置
    执行cd wpa_supplicant-2.0/wpa_supplicant/进入目录
    执行cp defconfig .config,新建.config文件
    修改.config加上一行: CONFIG_LIBNL32=y
    在这里插入图片描述

  3. 修改Makefile
    wpa_supplicant-2.0/wpa_supplicant目录下的Makefile,修改为CC=arm-linux-gcc
    在这里插入图片描述

  4. 编译
    执行make
    在这里插入图片描述

  5. 安装
    执行make DESTDIR=$PWD/tmp install
    在这里插入图片描述
    生成的tmp目录下有如下文件:
    在这里插入图片描述

  6. 把编译出来的可执行文件拷贝到开发板根文件系统的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

  1. 拷贝plaintext.conf配置文件到开发板文件系统的/etc目录下,执行cp plaintext.conf /work/nfs_root/fs_mini_mdev_new/etc
  2. 修改配置文件为如下内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
        ssid="dswei"   # 网络名称:dswei
        key_mgmt=NONE  # 认证方式:无
}
  1. 开发板文件系统下,新建文件执行mkdir -p /var/run/wpa_supplicant
  2. 建立连接,执行wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
  3. 查看连接状态,执行wpa_cli -iwlan0 status

3.2 连接WEP/WE的WIFI

  1. 拷贝wep.conf配置文件到开发板文件系统的/etc目录下,执行cp wep.conf /work/nfs_root/fs_mini_mdev_new/etc
  2. 修改配置文件为如下内容:
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
}
  1. 建立连接,执行wpa_supplicant -B -c/etc/wep.conf -iwlan0
  2. 查看连接状态,执行wpa_cli -iwlan0 status

3.3 连接WPA(TKIP)的WIFI

  1. 拷贝wpa-psk-tkip.conf配置文件到开发板文件系统的/etc目录下,执行cp wpa_psk_tkip.conf /work/nfs_root/fs_mini_mdev_new/etc
  2. 修改配置文件为如下内容:
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"	# 网络密码
}
  1. 建立连接,执行wpa_supplicant -B -c/etc/wpa_psk_tkip.conf -iwlan0
  2. 查看连接状态,执行wpa_cli -iwlan0 status

3.4 连接WPA2(AES)的WIFI

  1. 拷贝wpa_wpa2.con配置文件到开发板文件系统的/etc目录下,执行cp wpa_wpa2.conf /work/nfs_root/fs_mini_mdev_new/etc
  2. 修改配置文件为如下内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
        ssid="dswei"   # 网络名称:dswei
        key_mgmt=NONE  # 认证方式:无
}
  1. 建立连接,执行wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
  2. 查看连接状态,执行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的网站,需要进行如下步骤

  1. 修改/etc/resolv.conf添加DNS
    执行vi /etc/resolv.conf,添加nameserver 192.168.1.1
    在这里插入图片描述

  2. 设置网关
    执行route add default gw 192.168.1.1

  3. 访问外网,执行ping www.baidu.com


四、dhcp工具的使用

上述使用iw、wpa_supplicant工具,都需要手动的设置无线网卡的IP,使用dhcp工具,则可以自动分配无线网卡的IP与网关


1、解压、配置、编译、安装dhcp工具

  1. 解压
    执行tar xzf dhcp-4.2.5-P1.tar.gz

  2. 配置
    进入到dhcp-4.2.5-P1目录,执行./configure --host=arm-linux ac_cv_file__dev_random=yes
    在这里插入图片描述

  3. 修改
    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}
  1. 编译
    退出到dhcp-4.2.5-P1目录,执行make
    在这里插入图片描述

  2. 安装
    执行make DESTDIR=$PWD/tmp install
    在这里插入图片描述

  3. 把编译出来的文件拷贝到开发板根文件系统的对应目录下
    进入到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
  1. 把编译出来的脚本文件拷贝到开发板根文件系统的对应目录下
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网卡插上开发板后

  1. 触发热拔插机制调用/etc/mdev.conf配置文件执行里面/sbin/auto_wifi.sh脚本
  2. 执行/sbin/auto_wifi.sh脚本,如果检测到是添加设备,则会走第一个分支执行wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0,根据/etc/wpa_wpa2.conf配置文件,进行网络的认证与连接
  3. 后执行/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网卡从开发板拔出后

  1. 触发热拔插机制调用/etc/mdev.conf配置文件执行里面/sbin/auto_wifi.sh脚本
  2. 执行/sbin/auto_wifi.sh脚本,此时检测到删除设备,则走第二个分支,执行 killall wpa_supplicant、 killall wpa_cli 与 killall dhclient,结束相关进程。

猜你喜欢

转载自blog.csdn.net/weixin_42813232/article/details/107770735