Wifi模块全总结.docx
- 文档编号:5245900
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:89
- 大小:750.73KB
Wifi模块全总结.docx
《Wifi模块全总结.docx》由会员分享,可在线阅读,更多相关《Wifi模块全总结.docx(89页珍藏版)》请在冰豆网上搜索。
Wifi模块全总结
WIFI学习总结
1WLAN技术3
2802.11协议简述3
2.1.1概述3
3802.11四种主要物理组件4
3.1工作站(Station)4
3.2接入点(AccessPoint)4
3.3无线媒介(WirelessMedium)4
3.4分布式系统(DistributionSystem)4
4WIFI适配层5
5wpa_supplicant6
5.1wpa_ctrl的作用6
5.2WPA_SUPPLICANT6
5.2.1概念6
5.2.2Wpa_supplicant与驱动的交互6
6Wpa_cli调试工具7
6.1启动wpa_supplicant7
6.2连接wpa_cli到wpa_supplicant7
6.3示例8
6.3.1无密钥认证AP8
6.3.2WEP认证AP8
6.3.3WPA-PSK/WPA2-PSK认证AP8
6.3.4隐藏AP9
7Wifi模块解析和启动流程9
7.1框架分析9
7.2Wifi启动流程11
8WLAN驱动结构介绍22
8.1SDIO驱动22
8.2Boardcom无线通讯芯片23
8.2.1概述23
8.2.2源码23
8.3详细接口及代码分析24
8.3.1WIFI驱动流程分析24
8.3.2WIFI设备注册流程25
8.3.3WIFI驱动流程
(二)40
8.3.4网络设备注册流程43
9IOCTL的调用逻辑48
10数据的传送56
10.1数据传送过程简述56
10.2Bcm4329芯片wlan驱动数据传送57
10.3传输超时59
11数据的接收59
11.1数据接收的方式和过程59
11.2选择哪种接收模式60
11.3Bcm4329芯片wlan驱动数据传送60
12电源管理相关的调用逻辑65
13Android平台的Wifi模块移植要点74
13.1Wifi结构74
13.2Wifi模块环境75
13.3Wifi模块的编译75
13.3.1Wifi驱动源码75
13.3.2在android平台添加BCM43xx驱动75
13.3.3编译wifi驱动源码79
13.3.4在android中使用BCM43xx80
1WLAN技术
WLAN是英文WirelessLAN的缩写,就是无线局域网的意思。
无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活、建网迅速、个人化等特点。
将这一技术应用于电信网的接入网领域,能够方便、灵活地为用户提供网络接入,适合于用户流动性较大、有数据业务需求的公共场所、高端的企业及家庭用户、需要临时建网的场合以及难以采用有线接入方式的环境等。
2802.11协议简述
2.1.1概述
作为全球公认的局域网权威,IEEE802工作组建立的标准在过去二十年内在局域网领域独领风骚。
这些协议包括了802.3Ethernet协议、802.5TokenRing协议、802.3z100BASE-T快速以太网协议。
在1997年,经过了7年的工作以后,IEEE发布了802.11协议,这也是在无线局域网领域内的第一个国际上被认可的协议。
在1999年9月,他们又提出了802.11b"HighRate"协议,用来对802.11协议进行补充,802.11b在802.11的1Mbps和2Mbps速率下又增加了5.5Mbps和11Mbps两个新的网络吞吐速率。
利用802.11b,移动用户能够获得同Ethernet一样的性能、网络吞吐率、可用性。
这个基于标准的技术使得管理员可以根据环境选择合适的局域网技术来构造自己的网络,满足他们的商业用户和其他用户的需求。
802.11协议主要工作在ISO协议的最低两层上,并在物理层上进行了一些改动,加入了高速数字传输的特性和连接的稳定性。
主要内容:
1.802.11工作方式
2.802.11物理层
3.802.11b的增强物理层
4.802.11数字链路层
5.联合结构、蜂窝结构和漫游
3802.11四种主要物理组件
3.1工作站(Station)
构建网络的主要目的是为了在工作站间传送数据。
所谓工作站,是指配备无线网络接口的计算设备。
3.2接入点(AccessPoint)
802.11网络所使用的帧必须经过转换,方能被传递至其他不同类型的网络。
具备无线至有线的桥接功能的设备称为接入点,接入点的功能不仅于此,但桥接最为重要。
3.3无线媒介(WirelessMedium)
802.11标准以无线媒介在工作站之间传递帧。
其所定义的物理层不只是一种,802.11最初标准化了两种射频物理层以及一种红外线物理层。
3.4分布式系统(DistributionSystem)
当几个接入点串联以覆盖较大区域时,彼此之间必须相互通信以掌握移动式工作站的行踪。
分布式系统属于802.11的逻辑组件,负责将帧转送至目的地。
下图为802.11网络的基本服务集(basicserviceset),其中包含了这四种物理组件。
4WIFI适配层
里面定义很多字符串变量和适配层的接口实现,是对wpa_supplicant程序通信的接口封装,用来完成上层和wpa_supplicant的通信,头文件在libhardware/include/hardware下,这里的函数用来向JNI的本地实现提供调用接口。
这里的函数,我把它们分为四类函数:
一类是命令相关的(控制)函数,就是在JNI层android_XXX_Command()函数所调用的Wifi_Command()函数,调用流程如下:
android_XXX_command()=>docommand()=>wifi_command()=>wifi_send_command()=>wpa_ctrl_require()。
二类是监听函数,即Wifi_wait_for_event()函数,调用流程如下:
android_net_wifi_Waitforevent()=>wifi_wait_for_event()=>wpa_ctrl_recv()。
三就是WPA_SUPPLICANT的启动,连接,关闭函数
四是驱动的加载和卸载函数
5wpa_supplicant
5.1wpa_ctrl的作用
定义了两类套接字和一个管道,并分别实现了和wpa_supplicant的通信,而在实际的实现中采用的都是套接字的方式,因此wpa_supplicant适配层和wpa_supplicant层是通过socket通讯的。
要是从wifi.c中真的很难看出它和wpa_supplicant有什么关系,和它联系密切的就是这个wpa_ctrl.h文件,这里面定义了一个类wpa_ctrl,这个类中声明了两个Socket套接口,一个是本地一个是要连接的套接口,wpa_ctrl与wpa_supplicant的通信就需要socket来帮忙了,而wpa_supplicant就是通过调用wpa_ctrl.h中定义的函数和wpa_supplicant进行通讯的,wpa_ctrl类(其实是其中的两个socket)就是他们之间的桥梁。
5.2WPA_SUPPLICANT
5.2.1概念
wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。
简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。
5.2.2Wpa_supplicant与驱动的交互
5.2.2.1wpa_supplicant.c
首先定义一个驱动操作数组externstructwpa_driver_ops*wpa_supplicant_drivers[],然后是系列wpa_supplicant_XXX()函数,很多函数里面调用wpa_drv_XXX()函数,这些函数是wpa_supplicant_i.h中实现的函数。
几乎每个函数都需要一个wpa_supplicant结构,对其进行所有的控制和通信操作。
5.2.2.2Wpa_supplicant_i.h
其中定义了一个重要数据结构wpa_supplicant,其中有一个重要的driver成员,它是wpa_driver_ops类型,可以被用来调用抽象层的接口。
接下来是系列函数声明,这些函数声明在wpa_supplicant.c中实现,然后就是wpa_drv_XXX函数,这些函数就是在wpa_supplicant.c中被wpa_supplicant_xxx函数调用的,而这些wpa_drv_xxx函数也都有一个wpa_supplicant结构的变量指针,用来调用封装的抽象接口,而这些抽象接口的实现在driver_wext.c中(如果使用的汉斯WEXT驱动)。
这里要注意的是:
在wpa_suppliant.c文件中定义的很多函数是在该头文件中声明的,而不是在wpa_supplicant.h中声明的。
5.2.2.3Driver_wext.c
对wpa_drvier_ops的个函数的具体实现,该结构指针在wpa_supplicant注册一个网络接口时会被初始化赋予指定的操作指针,wpa_supplicant.c中的wpa_supplicant_xxx函数通过wpa_supplicant结构中的该操作指针调用WEXT的实现接口。
就是在该文件中,创建了三个socket:
ioctrl_socket,event_socket和mlme_socket,它们分别有自己的用途,如ioctrl_socket用于发送控制命令,event_socket用于监听驱动传来的event事件等。
Wpa_supplicant通过这三个socket与wifi驱动关联,这里的socket同fd(文件描述符)类似。
6Wpa_cli调试工具
6.1启动wpa_supplicant
使用下面命令启动wpa_supplicant:
wpa_supplicant-Dwext-iwlan0-C/data/system/wpa_supplicant-c/data/misc/wifi/wpa_supplicant.conf
为了确保wpa_supplicant真的启动起来了,使用“ps”命令查看。
6.2 连接wpa_cli到wpa_supplicant
wpa_cli-p/data/system/wpa_supplicant-iwlan0
然后,就可以使用wpa_cli调试工具进行wifi调试了,下面列出了一些常用的调试命令:
>scan//扫描周围的AP
>scan_results//显示扫描结果
>status//显示当前的连接状态信息
>terminate//终止wpa_supplicant
>quit//退出wpa_cli
>add_network//返回可用networkid
>set_network
>select_network
>disable_network
>enable_network
6.3示例
6.3.1无密钥认证AP
>add_network (返回可用networkid,假定返回0)
>set_network0ssid“666”
>set_network0key_mgmtNONE
>enable_network0
>quit
如果上面的操作正确,我们会连接到一个AP,它的SSID为“666”,现在需要一个IP来访问internet:
dhcpcdwlan0
成功获取IP后,即可连上internet。
6.3.2WEP认证AP
>add_network (假设返回1)
>set_network1ssid“666”
>set_network1key_mgmtNONE
>set_network1wep_key0“appasswork”
>set_network1wep_tx_keyidx0
>select_network1 (如果你已经连上了其它的AP,那么就需要这个命令来禁用其它的网络)
>enable_network1
然后同上获取IP,连接到internet上。
6.3.3WPA-PSK/WPA2-PSK认证AP
>add_network (假定返回2)
>set_network2ssid“666”
>set_network2psk“yourpre-sharedkey”
>select_network2
>enable_network2
还有其它的命令进一步设置网络,不过wpa_supplicant已经给了我们一些默认的配置。
6.3.4 隐藏AP
原则上应该只要在上面的基础上去set_networknetidscan_ssid1即可,测试过无加密的HiddenAP,WEP/WPA/WPA2应该道理一样。
7Wifi模块解析和启动流程
7.1框架分析
WIFI整体框架如图所示:
首先,用户程序使用WifiManager类来管理Wifi模块,它能够获得Wifi模块的状态,配置和控制Wifi模块,而所有这些操作都要依赖Wifiservice类来实现。
WifiService和WifiMonitor类是Wifi框架的核心,如图所示。
下面先来看看WifiService是什么时候,怎么被创建和初始化的。
在systemServer启动之后,它会创建一个ConnectivityServer对象,这个对象的构造函数会创建一个WifiService的实例,代码如下所示:
framework/base/services/java/com/android/server/ConnectivityService.java
{
……
caseConnectivityManager.TYPE_WIFI:
if(DBG)Slog.v(TAG,"StartingWifiService.");
WifiStateTrackerwst=newWifiStateTracker(context,mHandler); //创建WifiStateTracker实例
WifiServicewifiService=newWifiService(context,wst);//创建WifiService实例
ServiceManager.addService(Context.WIFI_SERVICE,wifiService); //向服务管理系统添加Wifi服务
wifiService.startWifi(); //启动Wifi
mNetTrackers[ConnectivityManager.TYPE_WIFI]=wst;
wst.startMonitoring();//启动WifiMonitor中的WifiThread线程
……
}
WifiService的主要工作:
WifiMonitor和Wpa_supplicant的启动和关闭,向Wpa_supplicant发送命令。
WifiMonitor的主要工作:
阻塞监听并接收来自Wpa_supplicant的消息,然后发送给WifiStateTracker。
上面两个线程通过AF_UNIX套接字和Wpa_supplicant通信,在通信过程中有两种连接方式:
控制连接和监听连接。
它们创建代码如下:
ctrl_conn=wpa_ctrl_open(ifname);
......
monitor_conn=wpa_ctrl_open(ifname);
7.2Wifi启动流程
(1)使能Wifi
要想使用Wifi模块,必须首先使能Wifi,当你第一次按下Wifi使能按钮时,WirelessSettings会实例化一个WifiEnabler对象,实例化代码如下:
packages/apps/settings/src/com/android/settings/WirelessSettings.java
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
……
CheckBoxPreferencewifi=(CheckBoxPreference)findPreference(KEY_TOGGLE_WIFI);
mWifiEnabler=newWifiEnabler(this,wifi);
……
}
WifiEnabler类的定义大致如下,它实现了一个监听接口,当WifiEnabler对象被初始化后,它监听到你按键的动作,会调用响应函数onPreferenceChange(),这个函数会调用WifiManager的setWifiEnabled()函数。
publicclassWifiEnablerimplementsPreference.OnPreferenceChangeListener{
……
publicbooleanonPreferenceChange(Preferencepreference,Objectvalue){
booleanenable=(Boolean)value;
……
if(mWifiManager.setWifiEnabled(enable)){
mCheckBox.setEnabled(false);
……
}
……
}
我们都知道Wifimanager只是个服务代理,所以它会调用WifiService的setWifiEnabled()函数,而这个函数会调用sendEnableMessage()函数,了解android消息处理机制的都知道,这个函数最终会给自己发送一个MESSAGE_ENABLE_WIFI的消息,被WifiService里面定义的handlermessage()函数处理,会调用setWifiEnabledBlocking()函数。
下面是调用流程:
mWifiEnabler.onpreferencechange()=>mWifiManage.setWifienabled()=>mWifiService.setWifiEnabled()=>mWifiService.sendEnableMessage()=>mWifiService.handleMessage()=>mWifiService.setWifiEnabledBlocking().
在setWifiEnabledBlocking()函数中主要做如下工作:
加载Wifi驱动,启动wpa_supplicant,注册广播接收器,启动WifiThread监听线程。
代码如下:
……
if(enable){
if(!
mWifiStateTracker.loadDriver()){
Slog.e(TAG,"FailedtoloadWi-Fidriver.");
setWifiEnabledState(WIFI_STATE_UNKNOWN,uid);
returnfalse;
}
if(!
mWifiStateTracker.startSupplicant()){
mWifiStateTracker.unloadDriver();
Slog.e(TAG,"Failedtostartsupplicantdaemon.");
setWifiEnabledState(WIFI_STATE_UNKNOWN,uid);
returnfalse;
}
registerForBroadcasts();
mWifiStateTracker.startEventLoop();
……
至此,Wifi使能结束,自动进入扫描阶段。
(2)扫描AP
当驱动加载成功后,如果配置文件的AP_SCAN=1,扫描会自动开始,WifiMonitor将会从supplicant收到一个消息EVENT_DRIVER_STATE_CHANGED,调用handleDriverEvent(),然后调用mWifiStateTracker.notifyDriverStarted(),该函数向消息队列添加EVENT_DRIVER_STATE_CHANGED,handlermessage()函数处理消息时调用scan()函数,并通过WifiNative将扫描命令发送到wpa_supplicant。
Frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java
privatevoid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Wifi 模块 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)