您的位置:首页 > 其它

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

2016-05-01 19:52 543 查看
=============================

主机操作系统: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 修改文件内容,重启网络服务或主机后效果不再生效

详情参考/article/6479105.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模式的脚本文件,转自大神博客/article/10820463.html

参考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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: