java实现wife链接硬件_S3C2440实现wifi、3G上网和迷你无线路由的制作(一)

本文详细介绍了如何在基于S3C2440的Linux系统中,通过RT2070/3070无线模块实现无线上网和迷你无线路由器的制作。内容包括配置Linux内核以支持RT2070驱动,加载系统固件,以及使用iwconfig和ifconfig等工具进行网络设置。此外,还涉及到了wpa_supplicant的配置与连接过程。
摘要由CSDN通过智能技术生成

S3C2440实现wifi、3G上网和迷你无线路由的制作

fulinux 凌云实验室

本文将通过ARM、linux平台,借助RT2070/RT3070芯片的无线模块(或使用RT2070/RT3070芯片的USB无线上网卡)、3G无线上网卡,实现无线上网、通过ADSL和3G的迷你无线路由器的制作。

wifi上网

首先是利用s3c2440开发板和RT2070/RT3070芯片的无线模块实现无线上网的功能,即让无线模块工作在STA模式,所谓的STA在WLAN中一般为客户端,可以是装有无线网卡的计算机,也可以是有WiFi模块的智能手机。STA可以是移动的,也可以是固定的,是无线局域网的最基本组成单元。

这里假定已经成功移植了linux-3.0内核和可读写的文件系统,例如ubifs、yaffs和jffs2文件系统,这里使用jffs2。下图是已经运行好的系统在secure CRT上的显示的结果:

~ >: ls

apps     data     home     lib      media    proc     stat     usr

backup   dev      info     linuxrc  mnt      root     sys      var

bin      etc      init     logs     opt      sbin     tmp

~ >:

这里使用一个集成RT2070芯片的USB无线网卡(或其他无线模块,注明一点就是3070和2070的模块是完全兼容的,下面我们只以RT2070模块作介绍),是下面是要用到的实物图:

503be6d7fa5166a5c6212b2f1e56f63f.png

(上图中的一些次要部件没有列出来,需要的部分会提到)

先测试USB无线模块是否正常,我把它插在电脑上并且连接在普通无线路由器上,显示如下所示,则说明正常。

15f986edbd4bd1d0a6057461fc89a138.png

之后拔出,因为我的电脑用有线。

内核配置

从Linux-3.0开始,RT2070/3070的STA驱动已经作为正式版本加入了Linux内核源码中了(从Linux-2.6.32开始以实验版本加入Linux内核中)。本篇文章主要介绍如何在内核中编译支持RT2070的STA模式驱动,并连接到我的无线路由器上去。

1, 配置Linux-3.0内核支持RT2070,我们以Build-in的方式将RT2070的驱动集成到内核里去,一下是一些需要的选项,其他配置可以自己试试:

[*] Networking support  --->

-*-   Wireless  --->

   cfg80211 - wireless configuration API

[ ]     nl80211 testmode command

[ ]     enable developer warnings

[ ]     cfg80211 regulatory debugging

[*]     enable powersave by default

[ ]     use statically compiled regulatory rules database

[ ]     cfg80211 wireless extensions compatibility

   Common routines for IEEE802.11 drivers

[ ]   lib80211 debugging messages

   Generic IEEE 802.11 Networking Stack (mac80211)

[ ]   PID controller based rate control algorithm

[*]   Minstrel

[*]     Minstrel 802.11n support

Default rate control algorithm (Minstrel)  --->

[ ]   Enable mac80211 mesh networking (pre-802.11s) support

[ ]   Select mac80211 debugging features  --->

Device Drivers  --->

Generic Driver Options  --->

(/sbin/hotplug) path to uevent helper

[ ] Maintain a devtmpfs filesystem to mount at /dev

[ ] Select only drivers that don't need compile-time external firmware

[ ] Prevent firmware from being built

-*- Userspace firmware loading support

[*]   Include in-kernel firmware blobs in kernel binary

()    External firmware blobs to build into the kernel binary

[*] Network device support  --->

[*]   Wireless LAN  --->

   Ralink driver support  --->

--- Ralink driver support

   Ralink rt2500 (USB) support

   Ralink rt2501/rt73 (USB) support

   Ralink rt27xx/rt28xx/rt30xx (USB) support

