天天看点

wifi模块rt3070的STA模式和AP模式的添加

在此之前首先要开发板的USB驱动,驱动添加:https://mp.csdn.net/mdeditor/89789136#

AP模式: Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。AP和AP之间允许相互连接(路由器模式)

STA模式: Station, 类似于无线终端,STA本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式。

DM9000网卡实现上网和远程登陆:

首先来看一下FL2440自带DM9000有线网卡,首先要在Linux内核添加驱动程序,并在make menuconfig中配置并使能有线网卡,在根文件系统添加dropbear配置,使能远程SSH登录。烧录后将开发板接入路由器,可以看到开发板打印如下信息:

查看路由器ip(网关),我这里是192.168.16.1。

ping通路由器(网关),这里要ping通路由器,必须使路由器和开发板的ip处于同一局域网,修改开发板ip为192.168.16.*(101-254)。我这里的设置为192.168.16.168.

修改开发板ip:

此时能ping通路由器,此时试试ping在此路由器下的其他主机,如果这里ping不同,可能是主机防火墙未关闭,关闭防火墙,即可ping通,(这里通常是开发板ping不通主机,而主机是可以ping通开发板的,因为开发板在这里是没有安装防火墙的)

关闭防火墙,可以ping通:

~ >: ping 192.168.16.110
PING 192.168.16.110 (192.168.16.110): 56 data bytes
64 bytes from 192.168.16.110: seq=0 ttl=128 time=5.000 ms
64 bytes from 192.168.16.110: seq=1 ttl=128 time=0.000 ms
^C
--- 192.168.16.110 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.000/2.500/5.000 ms
``
开发板在DM9000有线网卡接入路由器时,最终是要实现完整的上网功能,ping百度试试。
可能出现如下结果:

