RT3070之STA模式实现无线上网

成功的秘诀,在永不改变既定的目的 ——卢梭

RT3070是台湾雷凌科技有限公司生产的usb无线网卡,其有两种工作模式——STA(无线上网)和AP(路由去器功能),本篇文章主要介绍STA工作模式,使其实现无线上网功能。

由于我们使用的是USB无线网卡处理芯片,所以在此之前我们应该已经完成USB驱动的移植以及dm9000网卡的移植,相关文章可以看本人以前的博客。

做好这些准备,就开始干事了,我们基于内核3.0.54版本:

[*] Networking support  --->  
    -*-   Wireless  --->  
         <*>   cfg80211 - wireless configuration API  
         [*]     enable powersave by default  
         [*]     cfg80211 wireless extensions compatibility 
         [*]   Wireless extensions sysfs files  
         {*}   Common routines for IEEE802.11 drivers 
         <*>   Generic IEEE 802.11 Networking Stack (mac80211)
     Device Drivers  --->
        Generic Driver Options  --->
            -*- Userspace firmware loading support    
            [*]   Include in-kernel firmware blobs in kernel binary 
        [*] Network device support  --->  
            [*]   Wireless LAN  --->  
                <*>   Ralink driver support  --->
                    <*>   Ralink rt27xx/rt28xx/rt30xx (USB) support
                    [*]     rt2800usb - Include support for rt33xx devices  
                    [*]   Ralink debug output

重新make之后,将生成的新内核烧进开发板,启动开发板后,查看我们的网卡信息

这里写图片描述

网卡成功创建后需要使能,这里要先在虚拟机上下载RT2870的固件

wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/rt2870.bin

将我们下载的rt2870.bin烧录到开发板中,可以在开发板中创建一个目录存放

接下来就是使能网卡了:

ifconfig wlan0 up
ifconfig   //查看已经使能的网卡信息

不出意外应该能看到eth0和wlan0两个已经使能的网卡

网卡已经使能了,接下来就是一直我们的opemssl库了,为了方便起见,这里给出一个一键移植的脚本文件。

#!/bin/sh

#+--------------------------------------------------------------------------------------------
#|Description:  This shell script used to download tree wireless_tools code and cross compile it.
#|     Author:  TangYanjun <tangyanjun@qq.com>
#|  ChangeLog:
#|           1, Initialize 1.0.0 on 2017.6.1
#+--------------------------------------------------------------------------------------------

PRJ_PATH=`pwd`

APP_NAME="openssl-0.9.8i"
PACK_SUFIX="tar.gz"
DL_ADDR="http://www.openssl.org/source/$APP_NAME.$PACK_SUFIX"
INST_PATH=$PRJ_PATH/install
#INST_PATH=../install

ARCH=arm920t
CROSS="/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-"

sup_arch=("" "arm926t" "arm920t" )

function select_arch()
{
   echo "Current support ARCH: "
   i=1
   len=${#sup_arch[*]}

   while [ $i -lt $len ]; do
     echo "$i: ${sup_arch[$i]}"
     let i++;
   done

   echo "Please select: "
   index=
   read index
   ARCH=${sup_arch[$index]}
}


function decompress_packet()
(
   echo "+---------------------------------------------+"
   echo "|  Decompress $1 now"  
   echo "+---------------------------------------------+"

    ftype=`file "$1"`
    case "$ftype" in
       "$1: Zip archive"*)
           unzip "$1" ;;
       "$1: gzip compressed"*)
           if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
               tar -xzf $1
           else
               gzip -d "$1"
           fi ;;
       "$1: bzip2 compressed"*)
           if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
               tar -xjf $1
           else
               bunzip2 "$1"
           fi ;;
       "$1: POSIX tar archive"*)
           tar -xf "$1" ;;
       *)
          echo "$1 is unknow compress format";;
    esac
)

if [ -z $ARCH ] ; then
  select_arch
fi

if [ "arm920t" != $ARCH  -a "arm926t" != $ARCH ] ; then 
    echo "+------------------------------------------------------------------+"
    echo "|  ERROR: Unsupport platform $ARCH to cross compile "  
    echo "+------------------------------------------------------------------+"
    exit -1;
else
    CROSS="/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-"
fi 

export CC=${CROSS}gcc 
export CXX=${CROSS}g++ 
export AR=${CROSS}ar 
export AS=${CROSS}as 
export LD=${CROSS}ld 
export NM=${CROSS}nm 
export RANLIB=${CROSS}ranlib 
export STRIP=${CROSS}strip

# Download source code packet
if [ ! -s $APP_NAME.$PACK_SUFIX ] ; then 
    echo "+------------------------------------------------------------------+" 
    echo "|  Download $APP_NAME.$PACK_SUFIX now "  
    echo "+------------------------------------------------------------------+" 
    wget $DL_ADDR 
fi 