[ ]    rt2800usb - Include support for rt33xx devices

[ ]    rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)

[ ]    rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)

[ ]    rt2800usb - Include support for unknown (USB) devices

[*]   Ralink debug output

注明:

a、cfg80211:

cfg80211 is the Linux 802.11 configuration API. cfg80211 replaces Wireless-Extensions.nl80211is used to configure a cfg80211 device and is used for kernel  userspace communication. Wireless extensions is now in maintenance mode, no new features will be added to it, we'll only fix bugs for it. cfg80211 is now feature-par complete with wireless-extensions, it actually has a lot more features that are simply not available and will never be available through wireless extensions. When implementing a cfg80211 driver wireless extensions support is still provided automatically for you through cfg80211 through CONFIG_CFG80211_WEXT. Distributions no longer needing wireless extensions can remove this and are encouraged to do so. cfg80211 also provides fullregulatorysupport, this is done throughwireless-regdband the usage ofCRDA.

All new Linux wireless drivers should be written targeting either cfg80211 for fullmac devices or mac80211 for softmac devices.

b、Minstrel:

minstrel is a mac80211 rate control algorithm ported over fromMadWifiwhich supports multiple rate retries and claimed to be one of the best, if not the best, rate control algorithm.

c、hotplug

这里是支持热插拔。

d、Firmware

固件的目的是初始化,()    External firmware blobs to build into the kernel binary这一选项可以加入固件路径。

e、[*]   Ralink debug output

这个选项选了后容易出现下面的警告。

cfg80211: Calling CRDA to update world regulatory domain

2、插入RT2070无线网卡并加载新内核启动

………..

RAMDISK: gzip image found at block 0

usb 1-1: new full speed USB device number 2 using at91_ohci

hub 1-1:1.0: USB hub found

hub 1-1:1.0: 4 ports detected

usb 1-1.3: new full speed USB device number 3 using at91_ohci

phy0 -> rt2x00_set_chip: Info - Chipset detected - rt:2070, rf: 0006, rev: 0201.

ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'

EXT2-fs (ram0): warning: mounting unchecked fs, running e2fsck is recommended

VFS: Mounted root (ext2 filesystem) on device 1:0.

Freeing init memory: 128K

使用lsusb命令查看:

~ >: lsusb

Bus 001 Device 001: ID 1d6b:0001

Bus 001 Device 002: ID 05e3:0606

Bus 001 Device 003: ID 148f:2070

~ >:

如果是热插拔的话会,在插入的那一刻,串口会打印如下信息:

~ >: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci

usb 1-1.1: New USB device found, idVendor=148f, idProduct=2070

usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3

usb 1-1.1: Product: 802.11 g WLAN

usb 1-1.1: Manufacturer: Ralink

usb 1-1.1: SerialNumber: 1.0

ifconfig是查看网卡的信息。

ifconfig [Interface]

Interface是可选项,如果不加此项,则显示系统中所有网卡的信息。如果添加此选项则显示所指定的网卡信息,例如:

~ >: ifconfig wlan0

wlan0     Link encap:Ethernet  HWaddr C8:3A:35:C6:A2:B5

inet addr:192.168.5.1  Bcast:192.168.5.255  Mask:255.255.255.0

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)

我们可以看到

第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)

第二行:网卡的IP地址、子网、掩码

第三行:MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节

第四、五行:接收、发送数据包情况统计

第七行:接收、发送数据字节数统计信息。

~ >: ifconfig wlan0 up

phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.

phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.

ifconfig: SIOCSIFFLAGS: No such file or directory

这时我们在使用RT2070的驱动时发现,RT2070的驱动还需要rt2870.bin这个系统固件(firmware)。

1,Linux内核官方站点下载rt2870.bin这个系统固件

I. PC上下载rt2870.bin这个系统固件:

[guowenxue@centos6 ~]$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git

[guowenxue@centos6 ~]$ ls -l linux-firmware/rt2870.bin

-rw-rw-r-- 1 guowenxue guowenxue 8192 Dec 23 09:37 linux-firmware/rt2870.bin

II. 在AT91SAM9260开发板上将rt2870.bin下载到/lib/firmware路径下,这时能重启网卡:

