rt3070无线网卡工作在AP模式----fl2440开发板

=============================
主机操作系统:Centos 6.5
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: linux-3.0
=============================

一、配置内核支持无线网卡softAP模式
这里写图片描述

在–Networking support
<*>RF switch subystem support —-> //这个一定要选上不然会出错

二、配置无线网络的软件移植
1、移植Openssl-0.9.8e
下载地址:
http://download.csdn.net/detail/u010944778/8940135

解压后修改Makefile
这里写图片描述

这里写图片描述
指定install、CC、AR、RANLIB

[hjiaming@centos6 libnl-1.1.4]$ mkdir install
[hjiaming@centos6 libnl-1.1.4]$ sudo make && make install

2、移植libnl
下载地址:
http://download.csdn.net/detail/u010944778/8940293

解压后创建指定安装目录

[hjiaming@centos6 libnl-1.1.4]$ mkdir install  

编译并安装libnl

./configure --prefix=/home/pikaqiu/tools/WIFI/libnl-1.1/install*(指定安装路径)* --host=arm-linux 
[hjiaming@centos6 libnl-1.1.4]$ make CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[hjiaming@centos6 libnl-1.1.4]$ sudo make install 

将/install下的lib文件夹中的libnl.so.1拷贝到开发板/lib目录下。

3、移植Hostapd
hostapd-1.0.tar.gz
下载地址:http://download.csdn.net/detail/u010944778/8940421

[hjiaming@centos6 hostapd]$ cp defconfig .config
[hjiaming@centos6 hostapd]$ vim .config

这里写图片描述

[hjiaming@centos6 hostapd]$ vim Makefile 

这里写图片描述
分别添加openssl和libnl的头文件和库路径

[hjiaming@centos6 hostapd]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[hjiaming@centos6 hostapd]$ sudo make install

生成了hostapd和配置文件hostapd.conf

hostapd主要就在于配置文件:
nterface=wlan0 //网络接口设备名称
driver=nl80211 //默认使用nl80211无线驱动
ssid=hjiaming //热点名称
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准
ignore_broadcast_ssid=0
auth_algs=1 //指定OSA认证算法
wpa=3 //指定WPA/WPA2类型
wpa_passphrase=123454321 //指定认证密钥
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP //启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise
rsn_pairwise=CCMP

(1) ssid:无线路由器发射的wifi名称;
(2) hw_mode:指定802.11协议,包括 a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g;

无线局域网标准 IEEE 802.11协议
*IEEE 802.11, 1997年,原始标准(2Mbit/s,工作在2.4GHz)。
*IEEE 802.11a,1999年,物理层补充(54Mbit/s,工作在5GHz)。
*IEEE 802.11b,1999年,物理层补充(11Mbit/s工作在2.4GHz)。
*IEEE 802.11g,2003年,物理层补充(54Mbit/s,工作在2.4GHz)。
使用最多的应该是802.11n标准,工作在2.4GHz频段,可达600Mbps(理论值)

(3)channel:设定无线频道;
(4)interface:接入点设备名称,注意不要包含ap后缀,即如果该设备称为wlan0ap,填写wlan0即可;
(5)driver:设定无线驱动,我这里是nl80211;
(6)auth_algs=1
其中auth_algs指定采用哪种认证算法,采用位域(bit fields)方式来制定,其中第一位表示开放系统认证(Open System Authentication, OSA),第二位表示共享密钥认证(Shared Key Authentication, SKA)。我这里设置alth_algs的值为1,表示只采用OSA;
(7)wpa:指定WPA类型,这是一个位域值(bit fields),第一位表示启用WPA,第二位表示启用WPA2。在我的配置中,无论设置成1、2或3,都可以正常连接
(8)wpa_passphrase: WPA/WPA2加密需要指定密钥,这个选项就是配置WPA/WPA2的密钥。注意wpa_passphrase要求8~63个字符。另外还可以通过配置wpa_psk来制定密钥,不过要设置一个256位的16进制密钥,不适合我们的需求;
(9)wpa_pairwise/rsn_pairwise:如果启用了WPA,需要指定wpa_pairwise;如果启用了WPA2,需要指定 rsn_pairwise,或者采用wpa_pairwise的设定。

接下来在板子上直接执行
~> hostapd -B hostapd.conf
如果编译过程出现缺少库的错误,请自行检查你hostapd所依赖的libnl库和openssl库是否成功交叉编译。
出现读取random随机数错误,可采用符号链接的方法解决:

~> mv /dev/random /dev/random.org
~> ln -s /dev/urandom /dev/random 

详细的文章链接:http://www.linuxidc.com/Linux/2012-05/60476.htm