# Decompress source code packet 
if [ ! -d $APP_NAME ] ; then 
    decompress_packet $APP_NAME.$PACK_SUFIX 
fi

if [ ! -d $INST_PATH ] ; then
    mkdir -p $INST_PATH
else
    echo "$APP_NAME already cross compiled, exit now..."
    exit;
fi

echo "+------------------------------------------------------------------+"
echo "|          Build $APP_NAME for $ARCH "
echo "| Crosstool:  $CROSS"
echo "+------------------------------------------------------------------+"

cd $APP_NAME
   set -x
   patch -p1 < ../patch/$APP_NAME-tls-extensions.patch 

   #Modify the compiler
   FILE=Makefile
   line=`sed -n '/^CC= cc/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|CC = ${CROSS}gcc|" $FILE 
   fi

   line=`sed -n '/^AR=ar/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|AR = ${CROSS}ar \$(ARFLAGS) r|" $FILE 
   fi

   line=`sed -n '/^RANLIB= /=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|RANLIB = ${CROSS}ranlib|" $FILE 
   fi

   #Support build shared library
   line=`sed -n '/^OPTIONS= /=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|OPTIONS=enable-shared no-camellia no-capieng no-cms no-gmp no-krb5 no-mdc2 no-montasm no-rc5 no-rfc3779 no-seed no-tlsext no-zlib no-zlib-dynamic|" $FILE
   fi

   line=`sed -n '/^SHLIB_EXT=/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|SHLIB_EXT=.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)|" $FILE 
   fi

   line=`sed -n '/^SHLIB_TARGET/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|SHLIB_TARGET=linux-shared|" $FILE 
   fi

   line=`sed -n '/^build_all:/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|build_all: build_libs build_apps build_tests build_tools build-shared|" $FILE 
   fi

   #Modify install path
   line=`sed -n '/^INSTALLTOP=/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|INSTALLTOP = $INST_PATH|" $FILE
   fi

   line=`sed -n '/^OPENSSLDIR=/=' $FILE` 
   if [ -n "$line" ] ; then 
       sed -i -e ${line}s"|.*|OPENSSLDIR = $INST_PATH|" $FILE 
   fi

   make && make install
   #cp -af *.so* $INST_PATH/lib
cd -

要注意的就是交叉编译器的路必须自己修改。

脚本编译成功后,执行,生成了几个动态库

这里写图片描述

将其烧录到开发板的/bin目录下

然后再移植wpa_supplicant,这里有我们要使用的工具

[tangyanjun@VM_216_80_centos wpa_supplicant]$wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/wpa_supplicant-0.7.3.tar.gz
[tangyanjun@VM_216_80_centos wpa_supplicant]$tar zxvf wpa_supplicant-0.7.3.tar.gz
[tangyanjun@VM_216_80_centos wpa_supplicant]$cd wpa_supplicant-0.7.3/wpa_supplicant
[tangyanjun@VM_216_80_centos wpa_supplicant]$cp defconfig .config

接下来修改.config文件

--- /home/tangyanjun/wpa_supplicant-0.7.3/wpa_supplicant/defconfig  2010-09-07 23:43:39.000000000 +0800
   +++ /home/tangyanjun/WIFI/wifi/wpa_supplicant/wpa_supplicant-0.7.3/wpa_supplicant/.config   2017-05-29 14:31:20.000000000 +0800
   @@ -24,8 +24,9 @@

    #### sveasoft (e.g., for Linksys WRT54G) ######################################
    #CC=mipsel-uclibc-gcc
   -#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
   -#CFLAGS += -Os
   +CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -L/home/tangyanjun/WIFI/wifi/wpa_supplicant/wpa_supplicant-0.7.3/     
    wpa_supplicant
  +  
  +CFLAGS += -I/home/tangyanjun/WIFI/wifi/wpa_supplicant/wpa_supplicant-0.7.3/wpa_supplicant
   #CPPFLAGS += -I../src/include -I../../src/router/openssl/include
   #LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
   ###############################################################################

主要也就是改几个交叉编译器的路径,这样编译之后生成几个文件:

wpa_cli
wpa_passphrase    //生成配置文件
wpa_supplicant     //连接wifi命令

查看命令所依赖的库文件

这里写图片描述

这里很奇怪,开发板上运行的时候提示我还需要libssl.so.0.9.8 和 libcrypto.so.0.9.8。根据他所需求的改名字就可以了。

生成配置文件

我们在开发板的/etc路径下新建一个文件wpa_supplicant.conf来配置我们连接的AP的SSID和key等信息

ctrl_interface=/var/run/wpa_supplicant
#ctrl_interface_group=wheel

network={
        ssid="Router_LingYun_Master"      //接入的WIFI名称
        key_mgmt=WPA-PSK
        proto=WPA2
        group=TKIP CCMP
        pairwise=TKIP CCMP
        psk="lingyun_emb"     //WIFI密码#psk=56466f08ff364ccbbec3266aeda88cb69619a3914834966cc7e90098985d225c
}

