原文在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又怎么通过这些东西就获得经纬度了呢?
了解了这几个名词的意思,相信有些朋友已经知道后面的事了,google存储了这些信息,直接查询就能得到经纬度了。具体的使用实例请参见后面的参考原文,本人实验结果是失败的。
参考原文:http://hi.baidu.com/yyangjjun/blog/item/f6e6e79208136683a877a46d.html
参考原文:http://blog.csdn.net/comkingfly/article/details/7305309