和菜鸟一起学android4.0.3源码之USB wifi移植心得


转载地址: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这个工具就可以测试了

[html]  view plain copy
  1. ./iwlist wlan0 scanning  
  2.   
  3. ./iwconfig wlan0 mode managed  
  4.   
  5. ./iwconfig wlan0 essid “你要连接的路由”  
  6.   
  7. ./ifconfig wlan0 要为wifi设置的静态IP netmask 255.255.255.0 up  


        然后就可以ping通你的路由了,如果成功了,那么说明wifi的驱动没多大的问题,接着就可以上android去调试了。

       现在想想,其实androidwifi适配其实也算简单的,只是对于网络不是很懂,所以才觉得有难度。先讲讲androidwifi的一些代码主要的目录吧。

1、  wpa_supplicant: 这个最最纠结了,主要也就是这个东东了,这个好了,那基本上就没什么问题了。Wpa就是应

       用层认证客户端,负责完成认证相关登陆,加密等工作。

        external/wpa_supplicant_8/下,通过mm后可以生成动态库libwpa_client.so和可执行的程序wpa_supplicantwpa_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

[html]  view plain copy
  1. mkdir /data/misc/wifi 0777 wifi wifi  
  2.   
  3. chmod 0777 /data/misc/wifi/wpa_supplicant.conf  
  4.   
  5. mkdir /wlan0 0777 wifi wifi   

 

        因为编译进内核的,所以加上下面两句

[html]  view plain copy
  1. #prepare for wifi  
  2.   
  3.        setprop wifi.interface “wlan0”  
  4.   
  5.         setprop wlan.driver.status “ok”  


 

init.xxx.rc中添加下面的

  

[html]  view plain copy
  1. mkdir /data/misc/wifi/sockets 0777 wifi wifi  
  2.   
  3.   mkdir /data/misc/dhcp 0777 dhcp dhcp  
  4.   
  5.   chmod 0777  /dev/rfkill  


又和蓝牙一样,有一个rfkill,所以得给他修改下权限。

 

[html]  view plain copy
  1. service  wpa_supplicant /system/bin/wpa_supplicant –dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf  
  2.   
  3.        class main  
  4.   
  5.        #socket wpa_wpa_wlan0 dgram 0777 wifi wifi   
  6.   
  7.        group system inet  
  8.   
  9.         disabled  
  10.   
  11.         oneshot  


 

[html]  view plain copy
  1. service dhcpcd_wlan0 /system/bin/dhcpcd –d –B wlan0  
  2.   
  3.        class main  
  4.   
  5.        disabled   
  6.   
  7.        oneshot  


 

        好了,主要修改这些,基本上没有什么提示权限问题了。接着要把那个

wpa_supplicant.conf加进去,里面的内容一般可以如下:

[html]  view plain copy
  1. ctrl_interface=wlan0  
  2.   
  3. update_config=1  
  4.   
  5. ap_scan=1  
  6.   
  7. fast_reauth=1  


       接着在修改下wifi.c中的代码

[html]  view plain copy
  1. static const char IFACE_DIR[]           = "/data/system/wpa_supplicant";  


这个修改为

[html]  view plain copy
  1. static const char IFACE_DIR[]           = "/wlan0";  


[html]  view plain copy
  1. static int insmod(const char *filename, const char *args)  


这个函数第一行就return 0。因为编译进内核,没有模块。

[html]  view plain copy
  1. static int rmmod(const char *modname)  

这个函数同上。

        恩,基本上搞定了,还有就是要在相应的平台下把wifi的相关宏定义给选上。举个例子,比如说你的平台是samsungTuna平台,那么在device/Samsung/Tuna/BoardConfig.mk中有几个宏必须选上

      

[html]  view plain copy
  1. BOARD_WIFI_VENDOR :=realtek  
  2.   
  3.        WPA_SUPPLICANT_VERSION :VER_0_8_X  
  4.   
  5.        BOARD_WPA_SUPPLICANT_PRIVATE_LIB :lib_drivercmd_wext  
  6.   
  7.        BOARD_WLAN_DEVICE :rtl8192cu  


 

        好了,然后就到相应的目录下去编译生成相关的.so和可执行应用程序吧