/lib >: mkdir -p  /lib/firmware

/lib >: cd firmware/

/lib/firmware >: tget rt2870.bin

rt2870.bin           100% |*******************************|  8192   0:00:00 ETA

/lib/firmware >: ls

rt2870.bin

iwconfig命令来自下面交叉编译的wireless_tools程序

~ >: iwconfig wlan0

wlan0     IEEE 802.11bg  ESSID:off/any

Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm

Retry  long limit:7   RTS thr:off   Fragment thr:off

Encryption key:off

Power Management:on

~ >: ifconfig wlan0 up

phy1 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.

phy1 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.

phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.

phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.

phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.

phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.

2,下载/交叉编译wireless_tools的shell脚本,这些工具包括iwconfig, iwlist, iwpriv等:

[guowenxue@centos6 wireless]$ ls

openssl  wireless_tools  wpa_supplicant

[guowenxue@centos6 wireless]$ cd wireless_tools/

[guowenxue@centos6 wireless_tools]$ ls

build.sh

[guowenxue@centos6 wireless_tools]$ cat build.sh

#!/bin/sh

#+--------------------------------------------------------------------------------------------

#|Description:  This shell script used to download tree wireless_tools code and cross compile it.

#|     Author:  GuoWenxue 

#|  ChangeLog:

#|           1, Initialize 1.0.0 on 2011.11.23

#+--------------------------------------------------------------------------------------------

PRJ_PATH=`pwd`

APP_NAME="wireless_tools.29"

PACK_SUFIX="tar.gz"

DL_ADDR="http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/$APP_NAME.$PACK_SUFIX"

INST_PATH=${PRJ_PATH}/../mnt/usr/sbin/

ARCH=arm926t

CROSS=

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-2011.11/${ARCH}/usr/bin/arm-linux-"

fi

# 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

echo "+------------------------------------------------------------------+"

echo "|          Build $APP_NAME for $ARCH "

echo "| Crosstool:  $CROSS"

echo "+------------------------------------------------------------------+"

cd $APP_NAME

FILE=Makefile

line=`sed -n '/^CC =/=' $FILE`

sed -n "$line p" $FILE | grep "$CROSS"

if [ 0 != $? ] ; then

sed -i -e ${line}s"|.*|CC = ${CROSS}gcc|" $FILE

line=`sed -n '/^AR =/=' $FILE`

sed -i -e ${line}s"|.*|AR = ${CROSS}ar|" $FILE

line=`sed -n '/^RANLIB =/=' $FILE`

sed -i -e ${line}s"|.*|RANLIB = ${CROSS}ranlib|" $FILE

line=`sed -n '/BUILD_STATIC =/=' $FILE`

sed -i -e ${line}s"|.*|BUILD_STATIC = y|" $FILE

fi

make clean

make

cd -

[guowenxue@centos6 wireless_tools]$ sh build.sh

[guowenxue@centos6 wireless_tools]$ ls wireless_tools.29/

***iwlist***iwspy***iwgetid***iwconfig***

***ifrename***iwpriv***iwevent***

/****************************转载声明**********************************/

3,由于wpa_supplicant依赖openssl库,所以这里我们得先交叉编译openssl,在交叉编译之前,我们得把wpa_supplicant-0.7.3.tar.gz源码中的openssl的补丁给打了,参见下面的编译脚本:

[guowenxue@centos6 wireless]$ cd openssl/

[guowenxue@centos6 openssl]$ ls

build.sh

[guowenxue@centos6 openssl]$ cat build.sh

#!/bin/sh

#+--------------------------------------------------------------------------------------------

#|Description:  This shell script used to download tree wireless_tools code and cross compile it.

#|     Author:  GuoWenxue 

#|  ChangeLog:

#|           1, Initialize 1.0.0 on 2011.11.23

#+--------------------------------------------------------------------------------------------

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=arm926t

CROSS=

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-2011.11/${ARCH}/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

#该补丁来自wpa_supplicant源码

patch -p1 

#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 –

[guowenxue@centos6 openssl]$ sh build.sh

[guowenxue@centos6 openssl]$ ls

