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


    关于wifi direct

    Wifi direct的连接

     

    下面的图表示的是wifi direct的发现过程。

     

    整个过程可以见下图。


    关于android上的wifi direct

    首先上层通过调用p2p manager的接口来实现p2p的使能,扫描,连接,群组的创建等等的功能。具体接口如下。

     

    如上图所示,p2p的所有的处理都是在p2pservice中的p2pstatemachine中做处理的。具体的状态机的树形图如下所示:


      首先是P2pDisabledState,当使能后,也就是发送了WifiP2pManager.ENABLE_P2P,所以接着就调用了

    mWifiChannel.sendMessage(P2P_ENABLE_PENDING);

    transitionTo(mWaitForWifiDisableState);

     

    其中P2P_ENABLE_PENDING会调用到wifistatemachine中的

    caseWifiP2pService.P2P_ENABLE_PENDING:

            mReplyChannel.replyToMessage(message,P2P_ENABLE_PROCEED);

     

    会发回一个P2P_ENABLE_PROCEED的消息,接着状态转到WaitForWifiDisableState。所以他会处理case WifiStateMachine.P2P_ENABLE_PROCEED这条语句。执行

    if(WifiNative.startP2pSupplicant()) {

          mWifiMonitor.startMonitoring();

          transitionTo(mP2pEnablingState);

    }

    这里就开启了p2p和wpa_supplicant的调用,然后wifi的monitor用来监听wpa_supplicant上报的事件。接着状态转移到了P2pEnablingState,在这里,如果p2p开启成功的话,也就是与wpa_supplicant的通信成功的话,wpa_supplicant就会上报一个事件,然后执行下面的语句:

    caseWifiMonitor.SUP_CONNECTION_EVENT:

          logd("P2p start successful");

           transitionTo(mInactiveState);

           break;

    这里p2p就使能完成了,状态进入到了InactiveState了。这时,如果要创建群组的话,那么就会调用到了caseWifiP2pManager.CREATE_GROUP:接着

    if(WifiNative.p2pGroupAdd()) {

         replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED);

    transitionTo(mGroupNegotiationState);

    调用底层的p2p创建群组,然后状态转移到GroupNegotiationState 了。

           在P2pEnabledState,状态中,如果调用了DISCOVER_PEERS,就会调用

    case WifiP2pManager.DISCOVER_PEERS:这条语句,接着调用到底层去处理。

    if (WifiNative.p2pFind(timeout)) {

           replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_SUCCEEDED);

     }

    如果成功了,那么就返回一个成功的消息。在P2pHandler中的handleMessage就会处理返回的消息了。

    ((ActionListener)listener).onSuccess();

    具体的很多状态可以看下状态机的状态图。


    A去连接B:  

    A device:

    app层调用JAVA Manger的connect()函数(如果当前的设备不是p2p组的成员,那么这个函数就发送groupnegotiation请求;如果这个设备已经是p2p组的成员,或者自己创建了一个组通过createGroup(),那么这个函数就发送邀请请求),这个函数有个参数是WifiP2pConfig config,它包含了例如自己的MAC,用什么方式连接等一些信息。 通过JAVA Manger的中转,会到达JAVA Service层的P2pEnabledState状态下,这个状态下的处理函数收到WifiP2pManager.CONNECT后,通过调用 WifiNative.p2pConnect(mSavedConnectConfig, join),一层层往底层调用,调用会根据情况是否返回一个PIN。这样一个group negotiation请求就发送出去了。 如果返回PIN则通过

    notifyWpsPin(pin, mSavedConnectConfig.deviceAddress),会以AlertDialog的方式显示出来。 

    B device:

    JAVA Service层处在InactiveState状态下,收到了来自底层的 WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT消息,该消息表示有设备请求GO协商。 收到消息notifyP2pGoNegotationRequest(mSavedGoNegotiationConfig)函数被调用,该显示AlertDialog,用于用户同意或者取消GO 协商,如果对方是PIN方式,那么AlertDialog上面会有输入框显示,如果是PBC那么输入框就隐。

     

    关于jni下面的调用,与wifi的类似,这里就不多做讲解了。

          可以参见《和菜鸟一起学android4.0.3源码之wifi的简单分析》。

  • 相关阅读:
    JFreeChart(一)
    database link 使用<转>
    Hibernate注解配置N:N关联
    JFreeChart(二)
    struts2中<s:doubleselect/>标签的使用心得<原创>
    JSP引入JFreeChart
    struts2中<s:doubleselect/>标签的使用<转>
    Hibernate实体注解配制
    数据库事务隔离级别<转>
    tnsname.ora 个参数解释
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300009.html
Copyright © 2020-2023  润新知