Hardware/libhardware_legacy/mm后得到了libhardware_legacy.so

        然后再到

external/wpa_supplicant_8/mm后得到了wpa_cli, wpa_supplicantlibwpa_client.so

 

        好了,接着可以启动了,在此,还是先用命令行,上面的那两个服务先注释掉,然后开始去启动。

启动后,首先就是查看下底层驱动有没有运行,主要就是cat /proc/net/devwlan0的话,那么就说明ok了。接着就是要连接上wpa_supplicant

[html]  view plain copy
  1. wpa_supplicant –dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf &  


让他后台运行着就好了。

就这就

[html]  view plain copy
  1. wpa_cli –iwlan0 –p/wlan0  


然后再

Scan (搜索网络)

接着scan_res(显示搜索结果,如果可以搜到网络的话,那么几乎就可以说是成功了)

接着就

[html]  view plain copy
  1. add_net  
  2.   
  3. set_net 0 ssid “相应搜到的网络”  
  4.   
  5. set_net 0 key_mgmt NONE  
  6.   
  7. set_net 0 priority 0  
  8.   
  9. list_net  
  10.   
  11. save_config  
  12.   
  13. enable_net 0  


这样就可以启动了,然后再

[html]  view plain copy
  1. dhcpcd wlan0  


分配一个ip地址,接着去ping路由,就可以ping的通了,那么一直基本上告一段落。

 

不过这个是命令行的,得让他在UI界面出来,于是还是启动服务吧,可是一直wpa_supplicant的时候就不成功,老是有问题。跟进代码,当上层开关打开后就会调用到下面这个函数去连接wpa_supplicant

[html]  view plain copy
  1. /hardware/libhardware_legacy/wifi.c  
  2.   
  3. int wifi_connect_to_supplicant()  
  4.   
  5. {  
  6.   
  7.     char ifname[256];  
  8.   
  9.     char supp_status[PROPERTY_VALUE_MAX] = {'\0'};  
  10.   
  11.    
  12.   
  13.     /* Make sure supplicant is running */  
  14.   
  15.     if (!property_get(SUPP_PROP_NAME, supp_status, NULL)  
  16.   
  17.             || strcmp(supp_status, "running") != 0) {  
  18.   
  19.         LOGE("Supplicant not running, cannot connect");  
  20.   
  21.         return -1;  
  22.   
  23.     }  
  24.   
  25.    
  26.   
  27.     if (access(IFACE_DIR, F_OK) == 0) {  
  28.   
  29.         snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);  
  30.   
  31.     } else {  
  32.   
  33.         strlcpy(ifname, iface, sizeof(ifname));  
  34.   
  35.     }  
  36.   
  37.    
  38.   
  39.     ctrl_conn = wpa_ctrl_open(ifname);  
  40.   
  41.     if (ctrl_conn == NULL) {  
  42.   
  43.         LOGE("Unable to open connection to supplicant on \"%s\": %s",  
  44.   
  45.              ifname, strerror(errno));  
  46.   
  47.         return -1;  
  48.   
  49.     }  
  50.   
  51.     monitor_conn = wpa_ctrl_open(ifname);  
  52.   
  53.     if (monitor_conn == NULL) {  
  54.   
  55.         wpa_ctrl_close(ctrl_conn);  
  56.   
  57.         ctrl_conn = NULL;  
  58.   
  59.         return -1;  
  60.   
  61.     }  
  62.   
  63.     if (wpa_ctrl_attach(monitor_conn) != 0) {  
  64.   
  65.         wpa_ctrl_close(monitor_conn);  
  66.   
  67.         wpa_ctrl_close(ctrl_conn);  
  68.   
  69.         ctrl_conn = monitor_conn = NULL;  
  70.   
  71.         return -1;  
  72.   
  73.     }  
  74.   
  75.    
  76.   
  77.     if (socketpair(AF_UNIX, SOCK_STREAM, 0, exit_sockets) == -1) {  
  78.   
  79.         wpa_ctrl_close(monitor_conn);  
  80.   
  81.         wpa_ctrl_close(ctrl_conn);  
  82.   
  83.         ctrl_conn = monitor_conn = NULL;  
  84.   
  85.         return -1;  
  86.   
  87.     }  
  88.   
  89.    
  90.   
  91.     return 0;  
  92.   
  93. }  


 

        这里的ifname=/wlan0/wlan0,这样,两个接口ctrl_connmonitor_conn都可以正常打开,可是到了wpa_ctrl_attach(monitor_conn)的时候就一直不可以,而用命令行的时候都是可以的