```c
Network is unreachable
           

通常情况下,内网主机都能相互通信,而不能访问外网,可能是网关设置出现问题,设置网关:

route add default gw 192.168.16.1  (可用route命令查看网关)
           

此时再ping百度的公网IP或者其域名www.baidu.com:

~ >: ping 14.215.177.39
PING 14.215.177.39 (14.215.177.39): 56 data bytes
64 bytes from 14.215.177.39: seq=0 ttl=48 time=95.000 ms
64 bytes from 14.215.177.39: seq=1 ttl=48 time=100.000 ms
           

成功ping通,此时开发板能够正常访问网络了,当然,如果要提供一些更方便的服务,可以将ip的设置和网关的设置写到相应的配置文件中,同时提供域名解析服务。

此时如果要实现SSH访问该开发板,(前提是路由器拥有公网IP)可以在路由器中添加端口映射,外网访问的端口如2222(>1000)映射到内网的192.168.16.168的22号端口。这时外部访问路由器的2222号端口,就可以映射到该开发板的22号端口(远程登录SSH默认端口)。

RT3070 STA模式设置

前提条件,使能USB驱动,在这些源码包所在路径创建文件夹install,用来存放编译wpa_supplicant的库和头文件,以及后面AP模式编译hostapd的所需库和头文件,。

linux内核对于RT3070的驱动已经比较完善,我们只需稍微对于内核稍加修改就能使用RT3070实现无线上网。这里基于linux3.0内核实现。

添加make menuconfig选项:

[*] 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
           

现在重新编译内核烧录到开发板,启动内核。

插入RT3070无线网卡后内核打印信息,不同配置打印的信息可能不一样。

~ >: usb 1-1.2: new full speed USB device number 3 using s3c2410-ohci
phy0 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.
           

此时ifconfig可以看到无线网卡已经添加。

ifconfig -a
eth0      Link encap:Ethernet  HWaddr 08:00:3E:26:0A:5B  
          inet addr:192.168.2.168  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:34 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3352 (3.2 KiB)  TX bytes:0 (0.0 B)
          Interrupt:51 Base address:0x6300


lo        Link encap:Local Loopback  
          LOOPBACK  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


wlan0     Link encap:Ethernet  HWaddr 00:12:04:23:B0:89  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
           
phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
           

使能网卡:

现在只是添加了网卡驱动,还没有真正的使能网卡,要使能网卡还需要下载RT2870的固件。

在开发板下创建/lib/firmware文件夹,将下载下来的linux-firmware/rt2870.bin拷贝到开发板的firmware文件夹下。

主机上----wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/rt2870.bin
/lib >: mkdir firmware
/lib >: mv rt2870.bin firmware/
           
~ >: ifconfig wlan0 up
phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy0 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.
           

查看已使能网卡信息:

~ >: ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:3E:26:0A:5B  
          inet addr:192.168.2.168  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12600 (12.3 KiB)  TX bytes:981 (981.0 B)
          Interrupt:51 Base address:0x6300


wlan0     Link encap:Ethernet  HWaddr 00:12:04:23:B0:89  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
           

现在已经使能无线网卡,但是要连路由器上网还需要移植无线上网工具:openssl和wpa_supplicant

移植openssl

wget http://www.openssl.org/source/openssl-0.9.8i.tar.gztar -xzf openssl-0.9.8i.tar.gzcd openssl-0.9.8i./config no-asm shared --prefix=`pwd`/../install
           

修改Makefile文件:(这是一个patch文件,照着修改)注意CC是交叉编译器路径

--- openssl-0.9.8i/Makefile    2019-05-25 23:04:09.930783873 +0800
+++ openssl-0.9.8ia/Makefile    2019-05-02 16:57:51.466510704 +0800
@@ -12,9 +12,8 @@
SHLIB_MAJOR=0
SHLIB_MINOR=9.8
SHLIB_EXT=.so.$(SHLIB_MAJOR).$(SHLIB_MINOR)
-PLATFORM=linux-x86_64
-OPTIONS=enable-shared --prefix=/home/zhanghang/gitee/fl2440/driver/openssl-0.9.8i/../install no-asm 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
-CONFIGURE_ARGS=linux-x86_64 no-asm shared --prefix=/home/zhanghang/gitee/fl2440/driver/openssl-0.9.8i/../install
+PLATFORM=dist
+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
SHLIB_TARGET=linux-shared
# HERE indicates where this Makefile lives.  This can be used to indicate
@@ -26,10 +25,10 @@
# for, say, /usr/ and yet have everything installed to /tmp/somedir/usr/.
# Normally it is left empty.
INSTALL_PREFIX=
-INSTALLTOP=/home/zhanghang/gitee/fl2440/driver/openssl-0.9.8i/../install
+INSTALLTOP=/home/zhanghang/gitee/fl2440/driver/install
# Do not edit this manually. Use Configure --openssldir=DIR do change this!
-OPENSSLDIR=/home/zhanghang/gitee/fl2440/driver/openssl-0.9.8i/../install/ssl
+OPENSSLDIR=/home/zhanghang/gitee/fl2440/driver/install
# NO_IDEA - Define to build without the IDEA algorithm
# NO_RC4  - Define to build without the RC4 algorithm
@@ -59,19 +58,19 @@
# equal 4.
# PKCS1_CHECK - pkcs1 tests.
-CC= gcc
-CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DMD32_REG_T=int
+CC=/opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-gcc
+CFLAG= -O
DEPFLAG= -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_CMS -DOPENSSL_NO_GMP -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SEED -DOPENSSL_NO_TLSEXT
PEX_LIBS=
-EX_LIBS= -ldl
+EX_LIBS=
EXE_EXT=
ARFLAGS=
-AR=ar $(ARFLAGS) r
-RANLIB= /usr/bin/ranlib
+AR=/opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-ar $(ARFLAGS) r
+RANLIB=/opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-ranlib
PERL= /usr/bin/perl
TAR= tar
TARFLAGS= --no-recursion
-MAKEDEPPROG= gcc
+MAKEDEPPROG=makedepend
# We let the C compiler driver to take care of .s files. This is done in
# order to be excused from maintaining a separate set of architecture
@@ -140,9 +139,9 @@
LIBS=   libcrypto.a libssl.a
SHARED_CRYPTO=libcrypto$(SHLIB_EXT)
SHARED_SSL=libssl$(SHLIB_EXT)
-SHARED_LIBS=$(SHARED_CRYPTO) $(SHARED_SSL)
-SHARED_LIBS_LINK_EXTS=.so.$(SHLIB_MAJOR) .so
-SHARED_LDFLAGS=-m64
+SHARED_LIBS=
+SHARED_LIBS_LINK_EXTS=
+SHARED_LDFLAGS=
GENERAL=        Makefile
BASENAME=       openssl
@@ -225,7 +224,7 @@
     @[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV)
sub_all: build_all
-build_all: build_libs build_apps build_tests build_tools
+build_all: build_libs build_apps build_tests build_tools  build-shared
build_libs: build_crypto build_ssl build_engines
@@ -241,7 +240,6 @@
     @dir=test; target=all; $(BUILD_ONE_CMD)
build_tools:
     @dir=tools; target=all; $(BUILD_ONE_CMD)
-
all_testapps: build_libs build_testapps
build_testapps:
     @dir=crypto; target=testapps; $(BUILD_ONE_CMD)
           

修改完成后执行make,编译大约1分半钟,将生成的 libssl.so 和 libcrypto.so 拷贝到开发板的/lib目录下 ,

同时make install安装wpa_supplicant编译所需库到install目录下

wifi模块rt3070的STA模式和AP模式的添加

移植wpa_supplicant

wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/wpa_supplicant-0.7.3.tar.gz
tar -xzf wpa_supplicant-0.7.3.tar.gz
cd wpa_supplicant-0.7.3/wpa_supplicant/
cp defconfig .config
           

修改.config

--- wpa_supplicant-0.7.3/wpa_supplicant/.config    2019-05-25 23:22:00.398763905 +0800
+++ .config    2019-05-25 23:23:05.754762686 +0800
@@ -24,7 +24,10 @@
#### sveasoft (e.g., for Linksys WRT54G) ######################################
#CC=mipsel-uclibc-gcc
-#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
+CC=/opt/xtools/arm920t/bin/arm-linux-gcc -L/home/zhanghang/gitee/fl2440/driver/install/lib
+CFLAGS +=-I/home/zhanghang/gitee/fl2440/driver/install/include
+CFLAGS +=-I/home/zhanghang/gitee/fl2440/driver/install/libnl/include
+LIBS += -L/home/zhanghang/gitee/fl2440/driver/install/libnl/lib
#CFLAGS += -Os
#CPPFLAGS += -I../src/include -I../../src/router/openssl/include
#LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
           

这里会用到libnl库,必须先下载libnl库并安装需要的库和头文件到install目录下。

移植libnl库

wget http://www.infradead.org/~tgr/libnl/files/libnl-1.1.tar.gz
tar -xzf libnl-1.1.tar.gz
cd libnl-1.1
./configure -prefix=`pwd`/../install
make CC=/opt/xtools/arm920t/bin/arm-linux-gcc
           

这里可能报错:

../include/netlink-local.h: In function '__str2type':
../include/netlink-local.h:218: error: 'ULONG_MAX' undeclared (first use in this function)
../include/netlink-local.h:218: error: (Each undeclared identifier is reported only once
../include/netlink-local.h:218: error: for each function it appears in.)
../include/netlink-local.h: In function '__list_str2type':
../include/netlink-local.h:239: error: 'ULONG_MAX' undeclared (first use in this function)
../include/netlink-local.h: In function '__dp_dump':
../include/netlink-local.h:277: warning: ignoring return value of 'vasprintf', declared with attribute warn_unused_result
           

解决方法:

在对应文件添加一个头文件 #include<limits.h>即可解决问题

最后make intsall安装到install目录下

接下来编译 wpa_supplicant

此时直接make就行,结果如下:

wifi模块rt3070的STA模式和AP模式的添加

将生成的 wpa_supplicant, wpa_cli, wpa_passphrase三个目标文件移植到开发板的usr/bin下

其中wpa_passphrase 生成配置文件,wpa_supplicant 连接wifi命令

wpa_supplicant前置依赖属于openssl的libcrypto.so和libssl.so

wpa_supplicant.conf配置文件保留着需要连接AP的SSID和key等信息,可以使用wpa_passphrase一键生成

wpa_passphrase theironman 1711318490 >> /etc/wpa_supplicant.conf
其中theironman 是wifi名称,1711318490为密码
           

修改etc/wpa_supplicant.conf如下:

ctrl_interface=/var/run/wpa_supplicant


network={
    ssid="theironman"
    #psk="1711318490"
    key_mgmt=WPA-PSK
    proto=WPA2
    group=TKIP CCMP
    pairwise=TKIP CCMP
    psk=8b3b6f8e89d80cbe9b6bd031dfe3ac41a6346b24eacb2c3f29c2369651b73f85
}
           

接下来在etc/init.d中添加一个启动文件,在开发板启动时,就自动启动wpa_supplicant相关程序并联网。

vim S12_STA
!#/bin/bash
  
ifconfig wlan0 up

#start wpa_supplicant
wpa_supplicant -B -d -Dwext -i wlan0 -c /etc/wpa_supplicant.conf
#set ip
ifconfig wlan0 192.168.16.168
#set gateway
route add default gw 192.168.16.1
           

并给其可执行权限。今后开发板在启动时就会自动连上该局域网。同DM9000,STA模式的rt3070也可以远程登录。

使能DHCP服务

上面只能手动配置ip,现在开启DHCP服务,使其自动获取IP地址busybox已经集成了DHCP的客户端和服务端,源码编译过后的examples/udhcp/simple.script作为DHCP客户端的示例配置文件如下,将其重命名为/usr/share/udhcpc/default.script,特别注意必须给default.script可执行权限。 执行udhcpc -i wlan0之后即可自动获取IP,执行这个命令后udhcp会以守护进程方式在后台运行

rt3070的AP模式设置

实现无线路由器功能。

配置Linux内核:

[*] Networking support  --->
       Networking options  --->
            [*] Network packet filtering framework (Netfilter)  --->
                 [*]   Advanced netfilter configuration
                       Core Netfilter Configuration  --->(除了下面选项外其他全选)
                           < >   SCTP protocol connection tracking support (EXPERIMENTAL)
                           < >   FTP protocol support
                           < >   SIP protocol support
                           < > Transparent proxying support (EXPERIMENTAL)
                           < >   set target and match support
                           < >   CHECKSUM target support
                           < >   "CT" target support
                           < >   "DSCP" and "TOS" target support
                           < >   "NOTRACK" target support
                           < >   "TRACE" target support
                  <*>   IP set support  --->
                       <*>   bitmap:ip set support
                       <*>   bitmap:ip,mac set support
                       <*>   bitmap:port set support
                       <*>   list:set set support
                  <*>   IP virtual server support  --->(除了下面选项外其他全选)
                       [ ]   IP virtual server debugging
                       [ ]   SCTP load balancing support
                       < >   FTP protocol helper
                    IP: Netfilter Configuration  --->(全选)
      <*>   RF switch subsystem support  --->    
           

重新编译Linux内核。

接下来将开发板通过网线连接到已经连入因特网的路由器,然后通过SSH远程登陆软件软件登陆到开发板。注意:必须保证PC和开发板处于同一局域网并且在用以网段内,否则登录不上开发板。

配置无线网络的工具移植

移植Openssl库

**Hostapd依赖于openssl与libnl这两个库。**所以首先要移植openssl与libnl,openssl在前面使能RT3070 STA模式的过程中已经移植了,这里不再重复。

移植libnl库

libnl核心库提供了通过netlink socket连接所需要的基础函数,用于处理socket的链接和断开、数据收发、消息创建分析,提供用户可定制接收状态机,并提供一种抽象的数据类型框架,用于简化netlink 协议对象的实现。 linbl包括四个主要的lib,libnl,libnl-genl,libnl-route,libnl-nf。更多关于libnl和netlink的介绍,大家可以参考这篇博客https://www.tuicool.com/articles/j6f6z2。

在上面的STA模式中,已经编译了libnl库,将install/lib/libnl.so.1拷贝到开发板的/lib下。

移植Hostapd

hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。在linux系统中,使用hostapd可以实现WIFI的无线接入热点(AP)。

wget http://w1.fi/releases/hostapd-1.0.tar.gz
tar -xzf hostapd-1.0.tar.gz
cd hostapd-1.0
cd hostapd/
cp defconfig .config
           

1.修改.config文件

添加:

23 CONFIG_DRIVER_NL80211=y
           

2.修改Makefile文件:

编译该库需要我们编译libnl和openssl时安装在install目录下的库和头文件。

添加如下:

CFLAGS +=-I/home/zhanghang/gitee/fl2440/driver/install/include/
LIBS +=-L/home/zhanghang/gitee/fl2440/driver/install/lib/
LDFLAGS +=-L/home/zhanghang/gitee/fl2440/driver/install/lib/
           

3.编译:

make CC=/opt/xtools/arm920t/bin/arm-linux-gcc
make install//可省略
           
wifi模块rt3070的STA模式和AP模式的添加

将生成的的hostpad文件拷贝到开发板的usr/bin下,并给其可执行权限。 hostapd.conf配置文件是用来设置wifi热点信息的文件,我们可以对hostapd目录下的hostapd.conf文件进行拷贝到开发板然后进行修改。也可以在开发板/etc目录下创建hostapd.conf配置文件

修改或创建hostpad.conf文件修改如下:

interface=wlan0 //网络接口
ssid=zhanghang //设置SSID为zhanghang
driver=nl80211  //使用nl80211无线驱动
channel=3   //设置wifi信道为信道3
hw_mode=g   //使用80211g协议标准 , 有效的值取决于硬件,通常:a, b, g
ignore_broadcast_ssid=0 //禁用广播ssid
auth_algs=1 /*指定OSA认证算法, auth_algs=1 只支持 WPA2 身份验证算法。auth_algs=2 表示支持 WEP。永远不要使用有线等效加密 (wired equivalent privacy, WEP),因为它非常容易破解,并且多年前就已经被完全破解了。auth_algs=3 表示支持这两种方式。*/


wpa=3    /*指定WPA/WPA2类型, wpa=2 仅支持 WPA2。wpa=1 表示支持 WPA1,而 wpa=3 表示二者都支持。*/
wpa_key_mgmt=WPA-PSK    //指定支持的加密密钥算法
wpa_passphrase=12345678 //指定认证密钥
wpa_pairwise=TKIP     /*启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。*/
rsn_pairwise=CCMP     /*wpa_pairwise 和 rsn_pairwise控制支持加密数据的密钥,可以使用 CCMP、TKIP 或两者均使用*/
           

此时启动wlan0服务:

ifconfig wlan0 up

wifi模块rt3070的STA模式和AP模式的添加

启动守护进程

hostapd -B etc/hostapd.conf

wifi模块rt3070的STA模式和AP模式的添加

启动成功会出现上面的打印信息,使用ifconfig命令可以看到多了一个如下的网络接口

现在通过手机或其他终端设备可以搜索到SSID为zhanghang的wifi热点信号,并通过预设的秘钥12345678可以连上热点。然而此时并不能上网,因为还没有分配IP地址。

wifi模块rt3070的STA模式和AP模式的添加

使用ifconfig可以看到多出这个:

wifi模块rt3070的STA模式和AP模式的添加

可能出错:

~ >: hostapd -B etc/hostapd.conf
Configuration file: etc/hostapd.conf
Line 5: unknown hw_mode 'a '
1 errors found in configuration file 'etc/hostapd.conf'
           

删除那行。

配置DHCP

为了使连上热点的中断设备能够自动获取IP,我们需要启用DHCP服务。busybox中已经集成了udhcp,我们可以直接对busybox-1.20.2/examples/udhcp/ 下的配置文件udhcpd.conf进行修改,也可以在开发板上/etc目录下新建一个名为udhcp.conf的配置文件。内容如下:

start 192.168.1.100
end 192.168.1.254 //ip分配的起始和结束地址
interface wlan0 
opt dns 8.8.8.8 
option subnet 255.255.255.0 
opt router 192.168.1.1  //网关
           

然后设置并启动DHCP服务(开发板上操作以下命令)

mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases //创建租赁文件
ifconfig wlan0 192.168.1.1 netmask 255.255.255.0 //设置接入点
echo "nameserver 8.8.8.8" > /etc/resolv.conf  //已经设置DNS就可以不用再设置
udhcpd -f /etc/udhcpd.conf //启动DHCP,此时用手机连上zhanghang『路由器』将打印以下信息
           
wifi模块rt3070的STA模式和AP模式的添加

成功返回数据,说明此时手机已经连接上『zhanghang路由器』并且成功获取到IP。然而此时,依然还不能接入互联网。要使我们的『zhanghang路由器』连上因特网,我们还需要移植iptables。

移植iptables

iptables是功能十分强大的基于linux内核的防火墙,iptables内部集成了filter,nat,mangle三张表。

filter表负责过滤数据包,包括的规则链有,input,output和forward;

Nat表则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;

Mangle表则主要应用在修改数据包内容上,用来做流量整形的。

有关iptables更详细的介绍,可以参见这篇博客 https://www.cnblogs.com/metoy/p/4320813.html。

wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/iptables-1.4.12.tar.bz2
tar -xjf iptables-1.4.12.tar.bz2
cd iptables-1.4.12
./configure --host=arm-linux --enable-static --disable-shared --disable-ipv6 --disable-largefile --prefix=`pwd`/../install/lib_s
make CC=/opt/xtools/arm920t/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static     
           

可能出错:

解决:在出错文件出错行之前添加

#ifdef __aligned_u64
#undef __aligned_u64
#endif
#define __aligned_u64 unsigned long long __attribute__((__aligned(64)))
           
make install
           

将install/lib_s/lib下的所有文件拷贝到开发板的lib下

将install/lib_s/sbin下的xtables-multi拷贝到开发板的bin下并重命名为iptables,给其可执行权限。

确保开发板连接的路由器能够上网,即开发板的eth0网卡连入互联网。

在开发板上对iptables如下配置

/*所有去往internet的流量进行地址伪装,即将源地址改为eth0*/
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/*对内转发,数据包从eth0流向wlan0*/
>: iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
/*对外转发,数据包从wlan0流向eth0*/
>: iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
/*开启内核转发功能*/
>>:echo "1" >/proc/sys/net/ipv4/ip_forward
/*设置好默认网关 */
>: route add default gw 192.168.16.1//该网关是路由器网关
/*启动 dhcp服务*/
>: udhcpd -f udhcpd.conf
           

最后再来总结一下:

对于DM9000有线网卡,Linux3.0内核已经有其对应的驱动程序,对内核做稍微的修改就可以使能网卡,这里我就不多说了。只要保持和接入的路由器处于同一网络,网关设置正确就可以正常上网。对于同一路由器下的其他主机,如果不能ping通,很大的可能是主机的防火墙没有关闭,关闭防火墙一般就可以通信了。还有对某个网址ping,如果不通,很大的可能是没有使能DNS服务,对于工作在应用层的协议,通常在文件系统中添加相应的配置即可通过域名访问目标网络,而不需要修改Linux内核。

对于无线网卡rt3070,首先要有USB驱动才能使能网卡。

STA模式,简单的来说,就是通过wifi无线上网。修改linux内核提供rt3070的驱动和使能某些功能,此时网卡插上后,ifconfig查看已经拥有的网卡,可以看到wlan0即无线网卡,接下来要是能网卡,需要添加rt2870.bin的固件到开发板的lib/firmware下,此时使用ifconfig wlan0 up使能无线网卡,现在想要连接路由器上网,还需要无线上网的工具wpa_supplicant,主要是wpa_supplicant, wpa_cli, wpa_passphrase这三个工具,该工具的制作和使用会涉及到另外两个库openssl和libnl,在wpa_supplicant工具使用时,会使用到openssl库编译后的的两个动态库libssl.so 和 libcrypto.so,主要用于对无线上网的安全保证,而wpa_suppllicant库编译生成三个工具,则需要libnl库和openssl库编译生成的相应库和头文件的支持。最后就是使用wpa_supplicant的工具实现无线上网,此时还需要制作一个配置文件,对上网的路由器的信息进行配置,使用wpa_suppllicant命令连接路由器,实现上网,当然如不想手动配置无线ip,可以添加启动文件和dhcp服务。

相关参考:

wpa_supplicant: http://blog.chinaunix.net/uid-29181887-id-4826168.html

http://velep.com/archives/830.html

AP模式,简单来说就是路由器功能,此功能要求路由器拥有有线网卡(DM9000)作为WAN口,连接上一级路由器获取网络,和无线网卡rt3070作为LAN口,实现无线网络功能。对于无线路由功能,也要配置内核提供相关配置和驱动。然后就是hostapd服务的添加,编译hostapd库需要openssl库和libnl库编译后的头文件和库的支持,编译生成的hostapd工具就是我们的目标工具,改工具还需要libnl库的libnl.so.1动态库支持(移植到开发板的lib下),将hostapd移植到开发板的usr/bin下或者bin下,同时设置hostapd配置文件配置wifi的相关信息,使能无线网卡启动hostapd服务,我们就可以收到相应的我们在hostapd配置文件中设置的WIFI信息。此时没有ip分配和防火墙,是无法上网的。配置DHCP动态分配IP,建立udhcp配置文件,配置无线网卡WAN口ip(wlan0 ip),命令udhcp启动配置文件来启动DHCP服务,此时连接rt3070建立的路由器,会有分配ip信息但不能上网。最后移植防火墙,拷贝iptables库编译后的lib库下所有库文件和lib/sbin下的xtables-multi工具到开发板的lib和bin下,修改xtables-multi名为iptables,进行一些配置,实现防火墙的建立,此时再hostapd启动WIFI服务,可以正常连接到WIFI并上网。

对于同一局域网的SSH的登录,只需要在路由器配置端口转发,而对于不同局域网的SSH登录,需要有公网IP和端口转发。对于拥有公网ip的每一级路由器下,都需要进行下一级的路由器的端口转发。