WIFI之一:WIFI常识 && ANDROID平台上调试APM6633 && 基站定位原理

原文在http://blog.csdn.net/zhandoushi1982/article/details/5386580

(1)WIFI的网络结构,主要包括以下几部分:

* 站点(Station),网络最基本的组成部分。

* 基本服务单元(Basic Service Set,BSS)。网络最基本的服务单元。最简单的服务单元可以只由两个站点组成,站点可以动态的联结(associate)到基本服务单元中。它是一种特殊的Ad-hoc LAN的应用,一群计算机设定相同的BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。

* 分配系统(Distribution System,DS)。分配系统用于连接不同的基本服务单元。分配系统使用的媒介(Medium)逻辑上和基本服务单元使用的媒介是截然分开的,尽管它们物理上可能会是同一个媒介,例如同一个无线频段。

* 接入点(Access Point,AP)。接入点即有普通站点的身份,又有接入到分配系统的功能。

* 扩展服务单元(Extended Service Set,ESS)。由分配系统和基本服务单元组合而成。这种组合是逻辑上,并非物理上的,不同的基本服务单元有可能在地理位置相去甚远。分配系统也可以使用各种各样的技术。它是一种infrastructure的应用,一个或多个以上的BSS,即可被定义成一个Extended Service Set ( ESS ),使用者可于ESS上roaming及存取BSSs中的任何资料,其中Access Points必须设定相同的ESSID及channel才能允许roaming。

* 关口(Portal),也是一个逻辑成分。用于将无线局域网和有线局域网或其它网络联系起来。

(2)IEEE 802.11只负责在站点使用的无线的媒介上的寻址(Addressing)。分配系统和其它局域网的寻址不属无线局域网的范围。IEEE802.11没有具体定义分配系统,只是定义了分配系统应该提供的服务(Service)。整个无线局域网定义了9种服务:

* 5种服务属于分配系统的任务,分别为,联接(Association)、结束联接(Diassociation)、分配(Distribution)、集 成(Integration)、再联接(Reassociation)。

* 4种服务属于站点的任务,分别为,鉴权(Authentication)、结束鉴权(Deauthentication)、隐私(Privacy)、 MAC 数据传输(MSDU delivery)。

(3)WiFi工作原理
      WiFi 的设置至少需要一个Access Point(ap)和一个或一个以上的client(hi)。AP 每100ms将SSID(Service Set Identifier)经由beacons(信号台)封包广播一次,beacons封包的传输速率是1 Mbit/s,并且长度相当的短,所以这个广播动作对网络效能的影响不大。因为WiFi规定的最低传输速率是1 Mbit/s ,所以确保所有的WiFi client端都能收到这个SSID广播封包,client 可以借此决定是否要和这一个SSID的AP连线。使用者可以设定要连线到哪一个SSID。

     连接过程:ON->SEARCH->CONNECT->DISCONNECT->AUTO OFF--->----|

                                                                                              |--<-------SEARCH

(4)WIFI的工作参数

     WIFI的信号强度一般在-30db到-60db之间,低于-75db都属于很弱的强度。关于WIFI的漫游(ROAMING),需要同时保证AP的四个设定:A,所有的AP具有同样的SSID;B,所有的AP处于同一个子网络,具有相同的子网掩码;C,网络覆盖范围有重叠;D,所有的AP采用的加密协议必须一致。

      在自己的系统中,ROMING的触发电平是-68db,也就是当目前网络的信号强度低于-68db时,后台搜网开始进行。需要注意的是,在实际处理中,要对这个门限制进行处理。因为信号强度是个震荡值,不能一检测到-68db就触发ROAMING,而是到达稳定的门限后才开始ROMING。

      另一个问题是,决定是否ROMING的另一个条件是新的AP网络强度要高于目前AP网络强度至少8dbm。这样才有接入新网的必要。

(5)无线WIFI的分类

      802.11b的最大传输速率是11Mb,802.11g 的最大传输速率是共享54Mb(当有多个网络设备在同时通讯时,各个设备的通讯速率总和是54Mb);802.11a是每个设备独享54Mb,所以适合于大量数据的高速通讯。802.11b及g在2.4GHz频率上运行,这个频段会受到如无绳电话、微波炉和车库门开关等的干扰,可能造成服务中断。运行在5GHz频率上的802.11a标准很少产生混乱,抗干扰性较强。