继续跟进代码

[html]  view plain copy
  1. external/wpa_supplicant_8/src/common/wpa_ctrl.c  
  2.   
  3.    
  4.   
  5. #ifdef CTRL_IFACE_SOCKET  
  6.   
  7. int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,  
  8.   
  9.                    char *reply, size_t *reply_len,  
  10.   
  11.                    void (*msg_cb)(char *msg, size_t len))  
  12.   
  13. {  
  14.   
  15.        struct timeval tv;  
  16.   
  17.        int res;  
  18.   
  19.        fd_set rfds;  
  20.   
  21.        const char *_cmd;  
  22.   
  23.        char *cmd_buf = NULL;  
  24.   
  25.        size_t _cmd_len;  
  26.   
  27.    
  28.   
  29. #ifdef CONFIG_CTRL_IFACE_UDP  
  30.   
  31.        if (ctrl->cookie) {  
  32.   
  33.               char *pos;  
  34.   
  35.               _cmd_len = os_strlen(ctrl->cookie) + 1 + cmd_len;  
  36.   
  37.               cmd_buf = os_malloc(_cmd_len);  
  38.   
  39.               if (cmd_buf == NULL)  
  40.   
  41.                      return -1;  
  42.   
  43.               _cmd = cmd_buf;  
  44.   
  45.               pos = cmd_buf;  
  46.   
  47.               os_strlcpy(pos, ctrl->cookie, _cmd_len);  
  48.   
  49.               pos += os_strlen(ctrl->cookie);  
  50.   
  51.               *pos++ = ' ';  
  52.   
  53.               os_memcpy(pos, cmd, cmd_len);  
  54.   
  55.        } else  
  56.   
  57. #endif /* CONFIG_CTRL_IFACE_UDP */  
  58.   
  59.        {  
  60.   
  61.               _cmd = cmd;  
  62.   
  63.               _cmd_len = cmd_len;  
  64.   
  65.        }  
  66.   
  67.    
  68.   
  69.        if (send(ctrl->s, _cmd, _cmd_len, 0) < 0) {  
  70.   
  71.               os_free(cmd_buf);  
  72.   
  73.               return -1;  
  74.   
  75.        }  
  76.   
  77.        os_free(cmd_buf);  
  78.   
  79.    
  80.   
  81.        for (;;) {  
  82.   
  83.               tv.tv_sec = 10;  
  84.   
  85.               tv.tv_usec = 0;  
  86.   
  87.               FD_ZERO(&rfds);  
  88.   
  89.               FD_SET(ctrl->s, &rfds);  
  90.   
  91.               res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);  
  92.   
  93.               if (res < 0)  
  94.   
  95.                      return res;  
  96.   
  97.               if (FD_ISSET(ctrl->s, &rfds)) {  
  98.   
  99.                      res = recv(ctrl->s, reply, *reply_len, 0);  
  100.   
  101.                      if (res < 0)  
  102.   
  103.                             return res;  
  104.   
  105.                      if (res > 0 && reply[0] == '<') {  
  106.   
  107.                             /* This is an unsolicited message from  
  108.   
  109.                              * wpa_supplicant, not the reply to the  
  110.   
  111.                              * request. Use msg_cb to report this to the  
  112.   
  113.                              * caller. */  
  114.   
  115.                             if (msg_cb) {  
  116.   
  117.                                    /* Make sure the message is nul  
  118.   
  119.                                     * terminated. */  
  120.   
  121.                                    if ((size_t) res == *reply_len)  
  122.   
  123.                                           res = (*reply_len) - 1;  
  124.   
  125.                                    reply[res] = '\0';  
  126.   
  127.                                    msg_cb(reply, res);  
  128.   
  129.                             }  
  130.   
  131.                             continue;  
  132.   
  133.                      }  
  134.   
  135.                      *reply_len = res;  
  136.   
  137.                      break;  
  138.   
  139.               } else {  
  140.   
  141.                      return -2;  
  142.   
  143.               }  
  144.   
  145.        }  
  146.   
  147.        return 0;  
  148.   
  149. }  
  150.   
  151. #endif /* CTRL_IFACE_SOCKET */  
  152.   
  153.    


        也没有什么不同啊,不过在res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);

          这个函数的时候就出问题了,看传的参数什么的也都没有问题啊,为什么命令行可以,这个服务启动就有问题呢,继续看看,那个wpa_supplicant有收到发的命令吗?怀疑通信有问题。

