android 直连

Table of Contents

1 概述

1.1 简介

Wifi Direct 又叫p2p(peer to peer)连接,它支持多个Wifi设备在没有AP的情况下相互连接,它属于链路层。 在Android 平台的Wifi相关模块中, p2p的功能主要集中如下:

  • Framework中的WifiP2pService, 用于处理和P2P相关的工作。
  • wpa_supplicant中的P2P模块。
  • kernel driver(本文档不涉及)

1.2 适用范围

本文档提供给使用android5.1平台进行相关设计的客户及内部相关软件工程师。

2 背景知识

2.1 功能介绍

2010年10月,Wi-Fi Alliance(wi-fi联盟)发布Wi-Fi Direct白皮书,白皮书中介绍了有关于这种技术的基本信息、 特点和功能。Wi-Fi Direct标准是指允许无线网络中的设备无需通过无线路由器即可相互连接。与蓝牙技术类似,这种标 准允许无线设备以点对点形式互连,而且在传输速度与传输距离方面则比蓝牙有大幅提升。

按照定义,Wi-Fi CERTIFIEDWi-Fi Direct设备是支持对等连接的设备,这种设备既支持基础设施网络,也支持P2P连 接。Wi-Fi Direct设备能够作为典型的站点(STA)加入基础设施网络,而且必须支持Wi-Fi Protected Setup加入者功能。

Wi-Fi Direct设备通过组建小组(以一对一或一对多的拓扑形式)来建立连接,小组的工作形式与基础设施BSS类似。由一部 Wi-Fi Direct设备负责整个小组,包括控制哪部设备加入、小组何时启动和终止等。这种设备对于传统客户设备而言就是一部 接入点,能够提供基础设施接入点所提供的部分服务。

最初,Wi-Fi Alliance&reg联盟的这一新标准原名为“Wi-Fi peer-to-peer”,也即: Wi-Fi P2P,而最终定名为WiFi Direct,面向各种Wi-Fi设备,从电脑到手机到电脑外设到家电等等。符合该标准的设备无需热点和路由器, 就可以方便的和 其他设备实现直接连接,传输数据或共享应用。Wi-Fi Direct可以支持一对一直连,也可以实现多台设备同时连接,并且Wi-Fi Direct标准将会支持所有的Wi-Fi设备,从11a/b/g至11n,不同标准的Wi-Fi设备之间也可以直接互联。

2.2 特点

Wi-Fi Direct设备进一步拓展了Wi-Fi技术的覆盖范围,延伸至简单的直接连接,其连接效果与网线连接毫无二致。 其主 要特点如下:

  • 移动性与便携性:Wi-Fi Direct设备能够随时随地实现互相连接。由于不需要Wi-Fi路由器或接入点,因此Wi-Fi设备 可以在任何地点实现连接。
  • 易用性:Wi-Fi Direct设备发现(Device Discovery)与服务发现(Service Discovery)功能帮助用户确定可 用的设备与服务,然后建立连接。例如,如果用户想要打印文件,他们可以通过上述服务了解到哪个Wi-Fi网络拥有打印机。
  • 即时可用性:用户将得以利用带回家的第一部Wi-Fi Direct认证设备建立直接连接。例如,一部新购买的Wi-Fi Direct 笔记本可以与用户已有的传统Wi-Fi设备创建直接连接。
  • 简单而安全的连接:Wi-Fi Direct设备采用Wi-Fi Protected Setup™简化了在设备之间创建安全连接的过程。用户可 以按下任一设备上的按钮,也可以输入PIN码(即设备显示的PIN码),轻松创建安全连接。

2.3 优缺点

主要优点:传输速率高,兼容原有设备 主要缺点:耗电量高(较之蓝牙)

3 提供功能和服务

P2P主要包括三大功能:

  • P2P Discovery:提供一系列的方法去发现和快速连接P2P device
  • P2P Group Operation:类似BSS中STA和AP之间的功能
  • P2P Power Management

3.1 P2P Discovery

P2P Discovery的作用很简单, 就是使多个p2p device 能够互相发现并构建一个group。根据协议规范, 它包括四个主要子项:

  • Device Discovery: 用于 P2P 设备搜索周围其他支持 P2P 的设备。
  • Service Discovery:该 Device Discovery 基础上,P2P 还支持搜索指定的服务。这部分功能属于可选项.
  • Group Formation:用于决定两个 P2P Device 谁来扮演 GO,谁来扮演client.
  • P2P Invitation:用于激活一个 Persistent Group(见下文解释),或者用于邀请一个 Client 加入一个当前已存在的 Group。