4、配置udhcpd
修改 /opt/busybox-1.20.2/examples/udhcp/udhcpd.conf 然后拷贝到开发板 /etc 目录下。
修改地址池、默认网关以及DNS
这里写图片描述

这里写图片描述

1、修改IP池
起始IP的后两位可以随意,但必须在一个网段
192.168.x.y
192.168.x.z
2、修改执行dhcp功能的接口
可以用过ifconfig -a或者iwconfig命令来查看接口
3、修改DNS、网关、netmask等
opt dns 8.8.8.8 # DNS地址
option subnet 255.255.255.0 #子网掩码
opt router 192.168.2.1 #网关
其他默认即可

自动分配ip链接wifi
~>: ifconfig wlan0 192.168.3.1 netmask 255.255.255.0 (先把要接入点设备设置好)
~>: udhcpd -f /etc/udhcpd.conf
(注意!!!)这里执行的时候可能会出错!!!
~>: udhcpd -f /etc/udhcpd.conf
udhcpd (v1.20.2) started
udhcpd: can’t open ‘/var/lib/misc/udhcpd.leases’: No such file or directory
解决办法:
可能会提示没有一个叫做udhcpd.release的租赁文件,这个只要在相应的文件夹下创建即可。执行下面两条命令:
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
这时会显示udhcpd (v1.20.2) started
说明wifi可以链接
可以用手机链接wifi,开发板能ping自己的手机。

5、iptables移植
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter、natmangle三张表。
五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)

filter负责过滤数据包,包括的规则链有,input,output和forward;
nat则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
input匹配目的IP是本机的数据包,forward匹配流经本机的数据包,prerouting用来修改目的地址用来做DNAT,postrouting用来修改源地址用来做SNAT。

iptables-1.4.12.tar.gz
下载地址:http://download.csdn.net/detail/u010944778/8945513

[hjiaming@centos6iptables-1.4.12]$ mkdir install
[hjiaming@centos6iptables-1.4.12]$ ./configure 
--host=arm-linux --enable-static --disable-shared --prefix=/home/hjiaming/fl2440/wifi/iptables-1.4.12/install --disable-ipv6 --disable-largefile    //这里的文件夹是刚创建的文件夹路径
[hjiaming@centos6iptables-1.4.12]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static   //交叉编译器
[hjiaming@centos6 iptables-1.4.12]$ sudo make install
[hjiaming@centos6 iptables-1.4.12]$ cd /install/sbin
[hjiaming@centos6 iptables-1.4.12]$ file *
[hjiaming@centos6 iptables-1.4.12]$ su do /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi   //strip减小包的大小

CFLAGS和LDFLAGS:一般我们通过CFLAGS的 -I 选项告诉编译器所依赖的第三方的库的头文件在哪里,通过LDFLAGS的-L选项告诉链接器这些库的库文件在哪里;还有LIBS是告诉链接器要链接哪些库文件。简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。有时候LIBS指定了却找不到库时可以试试LDFLAGS。
此时将/install/lib文件夹和xtables-multi打包放到开发板/lib和/bin目录下,赋予权限后将xtables-multi改名为iptables

有了iptables命令工具之后来配置nat转发表,如下:
~>iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE// 将局域网内地址通过eth0接口伪装后转发出去

~>iptables -A FORWARD -i eth0 -o wlan0 -m state –state RELATED,ESTABLISH -j ACCEPT //对于已经建立连接的包以及该连接相关的包都允许通过

~>iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT // 配置数据包转发时候的接口

iptables主要参数
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理

A 向规则链中添加一条规则,默认被添加到末尾
-T指定要操作的表,默认是filter
-D从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R进行规则替换
-I插入一条规则,默认被插入到首部
-F清空所选的链,重启后恢复
-N新建用户自定义的规则链
-X删除用户自定义的规则链
-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s指定源地址
-d指定目的地址
-i进入接口
-o流出接口
-j采取的动作,accept,drop,snat,dnat,masquerade

开启linux 的转发功能! Linux系统是默认进制数据包转发的,所谓的转发就是当主机拥有多块网卡的时候,其中一块收到数据包,根据数据包的目的ip转发到本机的另一张网卡上,该网卡根据路由表继续发送数据包首先保证硬件连通,然后打开系统的转发功能
less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo “1” > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再生效
详情参考http://www.cnblogs.com/argb/p/3535179.html

查看是否已打开 ip 转发(1 表示打开):~>cat /proc/sys/net/ipv4/ip_forward
如果未打开,则用以下命令打开:
~>echo “1”>/proc/sys/net/ipv4/ip_forward

当配置都齐全之后,开机要做的工作是这些
ifconfig wlan0 192.168.3.1 netmask 255.255.255.0 up

mv /dev/random /dev/random.org