好吧,那就继续跟进吧。。。

 

[html]  view plain copy
  1. external/wpa_supplicant_8/wpa_supplicant/ctrl_iface_unix.c  
  2.   
  3.    
  4.   
  5. static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,  
  6.   
  7.                                          void *sock_ctx)  
  8.   
  9. {  
  10.   
  11.        struct wpa_supplicant *wpa_s = eloop_ctx;  
  12.   
  13.        struct ctrl_iface_priv *priv = sock_ctx;  
  14.   
  15.        char buf[4096];  
  16.   
  17.        int res;  
  18.   
  19.        struct sockaddr_un from;  
  20.   
  21.        socklen_t fromlen = sizeof(from);  
  22.   
  23.        char *reply = NULL;  
  24.   
  25.        size_t reply_len = 0;  
  26.   
  27.        int new_attached = 0;  
  28.   
  29.    
  30.   
  31.        res = recvfrom(sock, buf, sizeof(buf) - 1, 0,  
  32.   
  33.                      (struct sockaddr *) &from, &fromlen);  
  34.   
  35.        if (res < 0) {  
  36.   
  37.               perror("recvfrom(ctrl_iface)");  
  38.   
  39.               return;  
  40.   
  41.        }  
  42.   
  43.        buf[res] = '\0';  
  44.   
  45.    
  46.   
  47.        if (os_strcmp(buf, "ATTACH") == 0) {  
  48.   
  49.               if (wpa_supplicant_ctrl_iface_attach(priv, &from, fromlen))  
  50.   
  51.                      reply_len = 1;  
  52.   
  53.               else {  
  54.   
  55.                      new_attached = 1;  
  56.   
  57.                      reply_len = 2;  
  58.   
  59.               }  
  60.   
  61.        } else if (os_strcmp(buf, "DETACH") == 0) {  
  62.   
  63.               if (wpa_supplicant_ctrl_iface_detach(priv, &from, fromlen))  
  64.   
  65.                      reply_len = 1;  
  66.   
  67.               else  
  68.   
  69.                      reply_len = 2;  
  70.   
  71.        } else if (os_strncmp(buf, "LEVEL ", 6) == 0) {  
  72.   
  73.               if (wpa_supplicant_ctrl_iface_level(priv, &from, fromlen,  
  74.   
  75.                                               buf + 6))  
  76.   
  77.                      reply_len = 1;  
  78.   
  79.               else  
  80.   
  81.                      reply_len = 2;  
  82.   
  83.        } else {  
  84.   
  85.               reply = wpa_supplicant_ctrl_iface_process(wpa_s, buf,  
  86.   
  87.                                                    &reply_len);  
  88.   
  89.        }  
  90.   
  91.    
  92.   
  93.        if (reply) {  
  94.   
  95.               sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from,  
  96.   
  97.                      fromlen);  
  98.   
  99.               os_free(reply);  
  100.   
  101.        } else if (reply_len == 1) {  
  102.   
  103.               sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from,  
  104.   
  105.                      fromlen);  
  106.   
  107.        } else if (reply_len == 2) {  
  108.   
  109.               sendto(sock, "OK\n", 3, 0, (struct sockaddr *) &from,  
  110.   
  111.                      fromlen);  
  112.   
  113.        }  
  114.   
  115.    
  116.   
  117.        if (new_attached)  
  118.   
  119.               eapol_sm_notify_ctrl_attached(wpa_s->eapol);  
  120.   
  121. }  


 

        这回彻底无语了。收到的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,好吧,看来就是这个问题了,有了定位,那么事情就好办多了,接着想想那个权限到底怎么给设置上去的呢?找了好久发现了一个小问题。

 

