关闭

和菜鸟一起学android4.0.3源码之wifi的简单分析

10529人阅读 评论(24) 收藏 举报
分类:

 

关于wlan的组成

 

关于wifi应用层的接口的调用

        首先从上层android wifi的应用开始,首先会根据android的wifimanager的类,实例化一个mwifimanager的对象,这个对象处理了所有wifi需要处理的任务,接着比如说打开wifi,那么就会调用 mWifiManager.isWifiEnabled();判断wifi是否已经打开,如果没有打开,那么就会调用mWifiManager.setWifiEnabled(true);来打开wifi了。这里会调用到wifiservice的方法,就是设置wifi使能,mService.setWifiEnabled。然后该函数会继续调用wifi的状态机中的设置使能的方法mWifiStateMachine.setWifiEnabled,而在wifi状态机中,这个方法主要是往这个状态机中发了两条消息,CMD_LOAD_DRIVER,和CMD_START_SUPPLICANT。看其意思就可以知道是加载驱动和启动wpa_supplicant了。剩下就是wifi状态机里做的事情了,这个下面分析。还有其他的比如关闭wifi啊,扫描啊,连接网络啊,断开网络啊等等可以看下面的简单的流程图。具体的实现可以跟踪代码,就不一一介绍了。

 

 

关于wifi的framework层状态机

Wifi framework层的主要的状态机可以参见下面的图了。

 

       这里主要还是介绍下wifistatemachine的一些主要状态机的实现吧。

       初始状态是initial,所以一开始执行initial的enter(),由于我们平台中,我移植的时候是wifi的驱动编译进内核的,所以WifiNative.isDriverLoaded()函数必须是true的。接着状态就转换为transitionTo(mDriverLoadedState)。

驱动加载的状态了。在这里的processMessage就会处理消息了。结合上面APP在开启wifi的时候发送的消息,CMD_START_SUPPLICANT,所以这里会处理开启wpa_supplicant。接着会下载firmware

mNwService.wifiFirmwareReload(mInterfaceName,"STA");因为我们wifi驱动的firmware是驱动内部实现的,所以这里就不管他了。然后在WifiNative.startSupplicant();这里调用了hal层的,开启wpa_supplicant,具体下面分析。然后是mWifiMonitor.startMonitoring();开启一个monitor,主要还是处理wpa_supplicant往上报的事件的。接着,状态又转换了,就是

transitionTo(mSupplicantStartingState);

SupplicantStartingState状态了,这里如果wpa_supplicant启动成功的话,monitor那里上报一个WifiMonitor.SUP_CONNECTION_EVENT,接着就转换状态了,也就是transitionTo(mDriverStartedState);具体如下:

case WifiMonitor.SUP_CONNECTION_EVENT:

                    if (DBG)log("Supplicant connection established");

                   setWifiState(WIFI_STATE_ENABLED);

                    mSupplicantRestartCount =0;

                    /* Reset the supplicantstate to indicate the supplicant

                     * state is not known atthis time */

                   mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);

                   mWpsStateMachine.sendMessage(CMD_RESET_WPS_STATE);

                    /* Initialize datastructures */

                    mLastBssid = null;

                    mLastNetworkId =WifiConfiguration.INVALID_NETWORK_ID;

                    mLastSignalLevel = -1;

 

                   mWifiInfo.setMacAddress(WifiNative.getMacAddressCommand());

 

                    WifiConfigStore.initialize(mContext);

 

                   sendSupplicantConnectionChangedBroadcast(true);

                   transitionTo(mDriverStartedState);

 

这里在DriverStartedState状态下了。这里又做了很多处理:其中有一个CMD_START_SCAN,就是开始扫描。

对于状态机,下面画了大部分的状态图。


关于wifi的jni层

       Jni层主要是封装了很多的接口,可以让上层的JAVA代码来调用hal层的c或者c++代码。这里他把命令和一些控制都封装好了。其主要接口可以看下图。

 

关于wifi的hal层

Wifi的hal层主要就是上层jni会调用到wpa_supplicant的,具体如下图所示。

 

关于wpa_supplicant的总工作流程

 

 

关于wpa_supplicant的socket与hal通信的流程

 

       以上主要是以流程结合图形文字的方式简单的介绍了android的整个wifi的机制。具体可以结合代码分析。因为网上已经有很多的说明了,这里也不会太过分析。

 