ln -s /dev/urandom /dev/random

hostapd -B /apps/hostapd.conf

udhcpd -f /etc/udhcpd.conf &

route add default gw 192.168.1.1

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -A FORWARD -i eth0 -o wlan0 -m state –state RELATED,ESTABLISH -j ACCEPT

iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

echo “1” > /proc/sys/net/ipv4/ip_forward

按顺序做完连上wifi热点就可以上网了

下面是一个同时实现rt3070的sta模式和ap模式的脚本文件,转自大神博客http://blog.csdn.net/hulu_arm/article/details/50739433
参考shell语法http://tsov.net/sh-script-syntax/

#!/bin/sh                                      
#Copyright (C) 2015 hulu<1334528355qq.com>                         
#This script is used to start Wifi                                                

export sta=/apps/wireless/sta                                                     
export AP=/apps/wireless/ap                                                            


read -p "choice Wifi mode(sta or ap):" mode                                            
echo "Worked on $mode now"                              

DEVICE=${1}                                             
dhcp=${2}                                                                              

#    cp $sta/libcrypto.a          /lib                                                 
#    cp $sta/libcrypto.so.0.9.8   /lib                                                 
#    cp $sta/libssl.so.0.9.8      /lib                                                 
#    cp $sta/libssl.a             /lib                                                 
#    cp $sta/wpa_supplicant       /bin                                                 
#    cp $sta/wpa_cli              /bin                                                 
#    cp $sta/wpa_passphrase       /bin                                                 

#    chmod 777  wpa*                                

#    mkdir -p                     /lib/firmware                    
#    cp $sta/rt2870.bin           /lib/firmware                    

configure_wifi_sta()                                                    
{                                                                                 
    ifconfig wlan0 up                                                                  
    wpa_supplicant -B -d -Dwext -iwlan0 -c $sta/wpa_supplicant.conf                    
    #ifconfig wlan0 192.168.0.120 broadcast 192.168.0.255 netmask 255.255.255.0 up     

#    cp $sta/default.script /usr/share/udhcpc/                          
#    chmod 777 default.script                                           

   if [ "$dhcp" = "dhcp" ]; then                                        
     udhcpc -i wlan0                                                    
   fi                                                                   

    ifconfig eth0 down                                                  
    echo "now wifi is active,you can internet."                                        
}                                                                                      




#    mkdir /lib/firmware                                                               
#    cp /apps/wireless/sta/rt2870.bin /lib/firmware/             

configure_wifi_ap()                                                     
{                                                                       
    mv /dev/random /dev/random.org  
ln -s /dev/urandom /dev/random                                                

    mkdir -p /var/lib/misc/                                                       
    touch /var/lib/misc/udhcpd.leases                                                  

    ifconfig wlan0 192.168.2.1                                                         
    ifconfig eth0 192.168.0.120 netmask 255.255.255.0 up                               
    route add default gw 192.168.0.1                               

#    cp $AP/libnl.so.1        /lib                                                     
    hostapd -B $AP/hostapd.conf                                                        

    if [ "$dhcp" = "dhcp" ]; then                                                      
      udhcpd  /etc/udhcpd.conf                                                         
    fi                                                                                 

    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE                               
    iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT                                     

    echo "1" >/proc/sys/net/ipv4/ip_forward                                       
    echo "now ap is active."                                                      
}                                                                                 


stop_wifi()                                                             
{                                                                                 
    #stop DHCP work on this NIC                                                        

    dhcp_pid=`ps | grep -v grep | grep "udhcp" | awk '{print $1;}'`                    
    if [ -n "$dhcp_pid" ]; then                                                        
    kill $dhcp_pid                                                      
    fi                                                                  

    ifconfig $DEVICE 0.0.0.0                                            

    #Stop wpa_supplicant work on STA mode                                              

     pid=`ps | grep -v grep | grep "wpa_supplicant" | awk '{print $1;}'`
     if [ -n "$pid" ]; then                                                            
     kill $pid                                                                         
     fi                                                                                

    if [ -d /var/run/wpa_supplicant ]; then                                            
    rm -rf /var/run/wpa_supplicant                                                     
    fi                                                                                 

     #Stop hostapd work on AP mode                                                     

     pid=`ps | grep -v grep | grep "hostapd" | awk '{print $1;}'`       
     if [ -n "$pid" ]; then
     kill $pid                                                          
     fi                                                                 

}                                                                                      

#begin!!!!!!!!                                                                         
if [ $mode = ap ]; then                                                                
 stop_wifi                                                                             
 configure_wifi_ap                                                                     
else                                                             
 stop_wifi                                                                             
 configure_wifi_sta                                                                    
exit                                                                    
fi
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值