P2P Device Discovery 的工作流程包含两个状态和两个阶段。先来看两个状态,它们分别是:

  • Search State:在该状态中,P2P Device 将在 2.4GHz 的 1,6,11 频段上分别发送 Probe Request 帧。这几个频段被称为 Social Channels。为了区别非 P2P 的 Probe Request 帧,P2P Device Discovery 要求必须在 ProbeRequest 帧中包 含 P2P IE。
  • Listen State:在该状态下,P2P Device 将随机选择在 1,6,11 频段中的一个频段(被选中的频段被称为 Listen Channel)监 听 Probe Request 帧并回复 Probe Response 帧。值得指出的是,Listen Channel 一旦选择好后,在整个 P2P Discovery 阶段就不能更改。另外,在这个阶段中, Device P2P只处理那些包含了 P2P IE 信息的 Probe Request 帧。

再来看两个阶段,它们分别是:

  • Scan Phase:扫描阶段。这一阶段和前面章节介绍的无线网络扫描一样,P2P Device 会在各个频段上发送 Probe Request 帧(主 动扫描)。P2PDevice 在这一阶段中不会处理来自其他设备的 Probe Request 帧。这一阶段过后,P2P Device 将进入下一个阶段, 即 Find Phase。
  • Find Phase:虽然从中文翻译来看,Scan 和 Find 意思比较接近,但 P2P的 Find Phase 却和 Scan Phase 大不相同。在这一阶 段中,P2P Device将在 Search State 和 Listen State 之间来回切换。Search State 中,P2P Device 将发送Probe Req- uest 帧,而 Listen State 中,它将接收其他设备的Probe Request 帧并回复 Probe Response 帧。

整个device discovery的工作流程,如下图所示:

My discovry

图3-1

主要以下问题:

  1. Legacy client(不支持P2P 的device) 只能发现P2P GO。
  2. P2P device关联上基础AP后,也同样还会处于listen state。如果p2p设备要求连接上所发现的设备,将做以下几点:
    • 发送P2P invitation request 帧给目标P2P设备.
    • 发送P2P invitation request 帧给先前建立的永久性p2p group的P2P GO.
    • 初始化GON(group owner negotiation) 以构成新的group.

4 P2P分析

4.1 总体架构分析

P2P模块是Wlan模块的一个子功能从上往下依次是APP, Framework, JNI,WPA_Supplicant和kernel driver 。Android 平台P2P模块总体架构图如下,其中APP层属于com.android.settings应用进程,Framework层对象有WifiP2pService.java 初始化创建,因此属于system_process进程,应用与Framework层通过AIDL Binder进程间通信机制。HAL层实现属于wpa_sup- plicant服务进程,Framework与之通过unix socket实现双向通信, wpa_supplicant通过nl80211中netlink方式跟kernel 相互间进行通讯。

My framework

图4-1

4.2 源文件说明

文件名 描述
WifiP2pService.java 和wifiService一样, 启动p2p状态机
WifiP2pServiceImpl.java 提供p2p状态机
WifiP2pSeting.java p2p UI显示
WifiMonitor.java 提供事件监听工作
WifiP2pManager.java p2p管理工作
wpa_supplicant.c wpa对外接口
p2p_supplicant.c p2p对外接口
scan.c scan相关功能接口
p2p.c p2p相关功能接口
events.c kernel事件上报接口

4.3 P2P Device name获取流程

设备名称获得主要分为下面几步:

  1. 开启 WifiP2pService服务,启动p2p 状态机。一共有18个状态, 初始状态为P2pDisabledState。
  2. wifi p2p 功能打开时,状态机处于P2pDisabledState状态,将会收到wifistatemachine DefaultState发送的消息:CMD_ENABLE_P2P。 启动monitor线程,连接supplicant,监听supplicant上报的消息并转换状态为P2pEnablingState。
  3. wifimonitor成功关联上supplicant将发送消息WifiMonitor.SUP_CONNECTION_EVENT,在状态P2pEnablingState处理了此消息,切换至状态InactiveState
  4. 由于InactiveState是P2pEnabledState的子状态,所以会先调用到P2pEnabledState的enter。
    • 发送广播WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION,用于通知WifiP2Psettings中P2P功能的启用情况。
    • 发送广播 WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION,用于通知WifiP2Psettings中P2P连接情况,携带参数WifiP2pInfo, NetworkInfo,WifiP2pGroup。
    • 本机设备初始化 initializeP2pSettings, 设置ssid名称,更新device 状态为AVAILABLE,发送广播 WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION给WifiP2Psettings。

过程如下图:

Name

图4-2

4.4 P2P搜索功能流程