build.sh  install  openssl-0.9.8i  openssl-0.9.8i.tar.gz  patch

[guowenxue@centos6 openssl]$ ls install/

bin  certs  include  lib  man  misc  openssl.cnf  private

4,下载交叉编译wpa_supplicant的脚本

[guowenxue@centos6 wireless]$ cd wpa_supplicant/

[guowenxue@centos6 wpa_supplicant]$ ls

build.sh

[guowenxue@centos6 openssl]$ cat build.sh

#!/bin/sh

#+--------------------------------------------------------------------------------------------

#|Description:  This shell script used to download tree wireless_tools code and cross compile it.

#|     Author:  GuoWenxue 

#|  ChangeLog:

#|           1, Initialize 1.0.0 on 2011.11.23

#+--------------------------------------------------------------------------------------------

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=arm926t

CROSS=

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-2011.11/${ARCH}/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 

#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 –

[guowenxue@centos6 wpa_supplicant]$ ls

build.sh  wpa_supplicant-0.7.3  wpa_supplicant-0.7.3.tar.gz

[guowenxue@centos6 wpa_supplicant]$ ls wpa_supplicant-0.7.3/wpa_supplicant/

***wpa_supplicant***wpa_cli***wpa_passphrase

5,安装上面交叉编译出来的一些二进制可执行文件到ARM开发板上:

~ >: ls /apps/tools/

iwlist          wpa_passphraseiwpriv

wpa_supplicantiwconfig

使用wpa_passphrase创建wpa_supplicant的配置文件,使用加密后的密码,不用明文。当然使用明文密码也可以连接到无线路由器:

~ >: wpa_passphrase Router_Kernel password >> wpa_supplicant.conf

~ >: cat wpa_supplicant.conf

network={

ssid="Router_Kernel"

#psk="password"

psk=81a8c46543f339bbcd0381b4d7a13673d4e02f67108d978fb545435a15d95ea5

}

修改后的配置文件如下:

~ >: cat /apps/etc/wireless/wpa_supplicant.conf

# WPA-PSK/TKIP

# wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant

network={

ssid="Router_Kernel"

key_mgmt=WPA-PSK

proto=WPA

pairwise=TKIP

group=TKIP

#psk="password"这里使用明文密码也可以

psk=81a8c46543f339bbcd0381b4d7a13673d4e02f67108d978fb545435a15d95ea5

}

运行wpa_supplicant来连接无线路由器

~ >: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &

Trying to associate with d8:5d:4c:18:04:7a (SSID='Router_Kernel' freq=2437 MHz)

phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.

phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 94.

phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 4, CWmax: 10, Aifs: 3, TXop: 0.

phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.

Associated with d8:5d:4c:18:04:7a

WPA: Key negotiation completed with d8:5d:4c:18:04:7a [PTK=TKIP GTK=TKIP]

CTRL-EVENT-CONNECTED - Connection to d8:5d:4c:18:04:7a completed (auth) [id=0 id_str=]

WPA: Group rekeying completed with d8:5d:4c:18:04:7a [GTK=TKIP]

~ >: iwconfig

lo        no wireless extensions.

eth0      no wireless extensions.

eth1      no wireless extensions.

wlan0     IEEE 802.11bg  ESSID:"Router_Kernel"

Mode:Managed  Frequency:2.437 GHz  Access Point: D8:5D:4C:18:04:7A

Bit Rate=1 Mb/s   Tx-Power=20 dBm

Retry  long limit:7   RTS thr:off   Fragment thr:off

Encryption key:off

Power Management:on

Link Quality=69/70  Signal level=-41 dBm

Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0

Tx excessive retries:0  Invalid misc:49   Missed beacon:0

~ >: udhcpc -i wlan0

udhcpc (v1.19.3) started

Sending discover...

Sending select for 192.168.1.100...

Lease of 192.168.1.100 obtained, lease time 7200

deleting routers

route: SIOCDELRT: No such process

adding dns 4.2.2.2

adding dns 8.8.8.8

~ >: ifconfig wlan0

wlan0     Link encap:Ethernet  HWaddr 00:E0:4C:D4:04:76

inet addr:192.168.1.100  Bcast:255.255.255.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:575 errors:0 dropped:0 overruns:0 frame:0