(6)WIFI的应用问答

      何谓Access Control?基本上每张无线网卡上都有一组独一无二的硬件地址,即所谓的MAC address,经由Access Control table可定义某些卡可登入此AP,某些卡被拒绝登入,如此便能达到控管的机制,可避免非相关人员随意登入网络,窃取资源。 

      何谓展频 (Spread Spectrum)?展频技术主要又分为「跳频技术」及「直接序列」两种方式。而此两种技术是在第二次世界大战中军队所使用的技术,其目的是希望在恶劣的战争环境中,依然能保持通信信号的稳定性及保密性。对于一个非特定的接受器,Spread Spectrum所产生的跳动讯号对它而言,只算是脉冲噪声。 
      什么是ps方式?ps mode就是节电方式(power save mode)。开启该方式使网卡处于待机方式,如果网卡检测到网络活动,它就被唤醒并进入满电压状态。

(7)WIFI的加密方式

      WPA是 Wi-Fi® Protected Access(Wi-Fi保护接入)的简称,是无线网络的数据加密规格。它通过使用可扩展认证协议 (EAP) 提高了WEP的安全功能,通过一种加密方法提高了数据传送的安全性。

      WPA 使用802.1X认证服务器给每个用户分配不同的密钥。PSK用于家庭和小型办公室网络,每个用户都有同样的密码口令。WPA-PSK 也叫做 WPA-Personal(WPA个人)。

      TKIP是 Temporal Key Integrity Protocol(临时密钥完整性协议)的简称,是一种加密方法。TKIP提供结合信息完整性检查和重新按键机制的信息包密钥。

      AES是Advanced Encryption Standard(高级加密标准)的简称,是Wi-Fi® 授权的高效加密标准。WPA-PSK和TKIP或AES使用预先共享密钥 (PSK)。

(8)MAC地址

      什么样的MAC地址是合法的?wifi地址第1个字节的低2bit必需为0,比如:00-12-22-33-44-78(这个是合法的),03-12-22-33-44-78(都是不合法的)。这两个位有特殊含义。


 

       MAC地址的第1个字节的8个BIT从低位到高位分别用BIT1~BIT8表示。
A,BIT2:0代表 Universal administered ;1代表 locally administered。所有的厂商这个BIT都是0。
B,BIT1:0代表是单播MAC。接收方的MAC与这一帧的目的MAC一样的话,就会接收这一帧,否则会丢掉;1代表是多播MAC。接收方会检查自己允许接收的多播MAC列表,如果接收的这一帧的目的MAC在列表
中才接收,否则就丢掉。

       不写MAC地址会怎么样?如果wifi用的是模组,则MAC地址不用写,模组里面有。如果不是模组,不在NVRAM写MAC地址的话,手机会自动生成一个随机的合法的MAC地址。但是这样会有nvram warning。

(9)关于wpa_supplicant

        在没有屏的时候怎么验证wifi的功能?或者,如何绕开framework层直接对wifi driver时么操控?本文给出了一个方案,使用wpa_supplicant。主要分为3步(执行路径可能有别):
A,启动wifi driver,echo 1 > /dev/wmtWifi
B,启动supplicant,cd /system/bin   ./wpa_supplicant  -iwlan0  -Dnl80211 -c/system/etc/wifi/wpa_supplicant.conf
C,启动wpa_cli,cd  /system/bin   wpa_cli -p /data/misc/wpa_supplicant
D,常用命令 关于wpa_cli的使用网上有很多文档(搜索wpa_cli即可获得)。
some common command: 
>scan = to scan the neighboring AP 
>scan_results = show the scan results 
>status = check out the current connection information 
>terminate = terminate wpa_supplicant 
>quit = exit wpa_cli 
>add_network = it will return a network id to you 
>set_network <network id> <variable> <value> = set network variables (shows list of variables
when run without arguments), success will return OK, or will return Fail 
>select_network <network id> = select a network (disable others) 
>disable_network <network id> = disable a network 
>enable_network <network id> = enable a network 
> set_network 0 priority 0 
> list_network 
> save_config 
 ==================================================================

      WIFI+蓝牙驱动部分是由另一个同事来负责的,由于我之前没有处理过数据联通这部分的驱动,所以记录下来以便以后参考。我们部门采用的是APM6633,APM6658和cs168q来选择。用SDIO与6410的SDIO2端口连接。

1,首先是添加电源控制。添加内核文件:drivers/misc/wireless_modem_misc.c 和include/linux/wireless_modem_misc.h。该文件把无线电源控制当成一个模块来处理:module_init(wireless_modem_misc_init);通过注册杂项设备让android上层可以操纵底层的文件IO控制。需要注意几点:

    (1)定义IO控制码。以便和android上层通讯控制。

    (2)定义了atomic_t型变量wireless_modem_available,用来对其进行计数,打开关闭设备时当作可用资源时大于零,如果被占用了等于零。

    (3)定义了wireless_modem_data型结构体,用来标识此时的开关机状态。

    (4)其它的就是控制基础的GPIO口电平来切换供电和复位等。