点击搜索设备, 比较复杂,主要分为下面几步:

  1. APP(WifiP2pSettings.java)层调用startSearch()函数,它在调用frmaework的mWifiP2pManager.discoverPeers, 在discoverPeer 中最终调用mWifiNative.p2pFind。
  2. 然后hal层发送command”P2P_FIND “到wpa_supplicant,通过注册的socket接收并处理此命令。
  3. 在wpa_supplicant的wpas_p2p_find, 最终调用wpas_p2p_scan功能, 这个函数正是真正功能处理函数,主要如下:
    • 构造probe req ie WSC IE和构造P2P IE信息。
    • wpa_drv_scan 给kernel driver发送cmd: NL80211_CMD_TRIGGER_SCAN,如果是p2p_probe,还将带上NL80211_ATTR_SCAN_SUPP_RATES 属性值,设置P2P支持的rate,p2p不支持11b rate(1, 2, 5.5, 11)。
    • 设置P2P扫描结果处理函数 scan_res_handler为wpas_p2p_scan_res_handler。

整个设备搜索如下图所示:

Search

图5-1

4.4.1 扫描结果处理NL80211_CMD_NEW_SCAN_RESULTS

当nl80211像driver发送请求以后,等待对端回应,收到来自kernel wlan driver的NL80211_CMD_NEW_SCAN_RESULTS通知,返回wpa_scan_results 对象,调用wpas_p2p_scan_res_handler。

Results

图5-2

4.4.2 wpas_p2p_scan_res_handler

由于wpas_p2p_scan_res_handler比较复杂,我们还是单独说说吧, 它主要调用p2p_scan_res_handler和p2p_scan_res_handled函数

  1. p2p_scan_res_handler: 它中调用p2p_add_device解析IE信息,创建p2p_device对象,将其加入p2p->devices链表中,函数最后调用 wpas_dev_found,给wifimonitor上报消息P2P_EVENT_DEVICE_FOUND,并携带信息。
  2. p2p_scan_res_handled:进入find阶段的listen状态, 设置listen的通道,构造probe response帧的IE,启动wpas_start_listen 状态

如下图所示:

图5-3

4.5 P2P 连接过程

p2p连接分下面几个阶段:

  1. 通过下发cmd:P2P_STOP_FIND,停止find,切换状态为Provision Discovery阶段
  2. 在ProvisionDiscovery阶段,根据config中的wps.setup向hal层发送命令:P2P_PROV_DISC
  3. 进入GO 流程
  4. 进入associate和4way-handeshake阶段

4.5.1 Provision Discovery

整个过程主要是发送PD request帧和接收PD respone帧。

4.5.1.1 PD request

PD request帧最终将通过p2p_send_action函数发送出去,不过p2p_send_action并不简单, 它涉及off channel发送以及处理对应 netlink消息的过程。

图6-1

4.5.1.2 PD respone

当收到对端发来的PD Response帧后, 低层会发送cmd: NL80211_CMD_FRAME,然后proccess_bss_event函数将被调用, EVENT_RX_ACTION帧代表action帧, EVENT_RX_MGMT代表其他类型的管理帧,wpa_supplicant_event将调用wpas_p2p_rx_action,而wpas_p2p_rx_action又会调用p2p_rx_action, p2p_process_prov_disc_resp函数处理PD Response帧。

图6-2

4.5.2 GO Negotiation

4.5.2.1 GON request

低层发送P2P_PROV_DISC_PBC_RSP_EVENT消息,然后P2pStateMachine通过p2pConnectWithPinDisplay 向对端发送Group Negotiation Request请求。

图6-3

4.5.2 GON response

根据前面public Action帧处理逻辑的总入口函数 p2p_rx_p2p_action()当收到GON response 帧将在p2p_process_go_neg_resp 函数处理,该函数主要计算谁来伴演GO, 构造GON confirmation,发送GON confirmation action帧,发送以后wifi driver将向 WPAS发送一个NL80211_CMD_FRAME_RX_STATUS消息, 而该消息将导致nl80211 drvier发送 EVENT_TX_STATUS 消息,和P2P以及 event_tx_status相关的处理函数是 offchanelsend_action_tx_status。

图6-4

TODO 进入associate和4way-handeshake阶段

-   State "TODO" from "" <span class="timestamp-wrapper"> <span class="timestamp">2015-04-21 Tue 16:07</span></span>

这两个阶段和wlan0连接流程一样, 这里就不多说, 如果需要以后再加进来。

5 参考文档

《Wi-Fi_P2P_Technical_Specification_v1.5》

《802.11-2012》

《深入理解android wifi nfc and gps》

Date: 2015-04-13

Author: hujd

Org version 7.9.3f with Emacs version 24

Validate XHTML 1.0

JasonThink wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!