TX packets:7 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:26672 (26.0 KiB)  TX bytes:1300 (1.2 KiB)

~ >: ifconfig eth1 down

~ >: ifconfig eth0 down

~ >: ifconfig

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

UP LOOPBACK RUNNING  MTU:16436  Metric:1

RX packets:6 errors:0 dropped:0 overruns:0 frame:0

TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:510 (510.0 B)  TX bytes:510 (510.0 B)

wlan0     Link encap:Ethernet  HWaddr 00:E0:4C:D4:04:76

inet addr:192.168.1.100  Bcast:255.255.255.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:5521 errors:0 dropped:0 overruns:0 frame:0

TX packets:46 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:244469 (238.7 KiB)  TX bytes:5454 (5.3 KiB)

~ >: ping 192.168.1.2

PING 192.168.1.2 (192.168.1.2): 56 data bytes

64 bytes from 192.168.1.2: seq=0 ttl=64 time=11.123 ms

64 bytes from 192.168.1.2: seq=1 ttl=64 time=3.467 ms

^C

--- 192.168.1.2 ping statistics ---

3 packets transmitted, 2 packets received, 33% packet loss

round-trip min/avg/max = 3.467/7.295/11.123 ms

参考:

wpa_supplicant的编译,使用参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
response); } else { User user = new User(); user.setUsername(username); user.setPassword(MD5Util.md5(password)); userDao.insert(user); response.sendRedirect(request.getContextPath() + "/login.jsp"); } } catch (SQLException e) { 好的,针对您的需求,我可以提供一个简单的Java程序来实现一个基于交互的 e.printStackTrace(); } } } ``` 7. 实现留言的Servlet 我们可以使用`MessageServlet`来亲戚称呼系统。具体实现过程如下: 1. 首先,您需要定义一个包含亲戚称实现留言功能。 ```java package com.example.servlet; import com.example.bean.Message; import com.example.bean.User; import com呼关系的数据结构。在这个例子中,我会使用一个HashMap来存储亲戚关系,其中.example.dao.MessageDao; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; key代表称呼关系,value代表对应的称呼。例如: ```java HashMap<String, String> relationship =import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.sql.SQLException; import java.util.List; @WebServlet new HashMap<>(); relationship.put("father", "父亲"); relationship.put("mother", "母亲"); relationship.put("brother", "兄("/message") public class MessageServlet extends HttpServlet { private MessageDao messageDao; public void init() { messageDao = new弟"); relationship.put("sister", "姐妹"); relationship.put("grandfather", "祖父"); relationship.put("grandmother", " MessageDao(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); if (user == null) { response.sendRedirect(request.getContextPath() + "/祖母"); relationship.put("son", "儿子"); relationship.put("daughter", "女儿"); relationship.put("husband", "丈login.jsp"); return; } try { List<Message> list = messageDao.findAll(); request.setAttribute("list", list夫"); relationship.put("wife", "妻子"); ``` 2. 接下来,我们需要编写一个方法来处理用户输入); request.getRequestDispatcher("/message.jsp").forward(request, response); } catch (SQLException e) { e.printStackTrace(); } 的关系并返回对应的称呼。我们可以使用Java的正则表达式来处理用户输入的字符串,从 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); User user = (而得到对应的称呼关系。例如: ```java public static String getRelationship(String input) { Pattern p =User) session.getAttribute("user"); if (user == null) { response.sendRedirect(request.getContextPath() + "/login.jsp"); return; } String content = request.getParameter("content"); Message message = new Message(); message.setUserId(user.getId()); Pattern.compile("(父|母|兄|姐|弟|妹|祖父|祖母|儿|女|夫|妻)"); message.setUsername(user.getUsername()); message.setContent(content); try { messageDao.insert(message); response.sendRedirect(request.getContextPath() + "/ Matcher m = p.matcher(input); if (m.find()) { String key = ""; switch (m.group()) { casemessage"); } catch (SQLException e) { e.printStackTrace(); } } } ``` 以上就是一个简单的 "父": key = "father"; break; case "母": key = "mother"; break; caseJSP+Servlet+JDBC实现的留言板的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值