关于wifi的linux驱动流程

        可以参见《和菜鸟一起学linux之wifi学习记录》。这里已经对sdio wifi数据流程等做了简单的分析了。。

       至此,对于android的整个wifi的机制,从宏观到微观做了简单的分析,相信基于这些,androidwifi的移植开发不再那么神秘而不可见了。

2
0
查看评论

wifi小车android手机控制端源码

  • 2015-01-17 12:59
  • 272KB
  • 下载

[RK3288][Android6.0] WiFi的Firmware和Nvram文件

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Wifi: AP6335概念: Firmware: WiFi芯片内部有一个小系统,用来运行802.11协议,此部分代码就叫Firmware。有些芯片(例如 broadcom)的Firmware...
  • kris_fei
  • kris_fei
  • 2017-08-07 09:44
  • 1310

和菜鸟一起学android4.0.3源码之wifi的简单分析

from: http://blog.csdn.net/eastmoon502136/article/details/8721510 关于wlan的组成   关于wifi应用层的接口的调用         首先从上层android wifi...
  • hanmengaidudu
  • hanmengaidudu
  • 2013-08-30 09:25
  • 723

和菜鸟一起学android4.0.3源码之wifi direct的简单分析(转载)

关于wifi direct Wifi direct的连接   下面的图表示的是wifi direct的发现过程。   整个过程可以见下图。 关于android上的wifi direct 首先上层通过调用p2p manager的接口来实现p2p的使...
  • haifeng2013
  • haifeng2013
  • 2013-08-02 16:14
  • 364

和菜鸟一起学android4.0.3源码之wifi direct的简单分析

转自:http://blog.csdn.net/eastmoon502136/article/details/8721724 关于wifi direct Wifi direct的连接   下面的图表示的是wifi direct的发现过程。   整个过程可以见下...
  • tony_hrwk
  • tony_hrwk
  • 2013-12-25 14:35
  • 690

和菜鸟一起学android4.0.3源码之wifi的简单分析 (转)

关于wlan的组成   关于wifi应用层的接口的调用         首先从上层android wifi的应用开始,首先会根据android的wifimanager的类,实例化一个mwifimanager的对象,这个对象处理了所有wifi...
  • haifeng2013
  • haifeng2013
  • 2013-08-02 16:38
  • 261

android4.0.3源码之wifi的简单分析

关于wlan的组成   关于wifi应用层的接口的调用         首先从上层android wifi的应用开始,首先会根据android的wifimanager的类,实例化一个mwifimanager的对象,这个对象处...
  • gjsisi
  • gjsisi
  • 2013-04-18 11:04
  • 818

和菜鸟一起学android4.0.3源码之红外遥控器适配

其实,这个是来到公司,做linux驱动的第一个任务,照理来说应该是要放在linux那块的,只是,linux下的红外遥控器很多,而网上关于android下的红外遥控一直都没有什么资料可以学习,仅记下来,为了温故知新。        ...
  • eastmoon502136
  • eastmoon502136
  • 2012-06-28 09:03
  • 12090

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

近几周一直在移植bluetooth和wifi,看书的时间也没,也没有时间思考一些问题,总结一些移植碰到的困难之类的。前天,终于蓝牙也可以传输文件,通过a2dp播放音乐了,wifi也可以扫描到网络,并可以连接了,因为平台中有本地的一个nfs挂载,所以要上外网,必须要sd卡启动才可以。  &...
  • hanmengaidudu
  • hanmengaidudu
  • 2013-12-10 19:04
  • 794

和菜鸟一起学android4.0.3源码之US…

一天又过去了,台风也走了有些时候了。想了想,自己还是冲动了一把,不该发那个邮件的,既然发了,也不后悔了。知道了所有也未必不是一件好事。恩,剩下的就好好做自己要做的事情吧。对于usb wifi,老早就在调试了,只是碰到了很多问题,加上其他的事情也迎面而来,从而导致很多的困难,也就搁置着了。上上周,工作...
  • shangyaowei
  • shangyaowei
  • 2013-12-19 20:54
  • 253
    个人资料
    • 访问:991997次
    • 积分:9861
    • 等级:
    • 排名:第2116名
    • 原创:186篇
    • 转载:0篇
    • 译文:1篇
    • 评论:510条
    个性签名
    别驻足,梦想要不停追逐;
    别认输,熬过黑夜才有日出。
    要记住,成功就在下一步;
    路很苦,汗水是最美的书!
    交流群

    群号:5685019

    博客专栏