基于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

至此无线网卡使用过程完毕,需要注意的是脚本的格式以及热拔插的流程

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值