转载地址:http://blog.csdn.net/eastmoon502136/article/details/7850157
一天又过去了,台风也走了有些时候了。想了想,自己还是冲动了一把,不该发那个邮件的,既然发了,也不后悔了。知道了所有也未必不是一件好事。恩,剩下的就好好做自己要做的事情吧。对于usb wifi,老早就在调试了,只是碰到了很多问题,加上其他的事情也迎面而来,从而导致很多的困难,也就搁置着了。上上周,工作计划一周内要搞定,郁闷着了,这个涉及到的太多太多了,不好移植啊。只能加班了,天天看代码了。在移植完bluetooth后,马上开始wifi的移植。终于,功夫不负有心人,前天晚上解决了可恶的权限问题导致不能socket通信。可以连上路由器,但是分配IP地址还是要命令的。还有就是nfs挂载的时候,网络貌似只是通过本地连接的,而不是从wifi来的,所以只能ping通路由和本地的连接,至于外网,要用SD卡启动才可以连接。下面对于整个移植过程做下简单的记录。
首先那肯定是要在linux kernel下选上相应的选项了,在此之前要有wifi的驱动。
在Networking support下选上
上面主要是选上相关的通信的协议,802.11啊什么的。
然后wifi的设备也要选上
选上自己的wifi设备驱动,我是选择编译进内核的,不是编译成模块的,而按照android源码中可以知道,其实是要编译成模块,不断去加载什么的。不过编译进内核后,修改下android下的源码也是可以解决问题的。
好了,准备好了linux kernel后,那么基本上如果跑linux的话,用wireless-tools这个工具就可以测试了
- ./iwlist wlan0 scanning
- ./iwconfig wlan0 mode managed
- ./iwconfig wlan0 essid “你要连接的路由”
- ./ifconfig wlan0 要为wifi设置的静态IP netmask 255.255.255.0 up
然后就可以ping通你的路由了,如果成功了,那么说明wifi的驱动没多大的问题,接着就可以上android去调试了。
现在想想,其实android的wifi适配其实也算简单的,只是对于网络不是很懂,所以才觉得有难度。先讲讲android中wifi的一些代码主要的目录吧。
1、 wpa_supplicant: 这个最最纠结了,主要也就是这个东东了,这个好了,那基本上就没什么问题了。Wpa就是应
用层认证客户端,负责完成认证相关登陆,加密等工作。
external/wpa_supplicant_8/下,通过mm后可以生成动态库libwpa_client.so和可执行的程序wpa_supplicant和wpa_cli
2、 wpa_supplicant适配层:封装与wpa_supplicant守护进程的通信,以提供给android框架使用,实现加载,控制和消
息监控等功能。
hardware/libhardware_legacy/wifi/下,而我用的是厂家提供的,所以是修改过的,其实都一样的。
3、 wifi的JNI: frameworks//base/core/jni/android_net_wifi_wifi.cpp
wifi的服务层: frameworks/base/services/java/com/android/server/WifiService.java
wifi的部分接口:frameworks/base/wifi/java/android/net/wifi
对于android层,本人没有做任何修改,上层基本上是好的,只要wpa_supplicant和底层通信好了,那么整个适配就没什么问题了。
接下来就开始真正的移植吧。
主要是android有那个什么破权限,搞得我很是郁闷。其实还是自己经验不足啊,刚刚毕业也在所难免啊。先改下权限吧,在init.rc里
- mkdir /data/misc/wifi 0777 wifi wifi
- chmod 0777 /data/misc/wifi/wpa_supplicant.conf
- mkdir /wlan0 0777 wifi wifi
因为编译进内核的,所以加上下面两句
- #prepare for wifi
- setprop wifi.interface “wlan0”
- setprop wlan.driver.status “ok”
在init.xxx.rc中添加下面的
- mkdir /data/misc/wifi/sockets 0777 wifi wifi
- mkdir /data/misc/dhcp 0777 dhcp dhcp
- chmod 0777 /dev/rfkill
又和蓝牙一样,有一个rfkill,所以得给他修改下权限。
- service wpa_supplicant /system/bin/wpa_supplicant –dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf
- class main
- #socket wpa_wpa_wlan0 dgram 0777 wifi wifi
- group system inet
- disabled
- oneshot
- service dhcpcd_wlan0 /system/bin/dhcpcd –d –B wlan0
- class main
- disabled
- oneshot
好了,主要修改这些,基本上没有什么提示权限问题了。接着要把那个
wpa_supplicant.conf加进去,里面的内容一般可以如下:
- ctrl_interface=wlan0
- update_config=1
- ap_scan=1
- fast_reauth=1
接着在修改下wifi.c中的代码
- static const char IFACE_DIR[] = "/data/system/wpa_supplicant";
这个修改为
- static const char IFACE_DIR[] = "/wlan0";
- static int insmod(const char *filename, const char *args)
这个函数第一行就return 0。因为编译进内核,没有模块。
- static int rmmod(const char *modname)
这个函数同上。
恩,基本上搞定了,还有就是要在相应的平台下把wifi的相关宏定义给选上。举个例子,比如说你的平台是samsung的Tuna平台,那么在device/Samsung/Tuna/BoardConfig.mk中有几个宏必须选上
- BOARD_WIFI_VENDOR :=realtek
- WPA_SUPPLICANT_VERSION := VER_0_8_X
- BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_drivercmd_wext
- BOARD_WLAN_DEVICE := rtl8192cu
好了,然后就到相应的目录下去编译生成相关的.so和可执行应用程序吧
Hardware/libhardware_legacy/下mm后得到了libhardware_legacy.so
然后再到
external/wpa_supplicant_8/下mm后得到了wpa_cli, wpa_supplicant和libwpa_client.so
好了,接着可以启动了,在此,还是先用命令行,上面的那两个服务先注释掉,然后开始去启动。
启动后,首先就是查看下底层驱动有没有运行,主要就是cat /proc/net/dev有wlan0的话,那么就说明ok了。接着就是要连接上wpa_supplicant了
- wpa_supplicant –dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf &
让他后台运行着就好了。
就这就
- wpa_cli –iwlan0 –p/wlan0
然后再
Scan (搜索网络)
接着scan_res(显示搜索结果,如果可以搜到网络的话,那么几乎就可以说是成功了)
接着就
- add_net
- set_net 0 ssid “相应搜到的网络”
- set_net 0 key_mgmt NONE
- set_net 0 priority 0
- list_net
- save_config
- enable_net 0
这样就可以启动了,然后再
- dhcpcd wlan0
分配一个ip地址,接着去ping路由,就可以ping的通了,那么一直基本上告一段落。
不过这个是命令行的,得让他在UI界面出来,于是还是启动服务吧,可是一直wpa_supplicant的时候就不成功,老是有问题。跟进代码,当上层开关打开后就会调用到下面这个函数去连接wpa_supplicant
- /hardware/libhardware_legacy/wifi.c
- int wifi_connect_to_supplicant()
- {
- char ifname[256];
- char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
- /* Make sure supplicant is running */
- if (!property_get(SUPP_PROP_NAME, supp_status, NULL)
- || strcmp(supp_status, "running") != 0) {
- LOGE("Supplicant not running, cannot connect");
- return -1;
- }
- if (access(IFACE_DIR, F_OK) == 0) {
- snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);
- } else {
- strlcpy(ifname, iface, sizeof(ifname));
- }
- ctrl_conn = wpa_ctrl_open(ifname);
- if (ctrl_conn == NULL) {
- LOGE("Unable to open connection to supplicant on \"%s\": %s",
- ifname, strerror(errno));
- return -1;
- }
- monitor_conn = wpa_ctrl_open(ifname);
- if (monitor_conn == NULL) {
- wpa_ctrl_close(ctrl_conn);
- ctrl_conn = NULL;
- return -1;
- }
- if (wpa_ctrl_attach(monitor_conn) != 0) {
- wpa_ctrl_close(monitor_conn);
- wpa_ctrl_close(ctrl_conn);
- ctrl_conn = monitor_conn = NULL;
- return -1;
- }
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, exit_sockets) == -1) {
- wpa_ctrl_close(monitor_conn);
- wpa_ctrl_close(ctrl_conn);
- ctrl_conn = monitor_conn = NULL;
- return -1;
- }
- return 0;
- }
这里的ifname=/wlan0/wlan0,这样,两个接口ctrl_conn,monitor_conn都可以正常打开,可是到了wpa_ctrl_attach(monitor_conn)的时候就一直不可以,而用命令行的时候都是可以的
继续跟进代码
- external/wpa_supplicant_8/src/common/wpa_ctrl.c
- #ifdef CTRL_IFACE_SOCKET
- int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
- char *reply, size_t *reply_len,
- void (*msg_cb)(char *msg, size_t len))
- {
- struct timeval tv;
- int res;
- fd_set rfds;
- const char *_cmd;
- char *cmd_buf = NULL;
- size_t _cmd_len;
- #ifdef CONFIG_CTRL_IFACE_UDP
- if (ctrl->cookie) {
- char *pos;
- _cmd_len = os_strlen(ctrl->cookie) + 1 + cmd_len;
- cmd_buf = os_malloc(_cmd_len);
- if (cmd_buf == NULL)
- return -1;
- _cmd = cmd_buf;
- pos = cmd_buf;
- os_strlcpy(pos, ctrl->cookie, _cmd_len);
- pos += os_strlen(ctrl->cookie);
- *pos++ = ' ';
- os_memcpy(pos, cmd, cmd_len);
- } else
- #endif /* CONFIG_CTRL_IFACE_UDP */
- {
- _cmd = cmd;
- _cmd_len = cmd_len;
- }
- if (send(ctrl->s, _cmd, _cmd_len, 0) < 0) {
- os_free(cmd_buf);
- return -1;
- }
- os_free(cmd_buf);
- for (;;) {
- tv.tv_sec = 10;
- tv.tv_usec = 0;
- FD_ZERO(&rfds);
- FD_SET(ctrl->s, &rfds);
- res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
- if (res < 0)
- return res;
- if (FD_ISSET(ctrl->s, &rfds)) {
- res = recv(ctrl->s, reply, *reply_len, 0);
- if (res < 0)
- return res;
- if (res > 0 && reply[0] == '<') {
- /* This is an unsolicited message from
- * wpa_supplicant, not the reply to the
- * request. Use msg_cb to report this to the
- * caller. */
- if (msg_cb) {
- /* Make sure the message is nul
- * terminated. */
- if ((size_t) res == *reply_len)
- res = (*reply_len) - 1;
- reply[res] = '\0';
- msg_cb(reply, res);
- }
- continue;
- }
- *reply_len = res;
- break;
- } else {
- return -2;
- }
- }
- return 0;
- }
- #endif /* CTRL_IFACE_SOCKET */
也没有什么不同啊,不过在res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
这个函数的时候就出问题了,看传的参数什么的也都没有问题啊,为什么命令行可以,这个服务启动就有问题呢,继续看看,那个wpa_supplicant有收到发的命令吗?怀疑通信有问题。
好吧,那就继续跟进吧。。。
- external/wpa_supplicant_8/wpa_supplicant/ctrl_iface_unix.c
- static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
- void *sock_ctx)
- {
- struct wpa_supplicant *wpa_s = eloop_ctx;
- struct ctrl_iface_priv *priv = sock_ctx;
- char buf[4096];
- int res;
- struct sockaddr_un from;
- socklen_t fromlen = sizeof(from);
- char *reply = NULL;
- size_t reply_len = 0;
- int new_attached = 0;
- res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
- (struct sockaddr *) &from, &fromlen);
- if (res < 0) {
- perror("recvfrom(ctrl_iface)");
- return;
- }
- buf[res] = '\0';
- if (os_strcmp(buf, "ATTACH") == 0) {
- if (wpa_supplicant_ctrl_iface_attach(priv, &from, fromlen))
- reply_len = 1;
- else {
- new_attached = 1;
- reply_len = 2;
- }
- } else if (os_strcmp(buf, "DETACH") == 0) {
- if (wpa_supplicant_ctrl_iface_detach(priv, &from, fromlen))
- reply_len = 1;
- else
- reply_len = 2;
- } else if (os_strncmp(buf, "LEVEL ", 6) == 0) {
- if (wpa_supplicant_ctrl_iface_level(priv, &from, fromlen,
- buf + 6))
- reply_len = 1;
- else
- reply_len = 2;
- } else {
- reply = wpa_supplicant_ctrl_iface_process(wpa_s, buf,
- &reply_len);
- }
- if (reply) {
- sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from,
- fromlen);
- os_free(reply);
- } else if (reply_len == 1) {
- sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from,
- fromlen);
- } else if (reply_len == 2) {
- sendto(sock, "OK\n", 3, 0, (struct sockaddr *) &from,
- fromlen);
- }
- if (new_attached)
- eapol_sm_notify_ctrl_attached(wpa_s->eapol);
- }
这回彻底无语了。收到的buf也是"ATTACH",也运行到了sendto(sock, "OK\n", 3, 0, (struct sockaddr *) &from,fromlen); 为什么呢?明明一模一样的啊,可是命令行可以,android启动个服务就死在这里了。纠结了一天也不知道什么原因。
想想不对啊,最后看了下生成的那个用来通信的接口,/data/misc/wifi/sockets/下的权限是system,而/wlan0/wlan0这个接口的权限是wifi,难道是这个问题?而命令行的时候/data/misc/wifi/sockets/下的权限是wifi,好吧,看来就是这个问题了,有了定位,那么事情就好办多了,接着想想那个权限到底怎么给设置上去的呢?找了好久发现了一个小问题。
- external/wpa_supplicant_8/hostapd/src/utrls/os-unix.c
- int os_program_init(void)
- {
- #ifdef ANDROID
- /*
- * We ignore errors here since errors are normal if we
- * are already running as non-root.
- */
- gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE };
- struct __user_cap_header_struct header;
- struct __user_cap_data_struct cap;
- setgroups(sizeof(groups)/sizeof(groups[0]), groups);
- prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
- setgid(AID_WIFI);
- setuid(AID_WIFI);
- header.version = _LINUX_CAPABILITY_VERSION;
- header.pid = 0;
- cap.effective = cap.permitted =
- (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
- cap.inheritable = 0;
- capset(&header, &cap);
- #endif /* ANDROID */
- #ifdef WPA_TRACE
- dl_list_init(&alloc_list);
- #endif /* WPA_TRACE */
- return 0;
- }
可恶的,应该就是这了 gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE然后把#ifdef ANDROID改为#if 0重新编译,启动,终于可以在android UI界面里搜索到网络并且连接上了。OK,调试完成,接着就是整理完善了。
坎坎坷坷,总算把wifi给适配好了,主要还是经验不足啊,相信通过不断的努力,我可以很快进步,相信把所做的总结下来,记录下来,不仅可以帮到别人,也可以不断提高自己,完善自己。
补充:
关于IP的自动获取不成功的问题,下午找了下原因还是那个恶心的权限问题,因为我是用的unix标准的sockets,而不是android内部的sockets,所以出问题了。只要在
External/dhcpcd/dhcpcd.c中头文件的位置加上以下几句,然后再mm生成的dhcpcd就可以了
- #ifdef ANDROID
- #undef ANDROID
- #endif
ok,至此,USB wifi的移植就完全成功了。好好回去休息吧,又是周末了。。
调试WIFI的一些准备工作
博客转载地址:http://www.cnblogs.com/gunl/archive/2010/08/19/1803594.html
Wireless tools for Linux 的一些资料收集
Wireless tools for Linux介绍
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。Wireless tools for Linux 和 Linux Wireless Extension 由 Jean Tourrilhes在维护,由Hewlett-Packard(HP惠普)赞助。
大多数基于Linux内核的操作系统都包含Wireless tools。在许多GNU/Linux 发行版中,都缺省安装这个工具包,即使是没有自动安装,也能很容易地找到其二进制代码安装包。
Wireless Extension (WE)是一组通用的API,能在用户空间对通用Wireless LANs进行配置和统计。它的好处在于仅通过一组单一的工具就能对各种各样的Wireless LANs进行管理,不过它们是什么类型,只要其驱动支持Wireless Extension就行;另一个好处就是不用重启驱动或Linux就能改变这些参数。
Wireless Tools (WT)就是用来操作Wireless Extensions的工具集,它们使用字符界面,虽然粗糙,但支持所有Wireless Extension。虽然还有很多其他管理Wireless Extensions的工具,但Wireless Tools是参考实现,它包括以下工具:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,密钥等
iwspy:获取每个节点链接的质量
iwpriv:操作Wireless Extensions 特定驱动
ifrename: 基于各种静态标准命名接口
大多数 Linux 发行版本都在其网络初始化脚本中集成Wireless Extension,以便启动时配置无线接口。他们还将Wireless Tools作为其标准封装包。
无线配置也可以使用hotplug或uDev脚本来完成,需要发行版特定的支持,这样能支持任何可移动的无线接口(Pcmcia,CardBus,USB接口...)。
Wireless Tools(从版本19)开始完全支持IEEE 802.11标准参数和设备,支持旧风格的设备和最专有协议,并准备处理HiperLan。较新版本增加了更多802.11支持。但不幸的是,并非所有的驱动程序支持所有这些功能。
最新的稳定版本的Wireless Tools是版本29,大多数愚蠢的错误已被删除,并支持所有的Wireless Extension(从版本v11至v21)。可以从http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz下载最新的Wireless Tools。
命令行:(ap不需要验证密码)
iwlist mlan0 scan //搜索ap
iwconfig mlan0 essid “linksys” //连接ap
udhcpc –i mlan0 //获得动态IP
命令行:(ap需要验证密码)
iwlist mlan0 scan //搜索ap
iwconfig mlan0 key xxxxxxxxxx // 输入验证密码
iwconfig mlan0 key open //密码验证功能打开
iwconfig mlan0 essid “linksys” //连接ap
udhcpc –i mlan0 //获得动态IP
extscan (8BFA) : set 0 int & get 2 char
hostcmd (8BE4) : set 2047 byte & get 2047 byte
arpfilter (8BE6) : set 2047 byte & get 2047 byte
regrdwr (8BE3) : set 256 char & get 256 char
sdcmd52rw (8BFE) : set 7 byte & get 7 byte
sdcmd53rw (8BFF) : set 0 char & get 0 char
setgetconf (8BEA) : set 2000 byte & get 2000 byte
getcis (8BE1) : set 0 & get 512 byte
scantype (8BEB) : set 8 char & get 8 char
deauth (0001) : set 1 addr & get 0
getNF (0001) : set 1 int & get 1 int
getRSSI (0002) : set 1 int & get 1 int
bgscan (0004) : set 1 int & get 1 int
enable11d (0005) : set 1 int & get 1 int
adhocgrate (0006) : set 1 int & get 1 int
sdioclock (0007) : set 1 int & get 1 int
wmm (0008) : set 1 int & get 1 int
uapsdnullgen (000A) : set 1 int & get 1 int
setcoalescing (000B) : set 1 int & get 1 int
adhocgprot (000C) : set 1 int & get 1 int
disable_chsw (000F) : set 1 int & get 1 int
setpowercons (0001) : set 1 int & get 1 int
wmm_qosinfo (0002) : set 1 int & get 1 int
lolisteninter (0003) : set 1 int & get 1 int
psnullinterval (0005) : set 1 int & get 1 int
bcnmisto (0006) : set 1 int & get 1 int
ldocfg (0008) : set 1 int & get 1 int
rtsctsctrl (000F) : set 1 int & get 1 int
moduletype (000B) : set 1 int & get 1 int
autodeepsleep (000C) : set 1 int & get 1 int
enhanceps (000D) : set 1 int & get 1 int
wakeupmt (000E) : set 1 int & get 1 int
setrxant (0001) : set 1 int & get 0
settxant (0002) : set 1 int & get 0
authalgs (0004) : set 1 int & get 0
encryptionmode (0005) : set 1 int & get 0
setregioncode (0006) : set 1 int & get 0
setlisteninter (0007) : set 1 int & get 0
setmultipledtim (0008) : set 1 int & get 0
setbcnavg (0009) : set 1 int & get 0
setdataavg (000A) : set 1 int & get 0
associate (000B) : set 1 int & get 0
getregioncode (0001) : set 0 & get 1 int
getlisteninter (0002) : set 0 & get 1 int
getmultipledtim (0003) : set 0 & get 1 int
gettxrate (0004) : set 0 & get 1 int
getbcnavg (0005) : set 0 & get 1 int
getdataavg (0006) : set 0 & get 1 int
getauthtype (0007) : set 0 & get 1 int
getrsnmode (0008) : set 0 & get 1 int
act_paircipher (0009) : set 0 & get 1 int
act_groupcipher (000A) : set 0 & get 1 int
getdtim (000B) : set 0 & get 1 int
getrxant (0001) : set 0 & get 12 char
gettxant (0002) : set 0 & get 12 char
gettsf (0003) : set 0 & get 12 char
wpssession (0004) : set 0 & get 12 char
deepsleep (8BFB) : set 1 char & get 6 char
adhocstop (0004) : set 0 & get 0
radioon (0001) : set 0 & get 0
radiooff (0002) : set 0 & get 0
rmaeskey (0003) : set 0 & get 0
crypto_test (0006) : set 0 & get 0
reasso-on (0007) : set 0 & get 0
reasso-off (0008) : set 0 & get 0
wlanidle-on (0009) : set 0 & get 0
wlanidle-off (000A) : set 0 & get 0
softreset (000C) : set 0 & get 0
sleepparams (0002) : set 64 char & get 64 char
requesttpc (0004) : set 64 char & get 64 char
powercap (0005) : set 64 char & get 64 char
measreq (000C) : set 64 char & get 64 char
bca-ts (0003) : set 64 char & get 64 char
scanmode (0006) : set 64 char & get 64 char
getadhocstatus (0009) : set 64 char & get 64 char
setgenie (000A) : set 64 char & get 64 char
getgenie (000B) : set 64 char & get 64 char
qstatus (000D) : set 64 char & get 64 char
ts_status (000E) : set 64 char & get 64 char
setaeskey (0001) : set 32 char & get 0
getaeskey (0001) : set 1 int & get 128 char
version (0002) : set 1 int & get 128 char
verext (0003) : set 1 int & get 128 char
setwpaie (8BE0) : set 24 char & get 0
setband (0001) : set 10 char & get 0
setadhocch (0002) : set 10 char & get 0
chanswann (0003) : set 10 char & get 0
getband (0001) : set 0 & get 10 char
getadhocch (0002) : set 0 & get 10 char
getlog (8BE9) : set 0 & get 512 char
tpccfg (0001) : set 16 int & get 16 int
scanprobes (0006) : set 16 int & get 16 int
ledgpio (0005) : set 16 int & get 16 int
sleeppd (0007) : set 16 int & get 16 int
rateadapt (0008) : set 16 int & get 16 int
getSNR (0009) : set 16 int & get 16 int
getrate (000A) : set 16 int & get 16 int
getrxinfo (000B) : set 16 int & get 16 int
atimwindow (000C) : set 16 int & get 16 int
bcninterval (000D) : set 16 int & get 16 int
sdiopullctrl (000E) : set 16 int & get 16 int
scantime (000F) : set 16 int & get 16 int
sysclock (0010) : set 16 int & get 16 int
txcontrol (0012) : set 16 int & get 16 int
hscfg (0014) : set 16 int & get 16 int
hssetpara (0015) : set 16 int & get 16 int
inactoext (0016) : set 16 int & get 16 int
dbgscfg (0017) : set 16 int & get 16 int
drvdbg (0018) : set 16 int & get 16 int
drvdelaymax (001A) : set 16 int & get 16 int
intfctrl (001B) : set 16 int & get 16 int
setquietie (001C) : set 16 int & get 16 int
ctspowerctrl (001E) : set 16 int & get 16 int
psmode (001F) : set 16 int & get 16 int
setuserscan (0001) : set 2000 byte & get 2000 byte
getscantable (0002) : set 2000 byte & get 2000 byte
setmrvltlv (0003) : set 2000 byte & get 2000 byte
getassocrsp (0004) : set 2000 byte & get 2000 byte
addts (0005) : set 2000 byte & get 2000 byte
delts (0006) : set 2000 byte & get 2000 byte
qconfig (0007) : set 2000 byte & get 2000 byte
qstats (0008) : set 2000 byte & get 2000 byte
txpktstats (000C) : set 2000 byte & get 2000 byte
getcfptable (0009) : set 2000 byte & get 2000 byte
mefcfg (000A) : set 2000 byte & get 2000 byte
getmem (000B) : set 2000 byte & get 2000 byte
通过iwpriv,我们可以得到AP的一些参数设置,也可以设置自己的WIFI参数。
mlan0 getband:bg
1.WIFI介绍
Wi-Fi(WirelessFidelity),即无线保真,与蓝牙技术一样,同属于在办公室和家庭中使用的短距离无线技术。该技术使用的使2.4GHz附近的频段,该频段目前尚属没用许可的无线频段。其目前可使用的标准有两个,分别是IEEE802.11a和IEEE802.11b。Wi-Fi技术突出的优势在于: 其一,无线电波的覆盖范围广,基于蓝牙技术的电波覆盖范围非常小,半径大约只有50英尺左右约合15米,而Wi-Fi的半径则可达300英尺左右约合100米。 其二,传输速度非常快,可以达到11mbps,符合个人和社会信息化的需求。根据无线网卡使用的标准不同,WIFI的速度也有所不同。其中IEEE802.11b最高为11Mbps(部分厂商在设备配套的情况下可以达到22Mbps),IEEE802.11a为54Mbps、IEEE802.11g也是54Mbps。WIFI无线网络由AP(Access Point)和无线网卡组成。AP一般称为网络桥接器或接入点,AP每100ms将SSID(Service Set Identifier)经由beacons(信号台)封包广播一次,beacons封包的传输速率是1 Mbit/s,并且长度相当的短,所以这个广播动作对网络效能的影响不大。因为Wi-Fi规定的最低传输速率是1 Mbit/s ,所以确保所有的Wi-Fi client端都能收到这个SSID广播封包,client 可以借此决定是否要和这一个SSID的AP连线。使用者可以设定要连线到哪一个SSID。Wi-Fi系统总是对用户端开放其连接标准,并支援漫游,这就是Wi-Fi的好处。但亦意味着,一个无线适配器有可能在性能上优于其他的适配器。由于Wi-Fi通过空气传送信号,所以和非交换以太网有相同的特点。 Wifi加密方式主要有以下三种:WEP(有线等效加密)——采用WEP 64位或者128位数据加密 WPA-PSK [TKIP]——采用预共享密钥的Wi-Fi保护访问,采用WPA-PSK标准加密技术,加密类型为TKIP WPA2-PSK [AES]——采用预共享密钥的Wi-Fi保护访问(版本2),采用WPA2-PSK标准加密技术,加密类型为AES
2.WIFI相关工具安装
在加载wifi驱动之前,我们需要安装应用层的工具,即wireless tools与wpa_supplicant。
2.1 wireless-tools安装
wireless-tools是一组无线网络扫描器及监控工具,可以用于监控、分析、以及测试WiFi网络,支持几乎所有的无线网卡和驱动,它可以支持WEP的AP,但它不能连接到那些只支持WPA的AP。连接AP需要使用它所编译出来的工具。
1、资源下载
下载wireless_tools.29.tar.gz
2、解压
# tar zxvf wireless_tools.29.tar.gz
#cd wireless_tools.29
3、修改Makefile
## Compiler to use (modify this for cross compile).
CC = mipsel-linux-gcc
4、编译
#make
5、拷贝
将生成的工具:iwlist、iwconfig、iwpriv等拷贝到目标板上,路径为:/root/app/bin/wifitools/
2.3 wpa-supplicant安装
由于wireless tools只能支持连接WEP的AP,所以要支持WPA的AP就需要移植wpa_supplicant。
Rt73的原始驱动中采用的wpa_supplicant的版本比较旧,是0.5.8,我们采用版本。
1、下载资源
本文使用的是:
http://hostap.epitest.fi/releases/wpa_supplicant-0.5.11.tar.gz
最新 wpa-supplicant
http://hostap.epitest.fi/releases/wpa_supplicant-0.6.9.tar.gz
2、文件修改
对照2009_0206_RT73_Linux_STA_Drv.bz2中WPA_Supplicant-0.5.8的文件,修改0.5.11中的对应文件,
3、解压
# tar zxvf wpa_supplicant-0.5.11.tar.gz
# cd wpa_supplicant-0.5.11
4、编译
#cp defconfig .config #使用默认的config
#export CC=mipsel-linux-gcc
#make
5、安装
将生成的wpa_supplicant 拷贝到目标板上, 路径为:/root/app/bin/wifitools/下
6、编写wpa网络的配置文件wpa_supplicant.conf
在目标板上目录为/root/appb/conf/wifi/下,创建一个wpa_supplicant.conf,键入以下内容:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1
network={
ssid="a" #essid
psk="111" #密码
}
3. WIFI驱动安装
1、驱动下载
http://www.ralinktech.com.tw/data/drivers/2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2
2、解压
# tar jxvf 2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2
# cd 2009_2006_RT73_Linux_STA_Drv_1.1.0.2/Module
3、修改Makefile
5 #PLATFORM=PC
6 PLATFORM=CMPC
40 ifeq ($(PLATFORM),CMPC)
41 LINUX_SRC = /opt/smp86xx_kernel_source_2.8.4.1/linux-2.6.15
42 endif
4、编译
# cp Makefile.6 ./Makefile
# make
5、安装
在目标板上,先将生成的rt73.ko以及文件rt73sta.dat 与 rt73.bin 拷贝到目标板上。
# cp rt73.ko /root/app/lib/ modules/2.6.15/
# mkdir –p /etc/Wireless/RT73STA
# cp rt73.bin /etc/Wireless/RT73STA
# cp rt73sta.dat /etc/Wireless/RT73STA
# insmod rt73.ko
# lsmod
另:ifrename 的使用
touch /etc/iftab
ifrename -i ra0 -n wlan0
ifrename -i rausb0 -n wlan0
/etc/iftab wlan1 mac
http://linux.die.net/man/8/ifrename
---------------------------------------------------------------------------
移植wireless tools for liunx
CC = gcc
AR = ar
RANLIB = ranlib
改为
CC = arm-linux-gcc
AR = arm-linux-ar
RANLIB = arm-linux-ranlib
Cell 01 - Address: 00:19:C6:53:B9:CE
ESSID:"rat-linux"
Mode:Master
Channel:2
Frequency:2.417 GHz (Channel 2)
Quality=11/100 Signal level:66/100
Encryption key:on
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Extra:tsf=000000056306469f
Extra: Last beacon: 1065ms ago
其中可以看到我的无线接入点是需要密码的。假设密码是123456。使用如下的命令设置密码。
iwconfig wlan0 key 123456
iwconfig wlan0 ap auto
Mode:Managed Frequency:2.417 GHz Access Point: 00:19:C6:53:B9:CE
Bit Rate=1 Mb/s Tx-Power=27 dBm
Retry min limit:7 RTS thr:off Fragment thr=2352 B
Encryption key:1234-56 Security mode:open
Power Management:off
Link Quality=100/100 Signal level:66/100
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
至此,无线网卡安装全部完成。
#! /bin/sh
iwconfig wlan0 key 123456
iwconfig wlan0 essid "rat-linux"
iwconfig wlan0 ap auto
ifconfig wlan0 192.168.1.30 netmask 255.255.255.0
本文来自CSDN博客,转载出处:http://blog.csdn.net/linweig/archive/2010/01/15/5194761.aspx