和菜鸟一起学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的类似,这里就不多做讲解了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值