[html]  view plain copy
  1. external/wpa_supplicant_8/hostapd/src/utrls/os-unix.c  
  2.   
  3.    
  4.   
  5. int os_program_init(void)  
  6.   
  7. {  
  8.   
  9. #ifdef ANDROID  
  10.   
  11.        /*  
  12.   
  13.         * We ignore errors here since errors are normal if we  
  14.   
  15.         * are already running as non-root.  
  16.   
  17.         */  
  18.   
  19.        gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE };  
  20.   
  21.        struct __user_cap_header_struct header;  
  22.   
  23.        struct __user_cap_data_struct cap;  
  24.   
  25.    
  26.   
  27.        setgroups(sizeof(groups)/sizeof(groups[0]), groups);  
  28.   
  29.    
  30.   
  31.        prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);  
  32.   
  33.    
  34.   
  35.        setgid(AID_WIFI);  
  36.   
  37.        setuid(AID_WIFI);  
  38.   
  39.    
  40.   
  41.        header.version = _LINUX_CAPABILITY_VERSION;  
  42.   
  43.        header.pid = 0;  
  44.   
  45.        cap.effective = cap.permitted =  
  46.   
  47.               (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);  
  48.   
  49.        cap.inheritable = 0;  
  50.   
  51.        capset(&header, &cap);  
  52.   
  53. #endif /* ANDROID */  
  54.   
  55.    
  56.   
  57. #ifdef WPA_TRACE  
  58.   
  59.        dl_list_init(&alloc_list);  
  60.   
  61. #endif /* WPA_TRACE */  
  62.   
  63.        return 0;  
  64.   
  65. }  


 

        可恶的,应该就是这了    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就可以了

[html]  view plain copy
  1. #ifdef ANDROID  
  2.   
  3. #undef ANDROID  
  4.   
  5. #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。

 
 
 
  我们经常会用到的主要是 iwlist、iwconfig、 iwpriv:
 

命令行:(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

  

   关于iwconfig 可以看上一篇文章;这里补充一下有关iwpriv:
       [root@root- /]#iwpriv
    mlan0     Available private ioctls :
          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参数。
       [root@root- /]#iwpriv mlan0 getband
       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

要正常使用无线网卡,还要正确配置。linux下的配置工具是wireless-tools,可以在这里下载到它的最新版。
下载后,将源代码解压。再修改其中的makefile文件,将其中的
CC = gcc
AR = ar
RANLIB = ranlib
改为
CC = arm-linux-gcc
AR = arm-linux-ar
RANLIB = arm-linux-ranlib
再执行make,编译完成后,将生成的iwconfig,iwlist文件拷贝到rat-linux for mini2440的根文件系统中的/bin目录下,将
libiw.so.29拷贝到/lib目录下。
启动mini2440开发板,进入linux命令行后,执行ifconfig wlan0 up,启动无线网卡。再执行iwlist scanning,此命令可以搜索到
可用的无线网络接入点。我的无线接入点是一台无线路由器,ESSID是"rat-linux",执行此命令后就会下列输出
wlan0     Scan completed :
          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
为了能接无线网,还要使用下面的命令设置ESSID
  iwconfig wlan0 essid "rat-linux"
其它的参数可以都采用默认的,不用再设了。可以使用下面的命令加入无线网了。
 
  iwconfig wlan0 ap auto
再执行iwconfig wlan0,就可以看到下面的信息。
wlan0     IEEE 802.11bg  ESSID:"rat-linux"
          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
这就表示已接入无线网。
最后,为无线网卡指定IP地址。命令如下
  ifconfig wlan0 192.168.1.30 netmask 255.255.255.0
我的开发主机和无线网卡处于同一网段,因此是可以相互PING通的。因此可以用从开发主机上PING无线网卡的IP地址的方法来确网
卡是否工作正常。从主机上执行ping 192.168.1.30,正常PING通。
至此,无线网卡安装全部完成。
最后,为了方便配置,可以将上述的配置命令写入linux脚本文件,以后,只要执行此脚本,即可完成上述步骤的配置。脚本文件内
容如下。
#! /bin/sh
ifconfig wlan0 up
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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大生群体。无论你是计算机相关专业的生,还是对其他领域编程感兴趣的生,这些资源都能为你提供宝贵的习和实践机会。通过习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值