2,在cupcake中添加开机时IOCTL的发起函数,具体在hardware/ril/reference-ril/reference-ril.c的set_pci_e_power函数,用来打开wireless电源,该函数处在一个建立的线程循环中,如下:

      static int set_pci_e_power(int on)
     {
             int fd = open("/dev/wireless_modem_misc",O_RDWR) ;
             int err = 0;
             if(fd<0)
            { 
                 err = errno ;
                 printf("error in open wireless_modem_misc err = %d: strerror(err) =%s/n",err, strerror(errno) );
                 return -1;
            }
            if(on)
            {
                printf("POWER ON WIRELESS MODEM/n");
                ioctl(fd, WIRELESS_POWER_ON,NULL);
            }
            else
           {
                printf("POWER OFF WIRELESS MODEM/n");
                ioctl(fd, WIRELESS_POWER_OFF,NULL);
           }
           if(fd >0)
                close (fd);
           return 0;

     }

为此,需要把定义的IOCTL的头文件包括进来,在bionic/libc/kernel/common/linux下放入需要的内核头文件,用在来被include。

3,添加WIFI和蓝牙的电源控制,添加内核文件:include/linux/Wlan_bt_misc.h和drivers/misc/Wlan_bt_misc.c,同样初始化了一个模块wifi_bt_misc。(有定义IO号在apm6633_io.h,可忽略)

      (1)定义了一系列关于WIFI和蓝牙的IO控制码,以便android可以控制WIFI和蓝牙的使能,复位,唤醒等操作。

      (2)定义了atomic_t型变量wifi_bt_available,用来对其进行计数,打开关闭设备时当作可用资源时大于零,如果被占用了等于零。

      (3)定义了struct wifi_bt_data { int wifi_power_opened ;  int  bt_power_opened ;};来标志其电源状态。

4,在cupcake中定义对WIFI和蓝牙驱动文件的调用。

      (1)在hardware/libhardware_legacy/wifi目录下定义了wifi_apm.c(针对APM6633,6658),和wifi_csq168.c(针对CSR168)。这两个文件模仿同目录下的wifi.c,完成WIFI底层驱动库的加载,工作状态的切换,WIFI指令的发送,supplicant的建立和终止,以及DHCP的控制。

      工作时获取的driver路径/system/lib/modules/unifi_sdio.ko是开机时系统载入的库文件目录中。firmware路径wlan_loader都是系统工作时system的子目录中。

      (2)在system/bluetooth/bluedroid目录下定义了bluetooth.c,完成对内核蓝牙控制的调用。包括电源控制,使能控制。其中bt_enable最终被蓝牙的JNI调用。

5,supplicant服务,在external/wpa_supplicant有两个目录,apm是apm6633,apm6658用的,cs168q是cs168q用的。

6,WIFI的厂商提供驱动包

      (1)apm6633 在external/wlan/unifi_sdio_driver/unifi_hostsw_linux_147  中,helper 为工具。apm6658 在external/wlan/unifi_sdio_driver/unifi_hostsw_linux_187 中。其中在各自的unifi-linux/os_linux/driver目录下config.android-arm.mk,修改目标内核路径。然后执行:./build android-arm编译

      (2)cs168q在/frameworks/base/wifi/wifi中,ar6000.ko是驱动。

      (3)三个WIFI选一的控制在vendor/sec/smdk6410的BoardConfig.mk中。

7,蓝牙的驱动包

      (1)蓝牙驱动库在external/bluez/

      (2)在system/bluetooth/data/BC06.psr,是CSR BC06-rom 蓝牙设定文件。

====================================================================================================

        在Android操作系统下,基站定位其实很简单,先说一下实现流程:调用SDK中的API(TelephonyManager)获得MCC、MNC、LAC、CID等信息,然后通过google的API获得所在位置的经纬度,最后再通过google map的API获得实际的地理位置。有人会问:MNC、MCC、LAC、CID都是些什么东西?google又怎么通过这些东西就获得经纬度了呢?

 WIFI之一:WIFI常识 && ANDROID平台上调试APM6633 && 基站定位原理_第1张图片

        了解了这几个名词的意思,相信有些朋友已经知道后面的事了,google存储了这些信息,直接查询就能得到经纬度了。具体的使用实例请参见后面的参考原文,本人实验结果是失败的。

 

参考原文:http://hi.baidu.com/yyangjjun/blog/item/f6e6e79208136683a877a46d.html

参考原文:http://blog.csdn.net/comkingfly/article/details/7305309


你可能感兴趣的:(WIFI之一:WIFI常识 && ANDROID平台上调试APM6633 && 基站定位原理)