启用wpa_supplicant

wpa_supplicant -B -d -Dwext -i wlan0 -c /etc/wpa_supplicant.conf

网络配置

因为没有开启DHCP,即不能自动获取IP,因此要手动分配IP

#配置IP地址
ifconfig wlan0 192.168.0.168      //与路由器地址同网段的IP
#配置默认网关
route add default gw 192.168.0.1    //电脑连接的路由器地址
#配置DNS
echo "nameserver 114.114.114.114" > /etc/resolv.conf    //设置网关,一般默认

这里的C类地址同网段就是指IP的前三个字节相同,最后一位随意,但是不能和路由器一样,也不能超过255。

设置成功后进行网络测试:

>: ping baidu.com
PING baidu.com (220.181.57.217): 56 data bytes
64 bytes from 220.181.57.217: seq=0 ttl=54 time=57.336 ms
64 bytes from 220.181.57.217: seq=1 ttl=54 time=70.318 ms
64 bytes from 220.181.57.217: seq=2 ttl=54 time=70.620 ms
64 bytes from 220.181.57.217: seq=4 ttl=54 time=71.594 ms
64 bytes from 220.181.57.217: seq=5 ttl=54 time=69.678 ms

能ping通百度则说明我们的开发板能联网了

使能DHCP服务

刚才是手动设置IP,现在我们开启DHCP服务来自动获取IP地址

将虚拟机下的busybox的配置文件拷入到开发板中
Linux 下 :/opt/busybox/examples/udhcp/simple.script

在开发板中/usr/share/下创建一个文件夹udhcpc,然后将上面的配置文件拷入。
开发板下:/usr/share/udhcpc/default.script 这里将simple.script改为default.script ,

然后给这个文件执行权限*

chmod 777 default.script

当然,如果没有这个文件或者懒得拷贝,这里有一份:

#!/bin/sh
# udhcpc script edited by Tim Riker <Tim@Rikers.org>

RESOLV_CONF="/etc/resolv.conf"

[ -n "$1" ] || { echo "Error: should be called from udhcpc"; exit 1; }

NETMASK=""
[ -n "$subnet" ] && NETMASK="netmask $subnet"
BROADCAST="broadcast +"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"

case "$1" in
    deconfig)
        echo "Setting IP address 0.0.0.0 on $interface"
        ifconfig $interface 0.0.0.0
        ;;

    renew|bound)
        echo "Setting IP address $ip on $interface"
        ifconfig $interface $ip $NETMASK $BROADCAST

        if [ -n "$router" ] ; then
            echo "Deleting routers"
            while route del default gw 0.0.0.0 dev $interface ; do
                :
            done

            metric=0
            for i in $router ; do
                echo "Adding router $i"
                route add default gw $i dev $interface metric $((metric++))
            done
        fi

        echo "Recreating $RESOLV_CONF"
        echo -n > $RESOLV_CONF-$$
        [ -n "$domain" ] && echo "search $domain" >> $RESOLV_CONF-$$
        for i in $dns ; do
            echo " Adding DNS server $i"
            echo "nameserver $i" >> $RESOLV_CONF-$$
        done
        mv $RESOLV_CONF-$$ $RESOLV_CONF
        ;;
esac

exit 0

现在执行udhcpc -i wlan0,即自动获取ip

如果出现获取不到,那么很有可能是文件权限问题,我们在移植一些文件的时候最好给予权限。因为权限问题耽误时时间很亏。

现在能够上网了,但是不难发现每次启动开发板,都要手动开启我们的WIFI,因此这里有一个脚本,可以实现开机自启动WIFI

#!bin/sh
ifconfig eth0 192.168.1.111 up       //开发板有线IP
ifconfig wlan0 up             //使能WIFI芯片
wpa_supplicant -B -d -Dwext -i wlan0 -c /etc/wpa_supplicant.conf     
ifconfig wlan0 192.168.0.123     //配置固定不变的静态IP
route add default gw 192.168.0.1    //路由器地址

不难发现,这些是我们刚才配置的命令,我们将这个文件置于/etc/init.d/下,即可实现开机自启动,然后我们饿文件名必须以S开头,我们的fl2440开发板是这样,我的文件是:

vim /apps/etc/init.d/S00wifi   //注意给S00wifi可执行权限

配置完成,重启以后我们便可以看见我们的wlan0,已经自动使能并获取到IP:192.168.0.123,执行ping命令也能够通。

那么,既然每次都可以自己连无线网,我们的有线IP也就可以不用了吧?是这样的,我们将所有与电脑连接的线都拔掉,只剩一个开发板和电源,然后根据上次我的网线连接开发板过程,我们也可以无线连开发板,只不过登录的IP换成了我们的wlan0网卡的IP,用户名和密码都是开发板的密码不变,这样,操控开发板特别方便,只要你的wifi芯片耐热。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值