最新下载tp安卓版|wifip2p是什么意思

最新下载tp安卓版 2024-03-08 21:24:48

谈谈对WiFi P2P的理解_wifip2p是什么意思-CSDN博客

>

谈谈对WiFi P2P的理解_wifip2p是什么意思-CSDN博客

谈谈对WiFi P2P的理解

最新推荐文章于 2023-12-10 22:25:19 发布

SKY.D

最新推荐文章于 2023-12-10 22:25:19 发布

阅读量8k

收藏

56

点赞数

12

分类专栏:

WifiP2P

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_43932465/article/details/107769887

版权

WifiP2P

专栏收录该内容

0 篇文章

1 订阅

订阅专栏

谈谈对WiFi P2P的理解

概述P2P架构简介

P2P Discovery介绍Device Discovery 流程Service DiscoveryGroup FormationP2P Invitation

概述

Wifi peer-to-peer(也称Wifi-Direct)是Wifi联盟推出的一项基于原来WIfi技术的可以让设备与设备间直接连接的技术,使用户不需要借助局域网或者AP(Access Point)就可以进行一对一或一对多通信。这种技术的应用场景非常多,只要设备支持WiFiP2P的协议,就可以实现传文件,屏幕共享(Miracast),甚至是联机玩游戏,而周围没有任何可以上网的设备。

P2P架构简介

Wifi P2P架构中定义了3个组件,它们分别为: P2P Device: 支持Wifi P2P协议的设备,比如手机、电脑、平板等,它是以下角色的实体,没成为Group Owner或Group Client前的设备都是“P2P Device”。 P2P Group Owner: 简称GO,是协议中的一种角色,相当于AP,一个组里只有一个GO。 P2P Group Client: 简称GC,是另一种角色,一个组里可以有多个GC。

通过以上可知,Wifi P2P的拓扑结构是1:n的,其中多个GC连接一个GO,这样的一个结构可以称为一个组,如下图所示。

P2P Discovery介绍

P2P Discovery主要是让设备间快速发现和建立连接,在官方的规范中(Wi-Fi Peer-to-Peer (P2P) Technical Specification),它包含以下4项子技术:

Device Discovery 促使两个P2P设备到达一个公共信道并交换设备信息(例如设备名称和设备类型),即设备间的发现。Service Discovery 是一个可选功能,允许P2P设备在形成连接之前发现可用的更高层服务。Group Formation 用于协商哪个设备将要称为GO,并形成一个新的组。P2P Invitation 用于调用一个持久的P2P组( Persistent P2P)或邀请一个P2P设备加入一个已经存在的组。

Device Discovery 流程

设备发现流程利用了IEEE 802.11标准中的Probe Request和Probe Response帧来搜索周围的P2P设备,并且要求Probe Request帧中的数据必须包含P2P IE信息,否则不会响应。

设备发现流程分为Scan和Find两个阶段,其中Find阶段又分有Listen和Search两个状态,下面分别进行详细讲解。

Search State 搜索状态,在这个状态中,设备会分别向1、6、11频道发送包含P2P IE信息的Probe Request帧,这几个频段被称为Social Channels。

Listen State 监听状态,在这个状态中,设备会在1、6、11频段中随机选择一个进行监听,若收到带有P2P IE信息的Probe Request帧,则会发出Probe Response帧进行响应)。值得一提的是,设备一旦选择好监听的频段,则在整个发现流程中都不会改变。

Scan Phase 扫描阶段,P2P Device会向各个频段发送Probe Request帧,在这个阶段中,设备只发送而不会响应Probe Request帧,完成后进入下一阶段,即Find阶段。

Find Phase 发现阶段,从名字上看,发现和扫描差不多,但实际上它们的工作大不相同。在这个阶段中,设备会在Listen State和Search State两个状态之间来回切换。在Search State,设备发出Probe Request帧,而在Listen State,设备接收Probe Request帧并发出Probe Response帧进行响应。

注意 为什么选择1、6、11频段作为Social Channels,涉及到了物理层的知识,有兴趣的可以自己了解一下。另外,只有在同一频段上,设备间才能交换信息。

下图为Device Discovery的完整流程图。

通过上图可以了解Device Discovery的完整流程:

上层发送开始发现的命令后,设备首先会进入Scan阶段,向各个频段发送Probe Request帧。接着进入Find阶段的Listen状态,可以看到设备1和设备2的监听的频段并不相同(设备1监听channel 1,设备2监听channel 6),而且Listen状态的持续时间为100TU的随机整数倍,这个整数在minDiscoverableInterval和maxDiscoverableInterval之间,默认为1和3,而厂商可以修改这两个值。随机是为了避免设备同时进入Listen状态和Search状态,导致始终无法发现对方。接着切换到Search状态(设备1),分别向1、6、11频段发送Probe Request帧,因为设备2监听的是频段6,所以只能接收到设备1在频段6发出的Probe Request帧,并回复Probe Response帧,设备1收到Probe Response帧后,便通知上层成功发现设备。

Service Discovery

服务发现流程可在设备成功发现后的任何时间被执行,例如在成功发现设备后且在组形成之前。服务发现流程利用的是 Generic Advertisement Service(GAS)帧,类似与Probe Request和Probe Response帧,它也是IEEE 802.11定义的。这个协议具有很高的扩展性和灵活性,可发现不同的高层服务协议类型,比如Bonjour和UPnP协议。

服务发现的流程也很简单,跟设备发现流程相似,下图是设备成功发现后继而进行服务发现的流程。

通过服务发现流程,一台设备可以获得另一台设备的一下信息:

所有服务的列表单个服务的信息多个服务的信息服务信息是否发生变化

跟设备发现流程类似,服务发现流程也涉及到请求帧(Service Discovery Query frame)与响应帧(Service Discovery Response frame),这两个帧是GAS帧中的一个字段。设备发现网络的意图不同,请求帧与响应帧的字段也会不同,下面以请求帧为例。

意图TLV(Type-Length-Value)数量Service Protocol TypeQuery Data Length请求全部服务100请求单种类型的全部服务1表1的非0值0请求一个特定类型的一个特定服务1表1的非0值相应Query Data的长度请求多种类型的多个服务多个表1的非0值相应的Query Data的长度

解释: 在请求帧中,TLV是请求帧和响应帧的一个字段,包括Query Data Length、Service Protocol Type、Service Transaction ID和Query Data本身,如下图所示。

因此,如果设备A想请求设备B的UPnP类型的所有服务,则请求帧中只需包含一个TVL,且Length的值为0,Service Protocol Type的值为1。

Group Formation

完成设备发现之后,就可以进行组协商了。上面提到组协商的主要作用是决定哪个设备当GO,并创建一个新的组。整个协商过程包括三次握手,如下图所示。 可以看到GO Negotiation Request帧和GO Negotiation Response帧中包含了一个Group Owner Intent属性,这个属性代表设备成为GO的渴望程度,最大值为15(15表示该设备一定要成为GO)。设备间通过比较Group Owner Intent属性的值决定谁成为GO,规则如下。

当两个设备的Group Owner Intent属性的值不相等时,值大的成为GO。若两设备的值相等,则判断是否小于15,若小于15,Tie breaker bit是1的成为GO。若两设备的值都是15,说明两个设备都想要成为组员,则此次组协商失败。

P2P Invitation

P2P邀请流程是一个可选项,以下情况有可能会用到:

一个P2P GO邀请一个P2P Device作为GC加入组。一个P2P GC邀请一个P2P Device加入其所在的组,目的是为了使用P2P Device的一些服务。请求调用一个持久的P2P组,其中一个设备该组曾经的GO。

类似于设备发现和服务发现流程,邀请流程也涉及到P2P Invitation Request 帧与P2P Invitation Response帧。不同的情况,这些帧的内容也不同。以上面第一种情况为例,即一个P2P GO邀请一个P2P Device作为GC加入组。

P2P Invitation Request应包含P2P Group ID、P2P Group BSSID、信道列表、操作信道和配置超时属性,信道列表属性应指明P2P设备作为P2P组的操作信道可以支持的信道。操作信道和配置超时属性设置如下: 操作信道属性表明P2P组的工作信道;配置超时属性中的GO Configuration Timeout字段应设置为0。

P2P Invitation Response应包括信道列表和配置超时属性,信道列表指明了P2P客户端可以支持的操作信道。信道列表中的信道只能包含来自P2P邀请请求帧中Channel List属性的信道。Configuration Timeout属性应指示在P2P邀请响应指示成功后,P2P客户端准备加入P2P组所需的配置时间。在没有P2P设备通常支持的信道或者响应的P2P客户端不支持当前操作信道的情况下,P2P邀请响应帧应包括状态属性,状态码字段设置为“失败;没有公共信道”。

优惠劵

SKY.D

关注

关注

12

点赞

56

收藏

觉得还不错?

一键收藏

知道了

0

评论

谈谈对WiFi P2P的理解

谈谈对WiFi P2P的理解概述P2P架构简介P2P Discovery介绍Device Discovery 流程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入概述Wifi peer-to-peer(也称Wifi-Di

复制链接

扫一扫

专栏目录

wifi p2p specification

03-23

wifi p2p specification, 这版比较相对较新,网上不太容易找到

wifi P2P 自己总结的文档

02-25

自己总结的WIFI P2P 的基础知识和组网流程,涵盖了P2P各种知识,有一些图也可以参考,适合新手下载学习

参与评论

您还未登录,请先

登录

后发表或查看评论

WIFI直连(Wi-Fi P2P)

Eric.Xi

12-10

902

Wifi peer-to-peer(也称Wifi-Direct)是Wifi联盟推出的一项基于原来WIfi技术的可以让设备与设备间直接连接的技术,使用户不需要借助局域网或者AP(Access Point)就可以进行一对一或一对多通信。这种技术的应用场景非常多,只要设备支持WiFiP2P的协议,就可以实现传文件,屏幕共享(Miracast),甚至是联机玩游戏,而周围没有任何可以上网的设备。

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。

热门推荐

唯爱丶卡卡西的博客

09-05

2万+

产品:你给我调研一个手机连上无网WIFI 后能继续使用手机流量的 需求。WIFI不能自动跳转和改变,(WIFI和移动流量必须同时开启)。

程序员:?????纳尼??2333333~

WifiP2p点对点连接的详解

weixin_34023863的博客

12-04

2325

一.WifiP2p的描述wifiP2p是不需要联网的,只需要手机打开wlan就可以连接通信的;底部的通信原理是Binder通信二.WifiP2p的操作流程 1.权限申请 2.设置广播,用来获取WIfiP2p各种变化时候的信息 3.获取WifiP2pManager和WifiP2pManager.channel 4.开启扫描,两台手机都需要开启扫描 5.通过广播的回调获取到搜索的手...

Android Wifi P2P 入门

阿杜

06-05

7487

Demo 下载地址:https://github.com/mengzhinan/WiFi_P2P_test

Part 1 前序:

以前和朋友一起研究过 Wifi P2P ,后来时间拉长就忘记了。近期迫于寻找一个独特的技术点分享,不得又重新回顾 P2P 了。

上面有我学习的 Demo 连接,大佬可以下载参考,

或 GoogleAndroid Doc:https://developer.android.google.cn/guide/topics/connectivity/wifip2p

Par.

WiFi Direct即P2P协议学习笔记

Lizune

04-24

1万+

文章目录前言一、P2P的模型1.1 P2P的组成1.2 P2P的拓扑1.3 P2P并发模式1.4 功能和服务1.4.1 基本功能和服务1.4.2 P2P的特殊功能和服务1.4.3 P2P的两种地址二、P2P discovery阶段2.1 介绍2.2 P2P设备Discovery过程2.3

前言

在WiFi直连(WiFi Direct,也称为peer-to-peer,P2P)中,设备可以不通过AP(Access Point)进行连接。在P2P group中,称为GO(Group Owner)的设备具有像A

WIFI P2P架构

htt789的博客

03-10

1774

WIFI P2P架构

Android WiFi P2P数据传输

特立独行的博客

06-20

2056

WiFi Direct或WiFi P2P(Peer-to-Peer,点对点)是一种无线通信技术,允许设备之间直接进行点对点通信,而不需要连接到一个公共的网络中。使用WiFi P2P,设备可以发现彼此的存在并建立直接连接,这些连接可以是临时性的或长期的,这取决于应用程序需要的特定使用场景。使用WiFi P2P,可以实现像文件共享、多人游戏、流媒体传输等功能。在Android中,WiFi P2P可通过WifiP2pManager类和WifiP2pDevice类等API进行实现。

WIFI P2P原理深入解析

baidu_33512336的博客

09-03

8810

前言

关于Wi-Fi联盟推出的另外一项重要技术规范WiFi P2P。 该规范的商品名为Wi-Fi Direct, 它支持多个Wi-Fi设备在没有AP的情况下相互连接.

在Android平台的Wi-Fi相关模块中, P2P的功能点主要集中在:

Android Framework中的WifiP2pService, 其功能和WifiService类似, 用于处理和P2P相关的工作。

wpa_supplicant中的P2P模块。

P2P基础知识

Wi-Fi P2P技术是Wi-Fi Displ...

深入理解Wi-Fi P2P

Android framework

05-08

2501

第7章 深入理解Wi-Fi P2P

本章所涉及的源代码文件名及位置

·W ifiP2pSettings.java

packages/ apps/ Settings/ src/ com/ android/ settings/ wifi/ p2p/ W ifiP2pSettings.java

·W ifiP2pService.java

frameworks/ base/ wifi/ java/ android/ net/ wifi/ p2p/ W ifiP2pService.java

·p2p_supplica

Wifi p2p.zip

08-12

Wifi Direct P2P , 直连做wifi设备点对点 ,不需要网络打开wifi就可以查找附近设备, 分享文件

深入理解Wi-Fi-P2P

02-11

在Android平台的Wi-Fi相关模块中,P2P的功能点主要集中在:

• Android Framework中的WifiP2pService,其功能和WifiService类似,用于处理和P2P相关的工作。

• wpa_supplicant中的P2P模块。

和WSC一样,本章的分析拟采用如下方法:

• 首先将介绍P2P所涉及的基础知识。

• 然后再分析和P2P相关的模块,包括Settings、WifiP2pService以及WPAS。

安卓Android 通过wifi进行p2p通讯和文件传送

03-20

android 4.0以上通过wifi进行通讯,不需要服务器,点对点技术,适合局域网聊天,或者局域网游戏的开发

也可以做手机对手机传送apk ,传送文件,类似快牙之类的应用

技术点:wifi direct

windows内核反附加

最新发布

03-05

Windows内核反附加技术是一种深度防御安全机制,针对恶意代码通过驱动层对系统进行非法操控的防护手段。它通过强化内核模块的安全检测与加载机制,有效防止了未知恶意驱动的偷偷附加和执行,从而有力地保障了系统的稳定性和安全性。这一关键技术对于构建坚如磐石的操作系统内核防线,提升整体系统防护能力具有重大价值,尤其在对抗高级持续性威胁(APT)方面表现出色,是现代操作系统安全架构不可或缺的重要组成部分。

基于springboot+vue的的毕业设计系统的开发(Java毕业设计,附源码,数据库).zip

03-05

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

基于springboot+vue的秒杀系统设计与实现(Java毕业设计,附源码,数据库).zip

03-05

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

毕业设计,微信小程序+SSM后端+MySql开发的个人日程安排小程序,内含完整源代码,数据库脚本,任务书,论文视频,视频教程

03-05

毕业设计,微信小程序+SSM后端+MySql开发的个人日程安排小程序,内含完整源代码,数据库脚本,任务书,论文视频,视频教程

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人日程安排微信小程序的开发全过程。通过分析个人日程安排微信小程序管理的不足,创建了一个计算机管理个人日程安排微信小程序的方案。文章介绍了个人日程安排微信小程序的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。

本个人日程安排微信小程序管理员功能有个人中心,用户管理,重要日管理,工作日程管理,会面管理,用餐管理,日程管理,系统管理等。用户可以写自己的相关信息。因而具有一定的实用性。

本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得个人日程安排微信小程序管理工作系统化、规范化。

关键词:个人日程安排微信小程序;SSM框架;MYSQL数据库

01、从0开始深入理解并发、线程与等待通知机制(上

03-05

01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上

python WiFi p2p

07-28

如果你想在Python中实现Wi-Fi P2P(Peer-to-Peer)功能,可以使用第三方库来实现。一个常用的库是`wifi-direct`,它提供了一些用于管理Wi-Fi P2P连接的功能。

首先,你需要安装`wifi-direct`库。可以使用pip命令来安装:

```

pip install wifi-direct

```

安装完成后,你可以使用以下示例代码来扫描附近的Wi-Fi P2P设备,并获取它们的信息:

```python

import wifi_direct

p2p_devices = wifi_direct.scan()

for device in p2p_devices:

print(device.name)

print(device.address)

```

这是一个简单的示例,它将扫描附近的Wi-Fi P2P设备并打印出它们的名称和地址。你可以根据需要进行进一步的操作,比如连接到指定的设备、发送文件等。

请注意,Wi-Fi P2P功能在不同的操作系统和设备上可能有所不同,因此具体的实现可能会因环境而异。你可能需要进一步研究和了解特定平台上的Wi-Fi P2P支持,并相应地调整代码。

希望这能帮助到你!如果还有其他问题,请随时提问。

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

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

SKY.D

博客等级

码龄5年

10

原创

13

点赞

66

收藏

8

粉丝

关注

私信

热门文章

谈谈对WiFi P2P的理解

8007

深入理解Android绘图中的PorterDuffXfermode

717

java多线程环境下数据结构的安全问题

617

Android多线程的使用方式

411

MVC MVP MVVM总结

344

分类专栏

Binder机制

1篇

WifiP2P

最新评论

深入理解Android绘图中的PorterDuffXfermode

weixin_43889165:

,楼主真乃神人也。

深入理解Android绘图中的PorterDuffXfermode

陈壮实的搬砖生活:

卧槽,楼主第一次写博文就这么好,太强了吧

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Binder机制学习总结

java和Android常见的内存泄漏与解决方案

View的绘制流程学习总结

2021年1篇

2020年1篇

2019年8篇

目录

目录

分类专栏

Binder机制

1篇

WifiP2P

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

深入理解Wi-Fi P2P - 简书

Wi-Fi P2P - 简书登录注册写文章首页下载APP会员IT技术深入理解Wi-Fi P2P傀儡世界关注赞赏支持深入理解Wi-Fi P2P概述

介绍Wi-Fi联盟推出的另外一项重要技术规范WiFi P2P。 该规范的商品名为Wi-Fi Direct, 它支持多个Wi-Fi设备在没有AP的情况下相互连接.

在Android平台的Wi-Fi相关模块中, P2P的功能点主要集中在:

· Android Framework中的WifiP2pService, 其功能和WifiService类似, 用于处理

和P2P相关的工作。

· wpa_supplicant中的P2P模块。

P2P基础知识

Wi-Fi P2P技术是Wi-Fi Display 的基础。

http://blog.csdn.net/innost/article/details/8474683

P2P架构

P2P架构中定义了三个组件, 笔者将其称为“ 一个设备, 两种角色” , 分别如下

P2P Device: 它是P2P架构中角色的实体, 可把它当做一个Wi-Fi设备

P2P Group Owner: Group Owner( GO) 是一种角色, 其作用类似于Infrastructure BSS中的AP

P2P Client: 另外一种角色, 其作用类似于Infrastructure BSS中的STA

组建P2P Group( 即P2P Network) 之前, 智能终端都是一个一个的

P2P Device。 当这些P2P Device设备之间完成P2P协商后, 其中将有一个并且只能有一个Device来扮演GO的角色( 即充当AP) , 而其他Device来扮演Client的角色

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

1.Device Discovery介绍

P2P Device Discovery虽然也是利用802.11中的Probe Request和Probe Response

帧来搜索周围的P2P设备

为了加快搜索速度, P2P为Device Discovery定义了两个状态和两个阶段。

( 1) Device Discovery工作流程

先来看两个状态, 分别如下。

· Search State: 在该状态中, P2P Device将在2.4GHz的1, 6, 11频段上分别发送Probe Request帧。 这几个频段称为Social Channels。 为了区别非P2P的Probe Request帧, P2P Device Discovery要求必须在Probe Request帧中包含P2P IE。

· Listen State: 在该状态中, P2P Device将随机选择在1, 6, 11频段中的一个频段( 被选中的频段称为Listen Channel) 监听Probe Request帧并回复Probe Response帧。 值得指出的是, Listen Channel一旦选择好后, 在整个P2P Discovery阶段就不能更改。 另外, 在这个阶段中, P2P Device只处理包含P2P IE信息的Probe Request帧

再来看两个阶段, 分别如下。

·** Scan Phase**: 扫描阶段。 这一阶段和前面章节介绍的无线网络扫描一样, P2P

Device会在各个频段上发送Probe Request帧( 主动扫描) 。 P2P Device在这一阶段中不会处理来自其他设备的Probe Request帧。 这一阶段过后, P2P Device将进入下一个阶段, 即Find Phase。

· Find Phase: 虽然从中文翻译来看, Scan和Find意思比较接近, 但P2P的Find

Phase却和Scan Phase大不相同。 在这一阶段中, P2P Device将在Search State和ListenState之间来回切换。 Search State中, P2P Device将发送Probe Request帧, 而ListenState中, 它将接收其他设备的Probe Request帧并回复Probe Response帧

两个P2P Device的Discovery流程:

· Discovery启动后, Device首先进入Scan Phase。 在这一阶段, P2P设备在其支持的所有频段上都会发送Probe Request帧。

· Scan Phase完成后, Device进入Find Phase。 在这一阶段中, Device将在Listen和Search State中切换。

当Device处于Find Phase中的Search State时, 它将在1、 6、 11频段上发送Probe

Request帧。 注意, 只有当两个设备处于同一频段时, 一方发送的帧才能被对方接收到

P2P规范中对Probe Request帧的要求

· SSID IE必须设置为P2P Wildcard SSID, 即"DIRECT-"。

· 必须包含P2P IE。

· 802.11 MAC帧头的地址域① 中, Destination Address域( Address1) 必须为广播

地址( FF: FF: FF: FF: FF: FF) 或者为目标设备的P2P Device Address , BSSID域( Address3) 必须为广播地址

(P2P规范定义了两种类型的地址, 一种是P2P Device Address, 另外一种

是P2P Interface Address。 一个P2P Device在加入P2P Group前, 将使用Device Address开展Device Discovery等工作。 对一个P2P Device而言, 其P2P Device Address是唯一的( 作用等同于MAC地址) 。 而当P2P Device加入P2P Group后, 它和Group中其他成员交互时将使用P2P Interface Address。 另外, 由于一个P2P Device可同时加入多个P2P Group, 所以在每个P2P Group中, 该设备必须使用不同的P2P Interface Address。 最后, 当一个Group结束后, Device在该Group中使用的P2PInterface Address也就相应作废了)

Probe Response帧

P2P Probe Response帧包含WSC IE和P2P IE

2.Group Formation介绍

当P2P Device A通过Device Discovery找到周围的一个P2P Device B后, Device A

就可以开展Group Formation流程以准备构造一个P2P Group。 Group Formation也包含

两个阶段, 分别如下。

· GO Negotiation: 在这一阶段中, 两个Device要协商好由谁来做GO。

· Provisioning: GO和Client角色确定后, 两个Device要借助WSC来交换安全配置

信息。 此后, Client就可以利用安全配置信息关联上GO。

GO Negotiation过程中P2P设备会利用一种名为P2P Public Action类型的帧交换信

( 1) P2P Public Action帧

GO Negotiation流程, 包含三次P2P Public Action帧交换

GO Negotiation( 以后简称GON) 流程包括GON Request、 GON

Response和GON Confirmation三次帧交换。 这三次帧交换并不涉及什么复杂的计算, 只

是双方交换一些信息, 从而谁来扮演GO

P2P Public Action帧中还存在着"Provision Discovery Request/Response"类型的帧,P2P规范定义了Provision Discovery( PD) 流程, 该流程就是为了确定交互双方使用的WSC方法

WifiP2pService介绍

WifiP2pSettings是Settings应用中负责处理P2P相关UI/UE逻辑的主要类, 与之交互

的则是位于SystemServer进程中的WifiP2pService

WifiP2pService工作流程

WifiService处理和WLAN网络连接相关的工作, 而WifiP2pService则专门负责处理和Wi-Fi P2P相关的工作

#######P2pStateMachine是WifiP2pService的核心

Paste_Image.png

1.CMD_ENABLE_P2P处理流程

1.1WifiStateMachine将创建一个名为mWifiP2pChannel的AsyncChannel对象用于向P2pStateMachine发送消息

1.2在Android平台中, 如果用户打开Wi-Fi功能, P2pStateMachine就会收到第一个消息CMD_ENABLE_P2P。 该消息是WifiStateMachine进入DriverStartedState后, 在其EA中借助mWifiP2pChannel向P2pStateMachine发送的.(P2pDisabledState: enter)

1.3处理完CMD_ENABLE_P2P消息后, P2pStateMachine将创建一个WifiMonitor用于接收来自wpa_supplicant的消息, 同时状态机将转入P2pEnablingState.

1.4WifiMonitor连接wpa_supplicant之后, WifiMonitor会发送一个SUP_CONNECTION_EVENT给P2pStateMachine。 该消息将由P2pEnablingState处理

2.SUP_CONNECTION_EVENT处理流程

WifiP2pService.java: : P2pEnablingState: processMessage

2.1.当状态机转入InactiveState后, 首先执行的是其父状态P2pEnabledState的EA, 然后才是InactiveState自己的EA.

WifiP2pService.java: : P2pEnabledState: enter

2.2.P2pStateMachine就算初始化完毕, 接下来的工作就是处理用户发起的操作

3.DISCOVER_PEERS处理流程

用户在界面中进行操作以搜索周围的设备,WifiP2pSettings中WifiP2pManager的discoverPeers函数, 它将发送DISCOVER_PEERS消息给P2pStateMachine

3.1.P2pStateMachine当前处于InactiveState, 不过DISCOVER_PEERS消息却是由其父状态P2pEnabledState来处理的

3.2.当WPAS搜索到周围的P2P Device后, 将发送以下格式的消息给WifiMonitor。

Paste_Image.png

3.3.WifiMonitor将根据这些信息构建一个WifiP2pDevice对象, 然后发送

P2P_DEVICE_FOUND_EVENT给P2pStateMachine

4.P2P_DEVICE_FOUND_EVENT处理流程

P2P_DEVICE_FOUND_EVENT也由InactiveState的父状态P2pEnabledState来处理

5.CONNECT处理流程

5.1.当用户在WifiP2pSettings界面中选择连接某个P2P Device后,WifiP2pManager的connect函数将发送CONNECT消息给P2pStateMachine, 该消息由InactiveState状态自己来处理

WifiP2pSettings.java: : InactiveState: processMessage

WifiP2pService.java: : connect

5.2.connect将返回NEEDS_PROVISON_REQ, 所以P2pStateMachine将

转入ProvisionDiscoveryState

WifiP2pService.java: : ProvisionDiscoveryState: enter

5.3.由于WSC配置方法为PBC, 所以对端设备的P2pStateMachine将收到一个

P2P_PROV_DISC_PBC_REQ_EVENT消息。 当对端设备处理完毕后, 将收到一个P2P_PROV_DISC_PBC_RSP_EVENT消息

6.P2P_PROV_DISC_PBC_RSP_EVENT处理流程

6.1.P2pStateMachine当前处于ProvisionDiscoveryState

WifiP2pService.java: : ProvisionDiscoveryState: processMessage

6.2.P2pStateMachine通过p2pConnectWithPinDisplay向对端发起Group

Negotiation Request请求。 接下来的工作就由WPAS来处理。 当Group Formation结束后, P2pStateMachine将收到一个P2P_GROUP_STARTED_EVENT消息以通知Group建立完毕

7.P2P_GROUP_STARTED_EVENT处理流程

7.1.P2P_GROUP_STARTED_EVENT消息由GroupNegotiationState处理

WifiP2pService.java: : GroupNegotiationState: processMessage

7.2.P2pStateMachine将转入GroupCreatedState

WifiP2pService.java: : GroupCreatedState: enter

8.AP_STA_CONNECTED_EVENT处理流程

8.1.当对端P2P设备成功关联到本机后, WifiMonitor又将发送一个名为

AP_STA_CONNECTED_EVENT的消息

WifiP2pService.java: : GroupCreatedState: processMessage

8.2.至此, 一个P2P Device( 扮演Client) 就成功关联上本机的P2P Device( 扮演GO)

wpa_supplicant中的P2P

wpa_supplicant进程由WifiStateMachine启动.

手机厂商会为WifiService和WifiP2pService各创建一个wpa_supplicant进程, 使得它们能各司其职而互不干扰。 WifiService将和wpa_supplicant进程交互, 而WifiP2pService将和一个名为p2p_supplicant

p2p_supplicant使用的配置文件名为/data/misc/wifi/p2p_supplicant.conf

p2p_supplicant对应的ctrl_iface路径为/data/misc/wifi/sockets。 所以, 如果要使用wpa_cli和p2p_supplicant交互, 必须指定正确的ctrl_iface路径

P2P模块初始化

p2p_supplicant.c: : wpas_p2p_init

· 初始化一个p2p_config对象, 然后根据p2p_supplicant.conf文件的信息来设置其中的内容, 同时还需要为P2P模块设置一些回调函数。

· 调用p2p_init函数以初始化P2P模块

1.Driver Flags和重要数据结构

drv_flags变量, WPAS中, Wi-Fi驱动对P2P功能的支持情况就是由它来表达的

· p2p_config定义了20个回调函数。 这些回调函数定义了P2P模块和外界交互的接口。 在wpas_p2p_init中, 这些回调函数均指向p2p_supplicant.c中对应的函数, 例如p2p_scan指向wpas_p2p_scan, dev_lost指向wpas_dev_lost

· p2p_data指向一个p2p_config对象。

· p2p_device代表一个P2P设备。 其中设备名、 Device CapabilityBitmap等信息保存在一个类型为p2p_peer_info的对象中。

· p2p_group代表一个P2P Group的信息, 其内部包含一个p2p_group_config对象和一个p2p_group_member链表。 p2p_group_config表示该Group的配置信

息, p2p_group_member代表Group Member即P2P Client的信息

2.p2p_init函数

p2p.c: : p2p_init

3.注册Action帧监听事件

driver_nl80211.c: : wpa_driver_nl80211_set_mode

3.1nl80211_mgmt_subscribte_non_ap将注册对Action帧的监听事件, 其作用就是当设备收到Action帧后, Wi-Fi驱动将发送对应的netlink消息给WPAS

driver_nl80211.c: : nl80211_mgmt_subscribte_non_ap

3.2.注册了两种类型的帧监

听事件。

· P2P Public Action帧监听事件: 根据P2P规范, 目前使用的均是802.11 PublicAction帧, 即Category的值为0x04。 目前GON、 P2P Invitation、 Provision Discovery以及Device Discoverability使用P2P Public Action帧。

· P2P Action帧监听事件: 这种类型的帧属于802.11 Action帧的一种, 其Category取值为0x7F, OUI指定为WFA的OUI( 即50-6F-9A) , 而OUI-Type指定为P2P( 取值为0x09) 。 目前Notice of Absence、 P2P Presence、 GO Discoverability使用P2PAction帧。

上述注册的Action帧监听事件对应的处理函数是process_bss_event

3.3.至此, P2P模块以及Action帧监听事件注册等工作都已完成, WPAS马上可为WifiP2pService提供P2P相关的服务了

P2P Device Discovery流程分析

P2pStateMachine将发送"P2P_FIND 120"命令给WPAS以触发P2P Device Discovery流程

ctrl_iface.c: : wpa_supplicant_ctrl_iface_process

ctrl_iface.c: : p2p_ctrl_find

P2P_FIND支持三种不同的Discovery Type

· P2P_FIND_START_WITH_FULL: 默认设置。 表示先扫描所有频段, 然后再扫描social channels。 这种搜索方式如图7-3所示。

· P2P_FIND_ONLY_SOCIAL: 只扫描social channels。 它将跳过“ 扫描所有频段” 这一过程。 这种搜索方式能加快搜索的速度。

· P2P_FIND_PROGRESSIVE: 它和P2P_FIND_START_WITH_FULL类似, 只不过在Search State阶段将逐个扫描所有频段

1.P2P设备扫描流程

P2P设备扫描流程从wpas_p2p_find开始

p2p_supplicant.c: : wpas_p2p_find

p2p.c: : p2p_find

p2p_supplicant.c: : wpas_p2p_scan

Paste_Image.png

2.P2P设备扫描结果处理流程

当scan_res_handler不为空的时候, 扫描结果将交给scan_res_handler来处理

对P2P设备扫描时将设置scan_res_handler为wpas_p2p_scan_res_handler

p2p_supplicant.c: : wpas_p2p_scan_res_handler

Paste_Image.png

Provision Discovery流程分析

P2pStateMachine的ProvisionDiscoveryState在其EA中将发送形如"P2P_PROV_DISC 8a: 32: 9b: 6c: d1: 80 pbc"的命令给WPAS 去执行, 其核心处理函数是p2p_ctrl_prov_disc

1.PD Request帧发送流程

p2p.c: : p2p_prov_disc_req

p2p_pd.c: : p2p_send_prov_disc_req

Paste_Image.png

2.Action帧接收流程

PD Response帧属于Public Action帧的一种, 当收到对端设备发来的PD Response帧后, process_bss_event函数将被调用

Paste_Image.png

3.PD Response帧处理流程

p2p_pd.c: : p2p_process_prov_disc_resp

p2p_supplicant.c: : wpas_prov_disc_resp

wpa_msg将发送P2P_EVENT_PROV_DISC_PBC_RESP( 字符串, 值为"P2P-PROV-DISC-PBCRESP") 消息给客户端

GO Negotiation流程分析

P2pStateMachine收到P2P_PROV_DISC_PBC_RSP_EVENT消息后, 将在

ProvisionDiscoveryState中调用p2pConnectWithPinDisplay, 该函数内部将发送P2P_CONNECT命令给WPAS

1.P2P_CONNECT处理流程

ctrl_iface.c: : p2p_ctrl_connect

p2p_supplicant.c: : wpas_p2p_connect

2.GON Request发送流程

p2p.c: : p2p_connect

p2p_go_neg.c: : p2p_connect_send

Paste_Image.png

3.GON Response帧处理流程

p2p_go_neg.c: : p2p_process_go_neg_resp

当GON Confirmation帧发送出去后, wifi driver将向WPAS发送一个NL80211_CMD_FRAME_TX_STATUS消息, 而该消息将导致driver wrapper发送EVENT_TX_STATUS消息给WPAS

4.EVENT_TX_STATUS处理流程

在events.c中, 和P2P以及EVENT_TX_STATUS相关的处理函数是offchannel_send_action_tx_status

offchannel.c: : offchannel_send_action_tx_status

Paste_Image.png

当Group Negotiation完成后, WPAS将新创建一个wpa_supplicant对象, 它将用于管理和操作专门用于P2P Group的virtual interface

· 一个interface对应一个wpa_supplicant对象。

· 此处新创建的wpa_supplicant对象用于GO, 即扮演AP的角色, 专门处理和P2PGroup相关的事情, 其MAC地址为P2P Interface Address。

· 之前使用的wpa_supplicant用于非P2P Group操作, 其MAC地址为P2P DeviceAddress

最后编辑于 :2017.12.05 21:05:57©著作权归作者所有,转载或内容合作请联系作者人面猴序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...沈念sama阅读 145,651评论 1赞 308死咒序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...沈念sama阅读 62,308评论 1赞 259救了他两次的神仙让他今天三更去死文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...开封第一讲书人阅读 96,650评论 0赞 214道士缉凶录:失踪的卖姜人 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...开封第一讲书人阅读 41,550评论 0赞 184港岛之恋(遗憾婚礼)正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...茶点故事阅读 49,419评论 1赞 262恶毒庶女顶嫁案:这布局不是一般人想出来的文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...开封第一讲书人阅读 39,065评论 1赞 180城市分裂传说那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...沈念sama阅读 30,649评论 2赞 277双鸳鸯连环套:你想象不到人心有多黑文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...开封第一讲书人阅读 29,417评论 0赞 172万荣杀人案实录序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...沈念sama阅读 32,788评论 0赞 216护林员之死正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...茶点故事阅读 29,505评论 2赞 220白月光启示录正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...茶点故事阅读 30,842评论 1赞 233活死人序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...沈念sama阅读 27,287评论 2赞 216日本核电站爆炸内幕正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...茶点故事阅读 31,789评论 3赞 214男人毒药:我在死后第九天来索命文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...开封第一讲书人阅读 25,692评论 0赞 9一桩弑父案,背后竟有这般阴谋文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...开封第一讲书人阅读 26,126评论 0赞 170情欲美人皮我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...沈念sama阅读 33,804评论 2赞 235代替公主和亲正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...茶点故事阅读 33,949评论 2赞 239推荐阅读更多精彩内容Android OS知识点整理1:InputChannel提供函数创建底层的Pipe对象 2: 1)客户端需要新建窗口 2)new ViewRo...自由人是工程师阅读 5,049评论 0赞 18Spring CloudSpring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...卡卡罗2017阅读 134,021评论 18赞 139面向对象的用电信息数据交换协议国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...庭说阅读 10,359评论 6赞 13源码众享最新教程 - 草稿¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...小菜c阅读 6,132评论 0赞 17linux资料总章linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...数据革命阅读 11,964评论 2赞 34评论5赞1818赞19赞赞赏更

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。_wifi p2p-CSDN博客

>

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。_wifi p2p-CSDN博客

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。

最新推荐文章于 2023-06-20 08:45:00 发布

唯爱丶卡卡西

最新推荐文章于 2023-06-20 08:45:00 发布

阅读量2.5w

收藏

113

点赞数

21

分类专栏:

Android进阶

文章标签:

WifiP2P

WifiDirect

wifi直连

智能硬件连接

wifi

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_31332467/article/details/82429012

版权

Android进阶

专栏收录该内容

20 篇文章

1 订阅

订阅专栏

前沿:好久没更博客了,手都快生了。不过但凡长时间的积累之后就会有精品,我希望我这一篇文章能帮助各位正在“坑里”的猿猿们。

产品:你给我调研一个手机连上无网WIFI 后能继续使用手机流量的 需求。WIFI不能自动跳转和改变,(WIFI和移动流量必须同时开启)。 程序员:?????纳尼??2333333~

初听到需求,我于是去啪啪啪的搜了一圈, 搜:wifi和移动流量能同时使用么?wifi连接后,能强行使用移动流量么?等等。。。答案也是千奇百怪。有的需要改开发板,有需要用 wireless-tools 方式驱动WIFI ,通过命令启动 WIFI 模块。也有需要使用wpa_supplicant 方式驱动WIFI .可想而知 ,都没有权限,不符合需求。

直到遇见了WIFIP2P,一切问题迎刃而解。

背景

使用场景以及连接原理简介 wifip2p是一种点对点,一对多的 角色。通俗点 Android中 称之为WIFI直连,在IOS 中称之为 Airdrop(隔空投送),这种功能很强大,尤其是在智能家居,智能硬件领域。因为蓝牙的传输限制,无法满足更多的需求(比如视频数据的接收)。USB 可以满足这一点不假,但是有距离限制。而且也不是很方便。所以一般我们采用WIFI 连接。这种模式也可以。查看WIFI网卡/手机网卡状态 如果:这时候你既要连接wifi设备,又要需要请求网络处理数据,怎么办。如今的手机我们都知道只要wifi连接,便中断手机移动数据。这一点我也已经确实的验证过。 运行 —> cmd —> adb shell —> netcfg 通过查看 rmnet0 (手机网卡) 和 wlan0(WIFI连接)的状态 (DOWN 和 UP)。wifip2p作用 这时候wifip2p 的优点就显示出来的。既可以满足通信要求,又可以不影响手机网络。岂不是很nice。通过wifip2p设备可以直接通过WiFi共享文件,图片等(类似蓝牙传输),实现点对点的连接,通信(要求两设备必须位于同一网段)。在Miracast应用场景中,一台支持P2P的智能手机可直接连接上一台支持P2P的智能电视,智能手机随后将自己的屏幕,或者媒体资源传送给电视机去显示或播放。 显然,借助P2P技术,Wi-Fi设备之间的直接相连将极大拓展Wi-Fi技术的使用场景。如何判断自己的设备是否支持wifip2p 判断设备是否支持WiFi直连是通过 PackageManager的hasSystemFeature (API) ps: getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);

代码实战

官方文档:http://developer.android.com/intl/zh-tw/guide/topics/connectivity/wifip2p.html 官方Demo: http://download.csdn.net/detail/yichigo/5516627

具体步骤 - 设置应用程序权限 - 创建一个广播接收器 - 初始化对等点的搜索 - 检查设备WIFI 是否开启, - 只有上面的一步打开,才能开始搜索对等点 - 搜索到对等点列表,拿到列表信息 - 建立一个对等点连接

1.首先把需要的权限都配置好

2.需要监听WIFIP2P的广播

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.net.NetworkInfo;

import android.net.wifi.p2p.WifiP2pDevice;

import android.net.wifi.p2p.WifiP2pDeviceList;

import android.net.wifi.p2p.WifiP2pInfo;

import android.net.wifi.p2p.WifiP2pManager;

import android.text.TextUtils;

import android.util.Log;

import java.util.ArrayList;

import java.util.List;

public class DirectBroadcastReceiver extends BroadcastReceiver {

private static final String TAG = "DirectBroadcastReceiver";

private WifiP2pManager mWifiP2pManager;

private WifiP2pManager.Channel mChannel;

/**是一个自定义监听 回调接口**/

private WifiDirectActionListener mWifiDirectActionListener;

public DirectBroadcastReceiver(WifiP2pManager wifiP2pManager, WifiP2pManager.Channel channel, DirectActionListener directActionListener) {

mWifiP2pManager = wifiP2pManager;

mChannel = channel;

mDirectActionListener = directActionListener;

}

public static IntentFilter getIntentFilter() {

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);

intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);

intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);

intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

return intentFilter;

}

@Override

public void onReceive(Context context, Intent intent) {

Log.e(TAG, "接收到广播: " + intent.getAction());

if (!TextUtils.isEmpty(intent.getAction())) {

switch (intent.getAction()) {

/**用于指示 Wifi P2P 是否可用**/

case WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION:

int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);

if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {

mWifiDirectActionListener.wifiP2pEnabled(true);

} else {

mWifiDirectActionListener.wifiP2pEnabled(false);

List wifiP2pDeviceList = new ArrayList<>();

mWifiDirectActionListener.onPeersAvailable(wifiP2pDeviceList);

}

break;

/**表明可用的对等点的列表发生了改变 **/

case WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION:

mWifiP2pManager.requestPeers(mChannel, new WifiP2pManager.PeerListListener() {

@Override

public void onPeersAvailable(WifiP2pDeviceList peers) {

mWifiDirectActionListener.onPeersAvailable(peers.getDeviceList());

}

});

break;

/**表示Wi-Fi对等网络的连接状态发生了改变 **/

case WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION:

NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);

if (networkInfo.isConnected()) {

mWifiP2pManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() {

@Override

public void onConnectionInfoAvailable(WifiP2pInfo info) {

if (info != null) {

Log.i(TAG, "确实获取到WiFip2pinfo");

//!!!这里很关键,只有真正的走到这里,才是真正的建立了P2P连接。拿到了准备建立Socket通道的必要信息。

} else {

Log.i(TAG, "WiFip2pinfo 为null");

}

mWifiDirectActionListener.onConnectionInfoAvailable(info);

}

});

Log.i(TAG, "已连接P2P");

} else {

mWifiDirectActionListener.onDisconnection();

Log.i(TAG, "与P2P设备已断开连接");

}

break;

/**表示该设备的配置信息发生了改变**/

case WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:

mWifiDirectActionListener.onSelfDeviceAvailable((WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));

break;

default:

break;

}

}

}

}

自定义回调监听

public interface WifiDirectActionListener extends WifiP2pManager.ChannelListener {

void wifiP2pEnabled(boolean enabled);

void onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo);

void onDisconnection();

void onSelfDeviceAvailable(WifiP2pDevice wifiP2pDevice);

void onPeersAvailable(Collection wifiP2pDeviceList);

}

3.初始化WIFIP2P的config,并且开始搜索 【!!!在我开发过程,我发现需要真正的搜索到列表,必须多台设备都处于搜索状态,否自不处于搜索的那个设备是不会出现在DeviceList中,可以尝试熄屏,后台状态。】

private WifiP2pManager mWifiP2pManager;

private WifiP2pManager.Channel mChannel;

private WifiP2pDevice mWifiP2pDevice;

private BroadcastReceiver broadcastReceiver;

private boolean mWifiP2pEnabled = false;

private List mWifiP2pDeviceList;

private void initConfig() {

mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);

mChannel = mWifiP2pManager.initialize(this, getMainLooper(), this);

broadcastReceiver = new DirectBroadcastReceiver(mWifiP2pManager, mChannel, this);

registerReceiver(broadcastReceiver, DirectBroadcastReceiver.getIntentFilter());

//如果需要P2P设备列表的话,可以在这里初始化一个集合

mWifiP2pDeviceList = new ArrayList<>();

}

接着开始搜索列表

mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {

@Override

public void onSuccess() {

showToast("Success");

}

@Override

public void onFailure(int reasonCode) {

showToast("Failure");

}

});

如果写了Adapter 就可以直接看到列表有多少个 对等点。同样也可以直接在广播中打log

case WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION:

?????

break;

同时,我们可以获取到当前设备的一些基本信息。在广播

case WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:

mDirectActionListener.onSelfDeviceAvailable((WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));

break;

@Override

public void onSelfDeviceAvailable(WifiP2pDevice wifiP2pDevice) {

Log.i(TAG, "DeviceName: " + wifiP2pDevice.deviceName);

Log.i(TAG, "DeviceAddress: " + wifiP2pDevice.deviceAddress);

Log.i(TAG, "Status: " + wifiP2pDevice.status);

//注意这里的 wifiP2pDevice.status 并不是真正的连接状态,但是如果P2P连接成功,这里的状态一定是 wifiP2pDevice.status ==0 。后面总结会具体讲述

}

先贴出一张API参数信息。

4.在接着就是连接P2P 注意:这里很值得说一说。我们调用manager中的connect方法, ①如果连接之前没有创建一个组,系统会自动创建一个组,并且随机分配谁是GroupOwner即谁是组长, ②创建一个组,谁创建谁就是组长。 ③这也关系到谁是客户端谁是服务器,

为什么要重点提示谁是组长?因为这里有坑,就是组长只有接受数据的能力,非组长拥有发送数据的能力。并不是谁都可以随便发送和接收,因为Socket 建立需要IP,而WIFIP2P 连接后并不能获取到客户机的IP。只能获取到组长的IP 。也就是 wifiP2pInfo.groupOwnerAddress.getHostAddress()

PS: 一开始我也不知道问题出在那里,后来就查到大家都有这种问题。 https://bbs.csdn.net/topics/390780179/

最近在研究wifi direct ,主要是通过IWIFIP2PManager类来操作,但是我发现,当成功建立连接后,好像从ConnectInfo中(WIFIP2PInfo)中只能获取GroupOwner的IpAddress,并没有API可以提供其他Device的IpAdress。这个会导致上层应用无法获得对端Ip地址,而无法传递数据等。由于在不同的场景下,任何设备都有可能是GroupOwner,而我们除了GroupOwner的Ip Address外,还希望能获取对端以及Group中所有成员的Ip Address,包括自己的Ip Address.

private void connect() {

WifiP2pConfig config = new WifiP2pConfig();

if (config.deviceAddress != null && mWifiP2pDevice != null) {

config.deviceAddress = mWifiP2pDevice.deviceAddress;

config.wps.setup = WpsInfo.PBC;

mWifiP2pManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {

@Override

public void onSuccess() {

Log.e(TAG, "connect onSuccess");

}

@Override

public void onFailure(int reason) {

Log.e(TAG, "connect fail");

}

});

}

}

主动创建组长

private void createroup() {

mWifiP2pManager.createGroup(mChannel, new WifiP2pManager.ActionListener() {

@Override

public void onSuccess() {

Log.e(TAG, "createGroup onSuccess");

showToast("onSuccess");

}

@Override

public void onFailure(int reason) {

Log.e(TAG, "createGroup onFailure: " + reason);

showToast("onFailure");

}

});

}

同样,断开连接就是 移除组就可以了。

private void disconnect() {

mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() {

@Override

public void onFailure(int reasonCode) {

Log.i(TAG, "disconnect onFailure:" + reasonCode);

}

@Override

public void onSuccess() {

Log.i(TAG, "disconnect onSuccess");

}

});

}

4.数据连接阶段,非组长(群主)代码 开启异步操作。

new WifiClientTask(this, fileTransfer).execute(wifiP2pInfo.groupOwnerAddress.getHostAddress());

/**这里的 fileTransfer 就是需要传输的 Object 自定义个Bean 就好 ,重写 Serializable

而wifiP2pInfo.groupOwnerAddress.getHostAddress() 就是组IP**/

public class WifiClientTask extends AsyncTask {

private ProgressDialog progressDialog;

private FileTransfer fileTransfer;

private static final int PORT = 4786;

private static final String TAG = "WifiClientTask";

public WifiClientTask(Context context, FileTransfer fileTransfer) {

this.fileTransfer = fileTransfer;

progressDialog = new ProgressDialog(context);

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

progressDialog.setCancelable(false);

progressDialog.setCanceledOnTouchOutside(false);

progressDialog.setTitle("正在发送文件");

progressDialog.setMax(100);

}

@Override

protected void onPreExecute() {

progressDialog.show();

}

@Override

protected Boolean doInBackground(String... strings) {

fileTransfer.setMd5(Md5Util.getMd5(new File(fileTransfer.getFilePath())));

Log.i(TAG, "文件的MD5码值是:" + fileTransfer.getMd5());

Socket socket = null;

OutputStream outputStream = null;

ObjectOutputStream objectOutputStream = null;

InputStream inputStream = null;

try {

socket = new Socket();

socket.bind(null);

Log.i(TAG, "IP:" + strings[0] + "PORT:" + PORT);

socket.connect((new InetSocketAddress(strings[0], PORT)), 10000);

outputStream = socket.getOutputStream();

objectOutputStream = new ObjectOutputStream(outputStream);

objectOutputStream.writeObject(fileTransfer);

inputStream = new FileInputStream(new File(fileTransfer.getFilePath()));

long fileSize = fileTransfer.getFileLength();

long total = 0;

byte buf[] = new byte[512];

int len;

while ((len = inputStream.read(buf)) != -1) {

outputStream.write(buf, 0, len);

total += len;

int progress = (int) ((total * 100) / fileSize);

publishProgress(progress);

Log.i(TAG, "文件发送进度:" + progress);

}

outputStream.close();

objectOutputStream.close();

inputStream.close();

socket.close();

outputStream = null;

objectOutputStream = null;

inputStream = null;

socket = null;

Log.i(TAG, "文件发送成功");

return true;

} catch (Exception e) {

Log.i(TAG, "文件发送异常 Exception: " + e.getMessage());

} finally {

if (outputStream != null) {

try {

outputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (objectOutputStream != null) {

try {

objectOutputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (inputStream != null) {

try {

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (socket != null) {

try {

socket.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

return false;

}

@Override

protected void onProgressUpdate(Integer... values) {

progressDialog.setProgress(values[0]);

}

@Override

protected void onPostExecute(Boolean aBoolean) {

progressDialog.cancel();

Log.i(TAG, "onPostExecute: " + aBoolean);

}

}

而Socket.accept 等待方 开启IntentService

public class WifiServerService extends IntentService {

private static final String TAG = "WifiServerService";

public interface OnProgressChangListener {

//当传输进度发生变化时

void onProgressChanged(FileTransfer fileTransfer, int progress);

//当传输结束时

void onTransferFinished(File file);

}

private ServerSocket serverSocket;

private InputStream inputStream;

private ObjectInputStream objectInputStream;

private FileOutputStream fileOutputStream;

private OnProgressChangListener progressChangListener;

private static final int PORT = 4786;

public class MyBinder extends Binder {

public WifiServerService getService() {

return WifiServerService.this;

}

}

public WifiServerService() {

super("WifiServerService");

Log.i(TAG, "WifiServerService");

}

@Override

public void onCreate() {

super.onCreate();

Log.i(TAG, "onCreate");

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

Log.i(TAG, "onBind");

return new MyBinder();

}

@Override

protected void onHandleIntent(Intent intent) {

Log.i(TAG, "onHandleIntent");

clean();

File file = null;

try {

serverSocket = new ServerSocket();

serverSocket.setReuseAddress(true);

serverSocket.bind(new InetSocketAddress(PORT));

Socket client = serverSocket.accept();

Log.i(TAG, "客户端IP地址 : " + client.getInetAddress().getHostAddress());

inputStream = client.getInputStream();

objectInputStream = new ObjectInputStream(inputStream);

/**如果你写的是2个程序,尽管FileTransfer一样,但是也要注意包名,其实只要Socket 连接通,客户端IP 拿到,就达到了目标。**/

FileTransfer fileTransfer = (FileTransfer) objectInputStream.readObject();

Log.i(TAG, "待接收的文件: " + fileTransfer);

String name = new File(fileTransfer.getFilePath()).getName();

//将文件存储至指定位置

file = new File(Environment.getExternalStorageDirectory() + "/" + name);

fileOutputStream = new FileOutputStream(file);

byte buf[] = new byte[512];

int len;

long total = 0;

int progress;

while ((len = inputStream.read(buf)) != -1) {

fileOutputStream.write(buf, 0, len);

total += len;

progress = (int) ((total * 100) / fileTransfer.getFileLength());

Log.i(TAG, "文件接收进度: " + progress);

if (progressChangListener != null) {

progressChangListener.onProgressChanged(fileTransfer, progress);

}

}

serverSocket.close();

inputStream.close();

objectInputStream.close();

fileOutputStream.close();

serverSocket = null;

inputStream = null;

objectInputStream = null;

fileOutputStream = null;

Log.i(TAG, "文件接收成功,文件的MD5码是:" + Md5Util.getMd5(file));

} catch (Exception e) {

Log.i(TAG, "文件接收 Exception: " + e.getMessage());

} finally {

clean();

if (progressChangListener != null) {

progressChangListener.onTransferFinished(file);

}

//再次启动服务,等待客户端下次连接

startService(new Intent(this, WifiServerService.class));

}

}

@Override

public void onDestroy() {

super.onDestroy();

clean();

}

public void setProgressChangListener(OnProgressChangListener progressChangListener) {

this.progressChangListener = progressChangListener;

}

private void clean() {

if (serverSocket != null) {

try {

serverSocket.close();

serverSocket = null;

} catch (IOException e) {

e.printStackTrace();

}

}

if (inputStream != null) {

try {

inputStream.close();

inputStream = null;

} catch (IOException e) {

e.printStackTrace();

}

}

if (objectInputStream != null) {

try {

objectInputStream.close();

objectInputStream = null;

} catch (IOException e) {

e.printStackTrace();

}

}

if (fileOutputStream != null) {

try {

fileOutputStream.close();

fileOutputStream = null;

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

其实Demo 我也是从githup上拿到的。但是同样我也将我自己遇到的坑总结了一翻,彻底明白了WIFIP2P 。 https://github.com/leavesC/WifiP2P

总结【精华】

WIFIP2P连接成功后,要注意,只有非群主才能向群主发送Socket建立,并能成功发送数据。 ~~~~~ 原因:当成功建立连接后,从WIFIP2PInfo中只能获取GroupOwner的IpAddress,并没有API可以提供其他Device的IpAdress。这个会导致上层应用无法获得对端Ip地址,而无法传递数据等。由于在不同的场景下,任何设备都有可能是GroupOwner,而我们除了GroupOwner的Ip Address外,还希望能获取对端以及Group中所有成员的Ip Address,包括自己的Ip Address. WIFIP2P 建连后(connect方法),如果连接之前没有创建一个组,系统会自动创建一个组,并且随机分配谁是GroupOwner即谁是组长,这也关系到谁是客户端谁是服务器. ~~~~~ 问题:这有个坑,非常大的几率 他会一直锁定一个Device 为群主,不管是A 连接B ,还是B 连接 A, 还是A 连接C。所以一定要确定 wifiinfo 中 wifiP2pInfo.groupFormed——–一定要为true ,这样wifiinfo才包含有用信息 wifiP2pInfo.isGroupOwner——–一定要为false,是非群主,见1.才有可能发送信息。 ~~~~~ 如何解决:API 也有方法提供 调用 wifiP2pManager.createGroup(channel, new WifiP2pManager.ActionListener() {},在未连接p2p 之前,在你想要当做服务器的(AP)的机子上提前 createGroup,并在开始连接。就可以结局随机组长的问题。WifiP2pDevice 的意思是【本机设备信息】,所以千万不要误以为是获取到的是另外一台设备的设备信息。 其中常用有: wifiP2pDevice.deviceName 本设备名字 wifiP2pDevice.deviceAddress 本设备的MAC地址 wifiP2pDevice.status 设备连接状态 ~~~~~ 重点!!! 千万不要以为 wifiP2pDevice.status (0是连接 ,1是邀请中,3是未连接,但是可用,4是不可用) 为0的时候就是连接了,问题在于:p2p连接了,status 一定为0,但是status 为0 ,p2p不一定真正的连接了。这种情况在连接【智能设备】的时候容易出现,我就在此被坑了。真正的wifip2p 连接成功,必须要 在 WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION 广播中获得 为true intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO).isConnected() 并且通过 mWifiP2pManager.requestConnectionInfo(?,?);的回调监听,拿到wifiinfo的实体 ,且不为空。 才算的上你真正的加入p2p组。至此,wifip2p 连接问题 的问题点基本已经解决。真正连接后p2p 后就要建立Socket连接。一般是没有问题的,有问题也只有2点 1.)文件路径没有获取到,我们通过intent 获取到的 一般是 Uri content://com.android.providers.media.documents/document/image%3A63 而我们想要的是文件绝对路径 /data/hw_init/version/region_comm/china/media/Pre-loaded/Pictures/01-04.jpg 这样才能 通过 File file = new File(path); 文件。 所以注意这一点路径转换过程 是否为空 ~~ 2.)socket 服务器等待方 serverSocket.accept(); 其实也只是 要保证是否在等待。 楼主使用的是Githup的Demo ,其中serverSocket.accept(); 是在intentservice 的 onHandleIntent 中开启的,这个intentservice 的 开启有2种方式,startService 和 bindService 一般我们喜欢使用bindService ,毕竟数据接收后需要处理,通知UI 线程。 但是bingService 的生命周期 是不走 onHandleIntent. 而 startService 是走的。具体看我另外一篇博客对Service 和IntentService 的 解释。(下面是链接) https://blog.csdn.net/qq_31332467/article/details/82430638在开发过程中发现,WIFIP2P连接,必须双向设备都处于discoverPeers状态中,如果一方不在该状态中,则另一方根本拿不到设备列表,拿不到就谈不了最基本的连接

后记

因为我连接的硬件是车机,车机开发板中有很多问题,可能对Android开发板做了修改,我这边就遇到2个问题:

1.一个车机是有WIFI ,但是却没有直连模块,问了供货商,他们说没改过。可是开了广播后,无论如何都拿不到广播,根本连onReceive 都没走。那就什么都不用谈了,列表都拿不到,还说什么。 2.换了一台车机(另一个供货商的),这个就很顺利的拿到了列表。果然供应商都是。。。。但是这个更坑,让我白高兴了一场。

顺利拿到了列表,也顺利连接上了,只是mWifiP2pManager.connect()中回调成功。我以为连接OK,就开始Socket建连,可无论如何都是提示 Connection refusal! 我怎么就不明白,难道开发商的车机觉得我的客户端IP 非法,给我拒绝了? 一直就认为是套接字的问题。后来才发现,其实根本就没连接上,关键在广播中的

case WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION:

NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);

if (networkInfo.isConnected()) {

mWifiP2pManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() {

@Override

public void onConnectionInfoAvailable(WifiP2pInfo info) {

if (info != null) {

/**!!!!只有真正的走到这里才是真正连接!!!!**/

} else {

Log.i(TAG, "WiFip2pinfo 为null");

}

mDirectActionListener.onConnectionInfoAvailable(info);

}

});

Log.i(TAG, "已连接P2P");

} else {

mDirectActionListener.onDisconnection();

Log.i(TAG, "与P2P设备已断开连接");

}

break;

然后在赋值WifiP2pInfo 的时候,更要注意:

@Override

public void onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo) {

Log.i(TAG, "onConnectionInfoAvailable groupFormed: " + wifiP2pInfo.groupFormed);

Log.i(TAG, "onConnectionInfoAvailable isGroupOwner: " + wifiP2pInfo.isGroupOwner);

Log.i(TAG, "onConnectionInfoAvailable getHostAddress: " + wifiP2pInfo.groupOwnerAddress.getHostAddress());

/**必须if条件成立才可以开启 AsyncTask**/

if (wifiP2pInfo.groupFormed && !wifiP2pInfo.isGroupOwner) {

Log.e(TAG, "F-Z-C-G");

this.wifiP2pInfo = wifiP2pInfo;

}

}

本章完结

优惠劵

唯爱丶卡卡西

关注

关注

21

点赞

113

收藏

觉得还不错?

一键收藏

知道了

8

评论

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。

产品:你给我调研一个手机连上无网WIFI 后能继续使用手机流量的 需求。WIFI不能自动跳转和改变,(WIFI和移动流量必须同时开启)。程序员:?????纳尼??2333333~

复制链接

扫一扫

专栏目录

WiFi模块在智能硬件中的具体应用

01-19

继智能手机之后,涌入我们工作、生活中的智能化产品越来越多,传统设备智能化之后,硬件具备连接的能力,实现互联网服务的加载,用户只要通过智能手机中的WiFi、蓝牙就可以实现对设备的控制。本篇SKYLAB君就以基于串口WiFi模块的无线打印机应用为例,详细介绍WiFi模块在智能硬件中的具体应用。无线打印有两种:一是PC机的无线网卡直接连接至打印机的WiFi热点;二是PC机的无线网卡连接至无线路由;种是不用无线路由不用上网也可以实现电脑对打印机的直联打印;第二种则可以实现同一个无线路由器下面所有电脑用这台打印机的无线共享。如果你是手机,那需要你手机APP应用,打印机上面有二维码可以扫描应用。用WiFi

WIFI直连(Wi-Fi P2P)

最新发布

Eric.Xi

12-10

902

Wifi peer-to-peer(也称Wifi-Direct)是Wifi联盟推出的一项基于原来WIfi技术的可以让设备与设备间直接连接的技术,使用户不需要借助局域网或者AP(Access Point)就可以进行一对一或一对多通信。这种技术的应用场景非常多,只要设备支持WiFiP2P的协议,就可以实现传文件,屏幕共享(Miracast),甚至是联机玩游戏,而周围没有任何可以上网的设备。

8 条评论

您还未登录,请先

登录

后发表或查看评论

WIFI P2P (WIFI直连)源码解析

mr_x的博客

11-20

1万+

一:概述直接看看效果视频连接wifi直连是可以不用在WiFi环境下利用wifi传输数据的方式(当然在wifi环境下也可以)。

下面是wifi联盟的解释:并且这个wifi直连,并不是只是像蓝牙两台设备互联,可以3台及以上(没有测试过上限是多少台)。但是有个局限,就是必须其中一台设备担任groupowner角色。其他的设备担任peer角色。 1.groupowner角色就像时一台服务器。其他是设备需要

Wifi P2p点对点连接详解

即将秃头的吕同学的博客

04-21

5819

Wifi P2p的描述

Wifi P2P是在Android 4.0以及更高版本系统中加入的功能,通过Wifi P2P可以在不连接网络的情况下,直接与配对的设备进行数据交换。相对于蓝牙,Wifi P2P的搜索速度和传输速度更快,传输距离更远,底部的通讯原理是通过Binder通讯

二、Wifi P2p的开发步骤

1.在 AndroidManifest 中声明相关权限(网络和文件读...

谈谈对WiFi P2P的理解

weixin_43932465的博客

08-03

8015

谈谈对WiFi P2P的理解概述P2P架构简介P2P Discovery介绍Device Discovery 流程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入

概述

Wifi peer-to-peer(也称Wifi-Di

WIFI P2P架构

htt789的博客

03-10

1774

WIFI P2P架构

Android WiFi P2P数据传输

特立独行的博客

06-20

2056

WiFi Direct或WiFi P2P(Peer-to-Peer,点对点)是一种无线通信技术,允许设备之间直接进行点对点通信,而不需要连接到一个公共的网络中。使用WiFi P2P,设备可以发现彼此的存在并建立直接连接,这些连接可以是临时性的或长期的,这取决于应用程序需要的特定使用场景。使用WiFi P2P,可以实现像文件共享、多人游戏、流媒体传输等功能。在Android中,WiFi P2P可通过WifiP2pManager类和WifiP2pDevice类等API进行实现。

深入理解Wi-Fi P2P

Android framework

05-08

2501

第7章 深入理解Wi-Fi P2P

本章所涉及的源代码文件名及位置

·W ifiP2pSettings.java

packages/ apps/ Settings/ src/ com/ android/ settings/ wifi/ p2p/ W ifiP2pSettings.java

·W ifiP2pService.java

frameworks/ base/ wifi/ java/ android/ net/ wifi/ p2p/ W ifiP2pService.java

·p2p_supplica

Wifi直连(p2p)一对多音频传输

wxson的专栏

02-16

3237

利用Wifi p2p播放立体声

系统由一台播放器(服务器)和多台接收器(客户端)构成一个wifi直连的群组,服务器是群主(GO),客户端是组员(GC)。使用Wifi直连(p2p)构造一对多的系统是很方便实现的。

WIFI P2P In Linux

maimang1001的专栏

09-28

1125

WIFI P2P In Linux – SimpleBlogsMost of the Andriod users know about file sharing tools which lets the users to share the data directly with other user like, share it the most popular one. This is very much useful when there is no A.P to relay the traffic f

WIFI P2P v1.7中文版.docx

05-26

WIFI P2P协议V1.7版本,中文翻译,WIFI DIRECT 技术参考资料。可以对照原英文文档参考阅读,对英文不好的同学很有帮助

WiFi Direct即P2P协议学习笔记

Lizune

04-24

1万+

文章目录前言一、P2P的模型1.1 P2P的组成1.2 P2P的拓扑1.3 P2P并发模式1.4 功能和服务1.4.1 基本功能和服务1.4.2 P2P的特殊功能和服务1.4.3 P2P的两种地址二、P2P discovery阶段2.1 介绍2.2 P2P设备Discovery过程2.3

前言

在WiFi直连(WiFi Direct,也称为peer-to-peer,P2P)中,设备可以不通过AP(Access Point)进行连接。在P2P group中,称为GO(Group Owner)的设备具有像A

WiFi P2P协议学习

热门推荐

山庄来客的专栏

04-25

1万+

基本功能与服务

P2P设备不能使用11b的速率传输数据和管理帧,除非

Probe Request帧要同时发送给P2P设备和非P2P设备

P2P设备不能响应显示只支持11b速率的Probe Request帧

P2P设备应该支持如下一些操作:

P2P Discovery

P2P Group Operation

P2P Power Management 省电相关

Managed P2P Device

WIFI Direct/WIFI P2P

wirelessdisplay的博客

01-10

1万+

技术交流有兴趣请加:

 音视频技术交流群:308601278

 无线投屏技术交流群:582349005

 

 本文可在找到相关详细内容 必捷网络|因必捷而简单

 商务合作请至邮件marketing@bijienetworks.com 

 

上节说过了网卡的选型,之所以网卡的选型如此重要,主要是因为Miracast网卡相比较于普通的网卡多了个P2P功能,底层可靠了,才能很好的进行接下来的上层开发...

swift-P2PHub:一个简单的界面,可将wifi直接用作在iOS设备之间构建本地P2P网络的一种方式

05-08

P2P集线器-iOS / Swift

介绍

对下一个新的基于P2P的应用程序有想法吗? 这将使您的生活更轻松! 使用此集线器可以使用wifi-direct管理从一部iPhone到另一部iPhone的连接。 您可以轻松地建立新的连接并来回传输文本数据,从而几乎可以围绕它构建任何应用程序。

代码样例

您可以使用包含的委托API,而无需在中心中更改任何代码行。 只需在您的项目中实现委托协议功能即可。

protocol P2PHubDelegate: NSObjectProtocol {

func p2pDataRecieved(data: String, hub: P2PHub, connection: inout P2PConnection)

func p2pServerFound(serverName: String, hub: P2PHub)

fun

WIFI DIRECT开发(三)P2P传输技术-WIFI Direct

u014357995的专栏

05-07

7281

部分引用他人的博客。表示感谢

一.产品的体系结构

WiFi模块主要包括三部分:WLAN Station,WiFi Direct, Mobileap(Hotspot)(热点) ,应用主要涉及上网、打印、文件传输、热点共享、远程控制、局域网等方面。

我们所做的应用主要是涉及到了WiFidirect的一些API。所以在其他方面就不多做介绍了。

1关于WLAN的UI图

 

几乎所有较新的A

WiFi-P2P扫描流程

cbwang512的博客

05-15

114

基于Android12。

WiFi_Direct 直连开发实战

xianKOG的博客

06-30

2305

Wifi直连 开发

背景

近期有个项目,场景是 无网络情况下,实现一个手机与多个手机之间的交互。

采取的技术就是 wifi直连+socket通信 和 蓝牙连接+蓝牙通信。

这里只讲WiFi直连相关内容

WiFi直连 简介

WLAN 直连,最初称为Wi-Fi P2P(Peer-To-Peer),是Wi-Fi协议簇中的一个,使设备之间能够轻松连接彼此而不再需要一个中介性质的无线接入点(Access Point)。其使用范围从网页浏览到文件传输,以及同时与多个设备进行通信,能够充分发挥Wi-Fi的速度优势

基于WIFI的智能家居设计

05-05

2. 控制中心:智能家居需要一个控制中心,可以是手机App、智能音箱、电视等,用户可以通过控制中心来控制智能家居的各种设备。 3. 传感器:智能家居需要各种传感器,如温度传感器、湿度传感器、光照传感器、人体...

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

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

唯爱丶卡卡西

CSDN认证博客专家

CSDN认证企业博客

码龄8年

暂无认证

46

原创

5万+

周排名

90万+

总排名

23万+

访问

等级

2242

积分

54

粉丝

129

获赞

25

评论

567

收藏

私信

关注

热门文章

TCP/UDP/HTTP的区别和联系

38229

十六进制颜色转换ARGB/RGB

26823

WifiDirect (WIFIP2P) 最全最详细,应用于智能硬件(智能家居,车机,无人机)等。

25064

总结一篇热乎的【科大讯飞】SDK集成 常见问题!

20541

使用JDBC获取数据库数据,并生成json格式文件(省市区三级联动)

15541

分类专栏

笔记

Framework

11篇

Android_Bug_【踩坑】

6篇

Amap/Google_开发

1篇

自定义View/动画Animator

3篇

Utils—工具类【整理】

14篇

Android进阶

20篇

网络协议

1篇

最新评论

Android.mk的总结和使用

qiyian:

gif中提到的文件,在哪里下载

C/JAVA /串口——中使用 prop(getprop,setprop)

LankyBin:

setprop的话,因为是系统内,所以要先在系统.mk中定义

---

这个不用在mk预设置哟。

反思自己的码农之路

ctotalk:

学习了。

ExifInterface 获取照片拍摄参数(ISO,光圈,分辨率等)以及MediaMetadataRetriever 获取视频录制参数(时长,时间,码率,格式)

AAA华城鞋库距:

请问我看了一段视频很想排成他那样的画面 能不能获取他使用的相机录制视频的快门 光圈 等等信息

Android系统启动的时候都干了什么

_Optimus_Prime:

Zygote service_manager SurfaceFlinger MediaServer有执行的先后顺序吗

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

【AS问题】解决AS run 红叉问题

【Gradle】总结gradle中的常用的【工具方法】,超实用

GIT客户端无法正常下载代码可能原因

2020年18篇

2019年1篇

2018年16篇

2017年15篇

目录

目录

分类专栏

笔记

Framework

11篇

Android_Bug_【踩坑】

6篇

Amap/Google_开发

1篇

自定义View/动画Animator

3篇

Utils—工具类【整理】

14篇

Android进阶

20篇

网络协议

1篇

目录

评论 8

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

wifi direct—深入理解Wi-Fi P2P - 张同光 - 博客园

wifi direct—深入理解Wi-Fi P2P - 张同光 - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

张同光 (Tongguang Zhang)

张同光 (Tongguang Zhang):Hello everyone !

Let us make progress together every day ! —— 微信号:ztguang

博客园

首页

新随笔

联系

订阅

管理

wifi direct—深入理解Wi-Fi P2P

http://my.oschina.net/innost/blog/209795

《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P

本章主要内容:

介绍Wi-Fi P2P相关知识;

介绍Android中WifiP2pService、wpa_supplicant的相关代码。

7.1  概述

承接第6章介绍的WSC,本章将继续介绍Wi-Fi Alliance(Wi-Fi联盟)推出的另外一项重要技术规范Wi-Fi P2P。该规范的商品名为Wi-Fi Direct,它支持多个Wi-Fi设备在没有AP的情况下相互连接。

在Android平台的Wi-Fi相关模块中,P2P的功能点主要集中在:

Android Framework中的WifiP2pService,其功能和WifiService类似,用于处理和P2P相关的工作。

wpa_supplicant中的P2P模块。

和WSC一样,本章的分析拟采用如下方法:

首先将介绍P2P所涉及的基础知识。

然后再分析和P2P相关的模块,包括Settings、WifiP2pService以及WPAS。

下面,先来认识一下P2P。

7.2  P2P基础知识介绍

WFA定义的P2P协议文档全名为“Wi-Fi Peer-to-Peer(P2P) Technical Specification”,目前的版本为1.1,全长160页。P2P技术使得多个Wi-Fi设备在没有AP的情况下也能构成一个网络(P2P Network,也被称之为P2P Group)并相互通信。

Wi-Fi P2P技术是Wi-Fi Display(也称之为Miracast,详情请参考作者的一篇博文http://blog.csdn.net/innost/article/details/8474683)的基础。在Miracast应用场景中,一台支持P2P的智能手机可直接连接上一台支持P2P的智能电视,智能手机随后将自己的屏幕,或者媒体资源传送给电视机去显示或播放。显然,借助P2P技术,Wi-Fi设备之间的直接相连将极大拓展Wi-Fi技术的使用场景。

注意:根据笔者自己的判断,随着支持越来越多的设备支持P2P和Miracast,智能终端设备之间的多屏共享和互动功能将很快得以实现。另外,恰逢本章撰写之际,Google发布了Android 4.3。在这次发布盛会上,Google推出了ChromeCast设备。目前,ChromeCast的技术实现细节还不清楚,据说有可能是Google自己定义的Google cast协议(可参考developers.google.com/cast)。

下面先简单介绍一下P2P的架构。

7.2.1  P2P架构介绍[1]

P2P架构中定义了三个组件,笔者将其称之为一个设备,两种角色。这三个组件分别是:

P2P Device:它是P2P架构中角色的实体,读者可把它当做一个Wi-Fi设备。

P2P Group Owner:Group Owner(简称GO)是一种角色,其作用类似于Infrastructure BSS中的AP。

P2P Client:另外一种角色,其作用类似于Infrastructure BSS中的STA。

相信对本书的读者对上面这三个组件的概念并不陌生。实际上,P2P技术模仿了Infrastructure BSS网络结构:

在组建P2P Group(即P2P Network)之前,智能终端都是一个一个的P2P Device。

当这些P2P Device设备之间完成P2P协商后,那么其中将有一个并且只能有一个[1]Device来扮演GO的角色(即充当AP),而其他Device来扮演Client的角色。

最终构成的这个P2P Group组织结构如图7-1所示:

图7-1  P2P Group示意图

图7-1展示了一个典型P2P Group的构成,其中:

和一个Infrastructure BSS类似,一个P2P Group中只能有一个GO。一个GO可以支持1个或多个(即图中的1:n)Clients连接。

由于GO的功能类似于AP,所以周围那些不支持P2P功能的STA也能发现并关联到GO。这些STA被称之为Legacy Clients。

注意:“不支持P2P功能”更准确的定义是指不能处理P2P协议。在P2P网络中,GO等同于AP,所以Legacy Clients也能搜索到GO并关联上它。不过,由于Legacy Clients不能处理P2P协议,所以P2P一些特有功能在这些Legacy Clients中无法实现。

通过上述介绍读者会进一步发现P2P Group和Infrastructure BSS的相似性:

P2P Device在构建P2P Group时,它将首先通过WSC来获取安全信息。

然后,Client将利用协商好的安全设置信息去关联[2]GO(即P2P Group中的AP)。

这部分内容和Infrastructure BSS中STA利用WSC先协商安全信息然后再关联至AP的流程完全一样。正是这种相似性,使得P2P能充分利用现有的一些技术规范。图7-2所示为P2P及其依赖的技术项:

图7-2  P2P及其依赖的技术项

由图7-2可知:

为了保证一定的传输速率,P2P要求P2P Device必须支持802.11g及以上的规范。其中,安全部分必须支持WPA2。由于P2P技术一个主要的应用场景就是设备之间共享媒体数据(例如前面提到的Miracast应用场景),所以P2P Device还必须支持WMM(Wi-Fi Multimedia的缩写,它是一种源自802.11e的QoS服务,主要针对实时视音频数据的传输)。

P2P Client关联到GO之前,需要先通过WSC来协商安全信息,所以WSC也是P2P的依赖技术项。

在上述技术基础上,P2P规范定义了一些特有的技术项,图7-2列出了其中三种必须实现的技术项,它们分别是P2P Discovery、P2P Group Operation以及P2P PowerManagerment。除了这三个必选技术项外,P2P规范还定义了一个可选技术项,名为Managed P2P Device Operation(该技术项定义了如何在企业级环境中由对应的IT部门来统一配置和管理P2P设备)。

在如图7-2所示的技术项中,P2P Discovery是P2P所特有的,也是其核心。本章将主要围绕它进行介绍。首先来看P2P Discovery。

提示:

1、P2P Group Operation讲得是GO如何管理一个Group,也就是GO的工作职责。这部分内容请读者自行学习参考资料[2]一节。

2、P2P PowerManagement和P2P设备的电源管理有关,用于节省不必要的电力损耗。由于篇幅关系,本章不拟讨论它。请感兴趣的读者自行学习参考资料[3]。

7.2.2  P2P Discovery介绍[4]

P2P Discovery的目的很简单,就是使得多个P2P Device能够互相发现并构建一个Group。根据规范,它包括四个主要技术子项:

Device Discovery:用于P2P设备搜索周围其他支持P2P的设备。

Service Discovery:该Device Discovery基础上,P2P还支持搜索指定的服务。这部分功能属于可选项,笔者觉得它和第二章2.2.5.1“Apple Bonjour技术介绍”中提到的Bonjour类似。

Group Formation:用于决定两个P2P Device谁来扮演GO,谁来扮演Client。

P2P Invitation:用于激活一个Persistent Group(见下文解释),或者用于邀请一个Client加入一个当前已存在的Group。

提示:Group分Persistent(永久性) Group和Temporary(临时性) Group两种。我们举二个简单例子来说明二者的区别:

Temporary Group:当你有份文件要传给一个同事时,双方打开手机的Wi-Fi P2P功能,建立一个Group,然后传输文件,最后关闭Wi-Fi P2P。在这个过程中,GO和Client的角色分配由Group Formation来决定,这一次的GO可能是你的设备,下一次则可能是其他人的设备。对于这种Group,在建立Group过程中所涉及的安全配置信息以及和Group相关的信息(以后我们会见到它)都是临时的,即下一次再组建Group时,这些安全配置信息都将发生变化。

Persistent Group:在这种Group中,GO由指定设备来扮演,而且安全配置信息及Group相关信息一旦生成,后续就不会再发生变化(除非用户重新设置)。Persistent Group中的GO多见于固定用途的设备,例如打印机等。如此,除了第一次通过P2P连接到打印机时相对麻烦一点(需要利用WSC协商安全配置信息)外,后续使用的话,由于P2P设备将保存这些安全信息,所以下一次再使用打印机时就能利用这些信息直接和打印机进行关联了。

由于篇幅关系,本章将仅介绍上述四个知识点中最为基础的Device Discovery和Group Formation,而Service Discovery和P2P Invitation的内容请读者学习完本章后再仔细研读P2P规范。

1.  P2P Device Discovery介绍

P2P Device Discovery虽然也是利用802.11中的Probe Request和Probe Response帧来搜索周围的P2P设备,但其步骤却比Infrastructure BSS中的无线网络搜索要复杂。举一个简单的例子,一个P2P Device除了自己要发送Probe Request帧外,还得接收来自其他设备的Probe Request帧并回复Probe Response帧。而在Infrastructure BSS中,只有AP会发送Probe Response帧。

为了加快搜索速度,P2P为Device Discovery定义了两个状态和两个阶段。

(1)  Device Discovery工作流程介绍

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

Search State:在该状态中,P2P Device将在2.4GHz的1,6,11频段上分别发送Probe Request帧。这几个频段被称为Social Channels。为了区别非P2P的Probe Request帧,P2P Device Discovery要求必须在Probe Request帧中包含P2P IE。

Listen State:在该状态下,P2P Device将随机选择在1,6,11频段中的一个频段(被选中的频段被称为Listen Channel)监听Probe Request帧并回复Probe Response帧。值得指出的是,Listen Channel一旦选择好后,在整个P2P Discovery阶段就不能更改。另外,在这个阶段中,P2P Device只处理那些包含了P2P IE信息的Probe Request帧。

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

Scan Phase:扫描阶段。这一阶段和前面章节介绍的无线网络扫描一样,P2P Device会在各个频段上发送Probe Request帧(主动扫描)。P2P Device在这一阶段中不会处理来自其他设备的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 Request帧,而Listen State中,它将接收其他设备的Probe Request帧并回复Probe Response帧。

图7-3所示为P2P Device Discovery的流程示意图。

图7-3  P2P Device Discovery流程示意图

图7-3所示为两个P2P Device的Discovery流程,其中:

Discovery启动后,Device首先进入Scan Phase。在这一阶段,P2P设备在其支持的所有频段上都会发送Probe Request帧。

Scan Phase完成后,Device进入Find Phase。在这一阶段中,Device将在Listen和Search State中切换。根据前面的介绍,每一个设备的Listen Channel在Discovery开始前就已确定。例如,图7-3中Device 1的Listen Channel是1,而Device 2的Listen Channel是6。

在Find Phase中,P2P规范对Device处于Listen State的时间也有所规定,其时间是100TU的整数倍,倍数值是一个随机数,位于minDiscoverableInterval和maxDiscoverableInterval之间。这两个值默认为1和3,而厂商可以修改。选择随机倍数的原因是为了防止两个Device进入所谓的Lock-Step怪圈,即两个Device同时进入Listen State,等待相同的时间后又同时进入Search State。如此,双方都无法处理对方的Probe Request信息(Search State中,Device只发送Probe Request)。图7-3中,Device 1第一次在Listen State中待了2个100TU,而第二次在Listen State中待了1个100TU。

当Device处于Find Phase中的Search State时,它将在1,6,11频段上发送Probe Request帧。注意,只有当两个设备处于同一频段时,一方发送的帧才能被对方接收到。

提示:P2P规范对两个状态及两个阶段的描述非常细致,甚至于对每个状态能干什么和不能干什么都有详细说明。不过,从如何快速掌握P2P框架的角度来看,笔者觉得这些内容过于啰嗦。

了解了Device Discovery的大体工作流程后,下面我们将通过实例来看看P2P使用到的Probe Request和Probe Response帧。

[1]假设这设备将只组成一个P2P Network。

[2]注意,此处的关联指得是RSNA,其工作流程包括包括4-WayHandshake。

========================略略略略略略略略==========

7.4  wpa_supplicant中的P2P介绍

在第5章5.2.3中“WifiNative介绍”一节中曾介绍了wpa_supplicant的启动,在那一节中,读者会发现wpa_supplicant进程由WifiStateMachine启动。在Android官方代码中,虽然Java层有WifiService和WifiP2pService两个几乎完全不同的Wifi服务,但二者都只和Native层的唯一一个wpa_supplicant进程交互。简单点说,Android原生代码中,一个wpa_supplicant进程将同时支持WifiService和WifiP2pService。

上述这种设计方法使得wpa_supplicant负担较重,所以,一些手机厂商会为WifiService和WifiP2pService各创建一个wpa_supplicant进程,使得它们能各司其职而互不干扰。以笔者的Galaxy Note2为例,它的,WifiService将和wpa_supplicant进程交互,而WifiP2pService将和一个名为p2p_supplicant(经过笔者测试,p2p_supplicant实际上就是wpa_supplicant,只不过名字不同罢了)的进程交互。

图7-26所示为Galaxy Note2 init配置文件中关于p2p_supplicant服务的示意图:

图7-26  Galaxy Note2中p2p_supplicant服务配置项

由图7-26可知:

init配置文件定义了一个名为p2p_supplicant的服务,该服务启动的进程为p2p_supplicant。根据笔者的测试,p2p_supplicant其实就是wpa_supplicant,只不过换了一个名字而已。

p2p_supplicant使用的配置文件名为/data/misc/wifi/p2p_supplicant.conf文件,其内容如图7-27所示。

图7-27  p2p_supplicant.conf内容

提示:关于init配置文件中wpa_supplicant服务的说明,请读者参考第4章4.3“wpa_supplicant初始化流程分析”一节。

图7-27中,p2p_supplicant对于的ctrl_iface路径为/data/misc/wifi/sockets。所以,如果要使用wpa_cli和p2p_supplicant交互的话,必须指定正确的ctrl_iface路径。图7-28所示为笔者用wpa_cli测试p2p_supplicant时的示例截图:

图7-28  wpa_cli和p2p_supplicant交互

下面来分析wpa_supplicant中和P2P相关的代码。

注意:以Galaxy Note2为例,p2p_supplicant就是wpa_supplicant,只是编译时打开了P2P相关的选项。下面的分析将以wpa_supplicant中和P2P相关的代码及工作流程为主。

7.4.1  P2P模块初始化

首先来看WPAS中P2P相关模块的初始化。该初始化工作我们在第4章4.3.4中“wpa_supplicant_init_iface分析之五”曾提到过,其对应的函数wpas_p2p_init,马上来看它

[p2p_supplicant.c::wpas_p2p_init]

int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)

{

    struct p2p_config p2p; //p2p变量指向一个p2p_config对象,代表P2P模块的配置信息

    unsigned int r;  int i;

    //①WPA_DRIVER_FLAGS_P2P_CAPABLE:代表Wifi驱动对P2P支持的能力,详情见下文解释

    if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))  return 0;

 

    if (global->p2p)  return 0;

    //如果wifi driver能完成P2P功能,就不用劳驾WPAS了

    if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {......}

 

    //②初始化并设置p2p_config对象

    os_memset(&p2p, 0, sizeof(p2p));

    p2p.msg_ctx = wpa_s;  p2p.cb_ctx = wpa_s;

    p2p.p2p_scan = wpas_p2p_scan; //P2P对应的扫描函数

    .......//设置一些回调函数

    p2p.get_noa = wpas_get_noa; p2p.go_connected = wpas_go_connected;

    //设置P2P Device address。

    os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);

    os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);

   //设置P2P模块配置信息,包括device name,model name,uuid等

    p2p.dev_name = wpa_s->conf->device_name;

    p2p.manufacturer = wpa_s->conf->manufacturer;

    p2p.model_name = wpa_s->conf->model_name;

    p2p.model_number = wpa_s->conf->model_number;

    p2p.serial_number = wpa_s->conf->serial_number;

    if (wpa_s->wps) {

        os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);

        p2p.config_methods = wpa_s->wps->config_methods;

    }

    //设置Operation Channel信息和listen channel信息

    if (wpa_s->conf->p2p_listen_reg_class &&

        wpa_s->conf->p2p_listen_channel) {

        p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;

        p2p.channel = wpa_s->conf->p2p_listen_channel;

    } else {......//设置默认值}

   ......

     //设置国家码

    if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {

        os_memcpy(p2p.country, wpa_s->conf->country, 2);

        p2p.country[2] = 0x04;

    } else//配置文件中没有设置国家,所以取值为"XX\x04"

        os_memcpy(p2p.country, "XX\x04", 3);//读者可回顾图7-7

     //判断wifi 驱动是否支持配置文件中设置的operationg channel和listen channel

    if (wpas_p2p_setup_channels(wpa_s, &p2p.channels)) {......}

 

    os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,WPS_DEV_TYPE_LEN);

 

    p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;

    os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,

             p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN);

    //是否支持concurrent operation

    p2p.concurrent_operations = !!(wpa_s->drv_flags&WPA_DRIVER_FLAGS_P2P_CONCURRENT);

 

    p2p.max_peers = 100;//最多能保存100个对端P2P Device信息

    //配置文件中没有设置p2p_ssid_postfix,但P2pStateMachine在initializeP2pSettings函数中

   //将设置P2P SSID后缀。以笔者的Galaxy Note2为例,其P2P SSID后缀为“Android_4aa9”

    if (wpa_s->conf->p2p_ssid_postfix) {......}

 

    p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;

    //③global->p2p指向一个p2p_data结构体,它是WPAS中P2P模块的代表

    global->p2p = p2p_init(&p2p);

    ......

    for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {//拷贝vendor厂商特定的WSC属性信息

        if (wpa_s->conf->wps_vendor_ext[i] == NULL)  continue;

        p2p_add_wps_vendor_extension(global->p2p, wpa_s->conf->wps_vendor_ext[i]);

    }

 

    return 0;

}

由上述代码可知,wpas_p2p_init的工作非常简单,主要内容包括:

初始化一个p2p_config对象,然后根据p2p_supplicant.conf文件的信息来设置其中的内容,同时还需要为P2P模块设置一些回调函数。

调用p2p_init函数以初始化P2P模块。

下面来介绍上述代码中涉及到的一些知识。

1.  Driver Flags和重要数据结构介绍

先来看上述代码中提到的drv_flags变量。WPAS中,Wifi驱动对P2P功能的支持情况就是由它来表达的。笔者的Galaxy Note2中该变量取值为0x2EAC0,其表达的含义如下:

[-->driver.h]

#define WPA_DRIVER_FLAGS_AP        0x00000040  //Wifi driver支持AP。它使得P2P设备能扮演GO

/*

  标志标明association成功后,kernel driver需要设置WEP key

  这个标志出现的原因是由于kernel API发生了变动,使得只能在关联成功后才能设置key

*/

#define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE    0x00000080

#define WPA_DRIVER_FLAGS_P2P_CONCURRENT    0x00000200 //Wifi驱动支持STA和P2P的并发运行

#define WPA_DRIVER_FLAGS_P2P_CAPABLE    0x00000800 //Wifi驱动支持P2P

/*

  7.2.2.1.2“Probe Request帧设置”一节曾提到过说P2P包含Device Address和Interface Address

  两种类型的地址。在实际实现过程中,这两个地址分别代表两个virtual interface。显然,P2P中第一个和一直

  存在的是拥有Device Address的vitural interface。下面这个标志表示该virtual interface可以参与

  P2P管理(除P2P Group Operation之外的工作)工作以及非P2P相关的工作(例如利用这个virtual

  interface 加入到一个BSS)

*/

#define WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P  0x00002000

/*

 该标志主要针对associate操作。当关联操作失败后,如果driver支持该选项,则表明driver能处理失败之

 后的各种收尾工作(Key、timeout等工作)。否则,WPAS需要自己处理这些事情

*/

#define WPA_DRIVER_FLAGS_SANE_ERROR_CODES        0x00004000

//下面这个标志和off channel机制有关。读者可参考第4章4.3.4中“capability介绍”一节。当802.11

//MAC帧通过off channel发送的话,下面这个标志表示driver会反馈一个发送情况(TX Report)消息给WPAS

#define WPA_DRIVER_FLAGS_OFFCHANNEL_TX            0x00008000

//下面这两个标志表示kernel中的driver是否能反馈Deauthentication/Disassociation帧

//发送情况(TX Report)

#define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS        0x00020000

下面来看wpas_p2p_init中出现的几个重要数据结构,首先是p2p_config和p2p_data,它们的成员如图7-29所示:

图7-29  p2p_config和p2p_data结构示意图

图7-29展示了p2p_config和p2p_data两个数据结构中一些重要的成员。其中:

p2p_config定义了20个回调函数。这些回调函数定义了P2P模块和外界交互的接口。在wpas_p2p_init中,这些回调函数均指向p2p_supplicant.c中对应的函数,例如p2p_scan指向wpas_p2p_scan,dev_lost指向wpas_dev_lost。另外,由于回调函数的参数比较复杂,所以图中均省略了参数信息。

p2p_data指向一个p2p_config对象。

下面来看另外几个重要数据结构的内容,如图7-30所示:

图7-30  p2p_device及其他数据结构示意图

图7-30展示了五种数据结构,其中:

p2p_device代表一个P2P设备。其中一些诸如设备名,Device CapabilityBitmap等信息保存在一个类型为p2p_peer_info的对象中。

p2p_group代表一个P2P Group的信息,其内部包含一个p2p_group_config对象和一个p2p_group_member链表。p2p_group_config表示该Group的配置信息,p2p_group_member代表Group Member即P2P Client的信息。

提示: WPAS中定义了非常多的数据结构类型,这极大增加了初学者的学习难度。根据笔者自己的经验,建议读者在学习过程中先简单了解这些数据结构的名字及作用,然后在具体代码分析时再结合代码逻辑来了解这些数据结构及其内部各个成员变量的具体作用。

7.5  本章总结和参考资料说明

7.5.1  本章总结

本章对Wi-Fi P2P进行了详细介绍,主要内容包括:

P2P理论知识。从完整性来说,本章介绍的内容只是P2P规范中最基础的部分。但对于初学者而言,这部分的难度也不算小。就笔者自己的学习经历而言,这部分内容需要反复琢磨和研究,有时候还需要结合代码分析才能真正掌握其精髓。

在学习完P2P理论知识后,我们对WifiP2pSettings以及WifiP2pService进行了介绍。这部分内容比较简单,读者可轻松掌握相关知识。

最后,我们对WPAS中的P2P模块及运行机制进行了介绍。就所涉及到的知识而言,这些内容并不复杂,但由于P2P以及和wifi driver在具体实现时有诸多考虑(例如off channel的情况,TX Report的处理),所以其工作流程反倒显得比较繁琐。

最后,希望读者在本章的基础上,完成下列的一些任务:

通读P2P规范,了解Group Operation、Invitation、Device Discoverability以及P2P Power Management相关知识。

继续研究wpas_start_wps_go代码,掌握WPAS中WSC Registrar以及AP的工作流程。

 

7.5.2  参考资料说明

P2P基础知识介绍

本章参考资料主要是Wifi P2P规范1.1版,读者可从http://www.doc88.com/p-908280242988.html上下载协议全文。

P2P架构介绍

[1]  WiFi P2P第2节“Architectural Overview”

[2]  WiFi P2P第3.2节“P2P Group Operation”

[3]  WiFi P2P第3.3节“P2P Power Management”

P2P Device Discovery和Group Formation

[4]  WiFi P2P第3.1节“P2P Discovery”

[5]  Part11:Wireless LAN Medium Access Control(MAC) and Phsyical Layer(PHY) Specifications附录J“Country information element and regulatory classes”

该文档下载地址为http://download.csdn.net/download/s_bird0529/2553723。附录J详细描述了国家码和管制信息方面的内容

[6]  WiFi P2P第4.2节“Management Frames”

[7]  802.11-2012第8.4.1.11节“Action Field”

该节介绍了Action帧Category字段的取值情况

[8]  WiFi P2P第4.1节“P2P Information Elements”

[9]  WiFi P2P附录A“P2P State Machine”

阅读(65) | 评论(0) | 转发(0) |

0

上一篇:Android Tutorial Android Wifi-Direct Tutorial

下一篇:《深入理解Android:Wi-Fi,NFC和GPS》—android源码下载

相关热门文章

Android之开发环境搭建

Android自定义View的实现...

AndroidManifest.xml配置文件...

Android相对布局+圆角按钮+Sha...

查看Android应用包名package和...

linux dhcp peizhi roc

关于Unix文件的软链接

求教这个命令什么意思,我是新...

sed -e "/grep/d" 是什么意思...

谁能够帮我解决LINUX 2.6 10...

给主人留下些什么吧!~~

评论热议

posted @

2016-02-01 00:00 

张同光 

阅读(892) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 张同光

Powered by .NET 8.0 on Kubernetes

WiFi Direct即P2P协议学习笔记_wifi p2p-CSDN博客

>

WiFi Direct即P2P协议学习笔记_wifi p2p-CSDN博客

WiFi Direct即P2P协议学习笔记

zhicpp

已于 2022-07-03 09:15:15 修改

阅读量1.3w

收藏

148

点赞数

27

分类专栏:

WiFi Driver

文章标签:

WiFi P2P

WiFi direct

于 2022-04-24 23:26:32 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/m0_38059875/article/details/122075907

版权

WiFi Driver

专栏收录该内容

3 篇文章

15 订阅

订阅专栏

文章目录

前言一、P2P的模型1.1 P2P的组成1.2 P2P的拓扑1.3 P2P并发模式1.4 功能和服务1.4.1 基本功能和服务1.4.2 P2P的特殊功能和服务1.4.3 P2P的两种地址

二、P2P discovery阶段2.1 介绍2.2 P2P设备Discovery过程2.3 Group Formation过程2.3.1 P2P Negotiation Method (Standard Method)2.3.2 P2P Autonomous Group Formation2.3.3 P2P Persistent Group Formation

三、参考资料

前言

在WiFi直连(WiFi Direct,也称为peer-to-peer,P2P)中,设备可以不通过AP(Access Point)进行连接。在P2P group中,称为GO(Group Owner)的设备具有像AP一样的功能,其他被称为GC(Group Client)的设备就去连接GO。支持WiFi Direct功能的设备都可以称为GO或GC。在Group Formation阶段,设备会被确定称为GO还是GC。笔者将会后面的博客讨论Group Formation过程。在P2P group中,只会存在一个GO,其他许多的GC去连接这个GO,然后进行通信。

一、P2P的模型

1.1 P2P的组成

P2P体系结构由支持设备间通信的交互组件组成。 P2P设备

能够作为P2P GO(Group Owner)或P2P GC(Group Client)角色。能够协商成为GO或GC。能够支持WSC(Wi-Fi Simple Configuration)Registrar和P2P discovery机制。能够支持WLAN和P2P并发运行。

P2P GO角色:

类似于AP实体,对P2P GC提供BSS功能和服务。提供WSC功能。可能提供关联GC之间的通信。

P2P GC角色:

实现STA的功能。提供WSC Enrollee功能。

1.2 P2P的拓扑

P2P拓扑是1:n策略,多个GC可以连接同一个GO。这些连接的设备被称为一个P2P Group。

在DMG之外的运行每个client可能是P2P GC或传统的不具有P2P功能的Client。在DMG之内运行的每个client必须是具备P2P功能的GC。 图1 在DMG之外的P2P组成和拓扑 图2 在DMG中的P2P组成和拓扑

一个P2P Group有唯一的SSID,图3表示1:1的拓扑。 图3 P2P Group 拓扑为1:1

1.3 P2P并发模式

支持P2P功能的设备可以并发模式运行,也就是STA(Station)模式和P2P模式共存。在并发模式中,P2P设备可以连接一个AP。因此,P2P设备可以GO+STA或GC+STA模式运行。在并发模式中,设备存在两个interface接口,并且这两个interface大概率处于同一个channel信道,也有可能处于不同的channel和band。

在下图中可以看到,P2P设备处于并发模式。 图4 P2P Concurrent Device

图4显示了P2P设备有一个MAC实体作为了WLAN-STA,另外一个MAC实体作为了P2P Device。双MAC功能可以通过两个独立的物理MAC实体提供,每个实体与自己的PHY实体关联,或者两个虚拟MAC实体与一个PHY实体关联。

一个P2P group可以与一个并发操作的WLAN BSS处于相同或者不同的信道中。比如,WLAN BSS可能处于5.2GHz的channel 36,而P2P group在2.4GHz的channel 6。

1.4 功能和服务

1.4.1 基本功能和服务

在DMG之外运行的P2P,规范是假设以下STA功能和服务在设备中已经实现:

IEEE 802.11g或比2.4GHz更新的PHYIEEE 802.11i(IES-CCMP)WiFi Protected SetupWiFi Multimedia

在DMG之内运行的P2P,规范是假设以下STA功能和服务在设备中已经实现:

在IEEE 802.11-2020中定义的DMG操作在IEEE 802.11-2020中定义的AES-GCMPWiFi Protected Setup

图5 P2P及其依赖的技术

P2P技术一个主要的应用场景就是Miracast,设备之间共享媒体数据,所以P2P还必须支持WMM(WiFi Multimedia),WMM是一种源自802.11e的Qos服务,主要是针对实时音视频数据的传输。

1.4.2 P2P的特殊功能和服务

P2P设备还支持以下特殊功能:

P2P Discovery:让设备轻易快速简单地识别并连接周围其他P2P设备和服务。P2P Group Operation:在DMG之外运行时类似于基础BSS操作,如IEEE802.11-2020所定义。在DMG内运行时类似于PBSS操作。P2P Power Management:提供了一系列的功能去减少P2P设备的功率消耗。

1.4.3 P2P的两种地址

P2P Device Address 一个P2P设备在加入P2P Group之前都是使用的Device Addr开展Discovery等工作。对于一个P2P设备而言,Device Addr是唯一的,作用等同于MAC地址。P2P Interface Address 而当P2P设备加入P2P Group之后,它与Group中的其他设备交互时采用的时Interface Addr。另外,由于一个设备可以加入多个P2P Group,所有在每个P2P Group中设备必须采用不同的Interface Addr。当某一个P2P Group结束之后,设备在该Group中使用的Interface Addr也随之消失。

二、P2P discovery阶段

2.1 介绍

P2P discovery阶段让P2P设备快速查找周围的其他P2P设备,并建立连接。P2P discovery主要由以下几个部分组成:

Device Discovery,让两个设备到达相同的信道并交换彼此的设备信息(例如设备名称和设备类型)。在P2P协议规范中,Device Discovery在1,6,11信道进行。Service Discovery,是一个可选特性,允许P2P设备在形成连接之前发现可用的上层服务。Group Formation,用于确定哪台设备时GO,并形成一个新的P2P Group。P2P Invitation,用于调用一个存在P2P Group或者邀请一个P2P设备加入这个Group。

2.2 P2P设备Discovery过程

基本原理:P2P设备进行主动扫描从而发现附近的其他设备,设备使用probe request和probe response帧去发现彼此。P2P Group形成之后,GO会发送beacon帧去发现设备。 P2P Device不会回复probe request帧,除非它是GO或者处于Listen State。 P2P Device不会发送beacon帧,除非它是GO。 下面这张图展示了Discovery的过程: Scan阶段:扫描阶段使用IEEE Std 802.11-2012中定义的扫描过程。P2P设备可以在这个阶段查找其他的P2P设备或者P2P Group,并选择最佳的信道去建立P2P Group。在Scan阶段,设备扫描自己支持的所有信道(可以是Channel 1,6,11,也可以是全新到扫描)去寻找周围的其他设备。在Scan阶段的P2P设备不会回复Probe Request帧。 Listen状态:不属于P2P Group中的设备如果处于Listen状态可以被其他的设备发现。Listen状态会给定一个信道,叫Listen Channel监听信道。这是从Social Channels中选择的一个信道,2.4GHz频段中Channel 1,6,11被作为Social Channels。

Listen Channel应在设备Discovery之初选择,并应保持不变,直到P2P Discovery阶段完成。

处于Listen状态的P2P设备只能对Probe Request探测请求帧进行应答,探测请求帧包含P2P IE、P2P通配符SSID元素、一个通配符BSSID和一个目的地址(广播地址或其P2P设备地址)。

每个P2P 设备都会选择一个随机数,随机数的上限和下限分别是maxDiscoverableInterval和minDiscoverableInterval,默认情况分别为3和1。如果随机数为1,那么设备会处于Listen状态的时间为100TU,如果随机数为3,那么设备处于Listen状态的时间为3*100TU。随机数的机制主要是为了避免两个设备Listen和Search的时间同步,导致互相搜索不到彼此。

Search状态:P2P device会在social channel上发送一个或多个Probe Request帧。这些Probe Request帧包含以下信息。

P2P IEWSC IE,以及Device Name,Primary Device Type和Device Password ID等。SSID,用来设置P2P Wildcard SSIDBSSID,用来设置Wildcard BSSID

总结:一个P2P device处于Scan阶段,它有可能会发现另外一个处于Search状态 Listen状态的P2P device。Find阶段主要用于保证两个P2P device能够处于相同的channel相互发现,并交换设备信息。一个P2P device进行connect可能会出现下面三种情况:

进行Group Owner Negotiation,从而建立一个新的P2P Group。发送P2P Invitation Request frame去调用一个先前建立好的Persistent P2P Group。发送P2P Invitation Request frame以请求目标P2P Device加入已经建立好的P2P Group。

2.3 Group Formation过程

这里主要有三种方式可以进行Group Formation。它们分别是:

P2P Negotiation Method (Standard Method)P2P Autonomous Group Formation.P2P Persistent Group Formation.

2.3.1 P2P Negotiation Method (Standard Method)

可以通过下图看出P2P GO Negotiation的过程包含几个阶段。

P2P Device discovery,P2P Device的discovery阶段。Optional Service Discovery,可选的Service discovery阶段。Group Owner Negotiation,GO协商阶段。Phase1 and Phase 2 of WPS Provisioning,WPS配置阶段。 阶段1——P2P Device Discovery和Service Discovery阶段,如2.2节所述。 阶段2——GO协商 当两个P2P Device到达相同的channel,并开始进行GO协商,这两个P2P Device在GO协商完成前会一直保持这个相同的channel。GO协商共有三次帧交互从而达成一致谁做GO,谁做GC,以及Group的特性。下图是GO协商的帧交互过程。

图中所示,device1发送GO Negotiation给device2,帧交换的主要目的是进行GO intent值的交换,intent值决定了谁作GO。intent值的范围是0到15。谁的intent值越大,谁就作GO。如果intent值相同,则通过tie breaker来判断,tie breaker为0或1,1表示作GO,tie breaker的值是0或1随机选择的。 比如,device1的intent为5,在GO Negotiation Request中tie breaker随机设置为0。不巧的是,device2的intent也设置为5,但是device2通过GO Negotiation Request得知device1的tie breaker为0,那么将自己tie breaker切换为1并发送GO Negoation Repsonse。如果device1的tie breaker随机设置为1,那么device2的tie breaker就会相应切换为0。这样从而能保证在intent相同的情况下GO协商也能成功。

通过抓包工具抓到的GO协商的帧交互如下:

Device1发出Negotiation Request,intent为4,tie breaker为0 Device2发出Negotiation Response ,intent为4,tie breaker为1 Device2发出Negotiation confirmation ,status code为0,表示成功 决定GO的流程图如下所示: 下图是Negotiation Response codes。常见的就是status code: success (0)。 当status code为9时,即当两个device的intent值都为15时,会GO协商失败。 当status code为7时,表示两个device不在相同的channel。 当status code为11时,表示对端设备拒绝连接。

一旦GO协商成功之后,GO就会发送beacon帧。beacon帧中包含了P2P Group的属性信息。 阶段3——Phase1 and Phase 2 of WPS Provisioning 下图清晰地展示了WPS Provisioning中Phase1和Phase 2过程的帧交换。 我们通过wireshark工具抓取了Group Formation的Phase 1和Phase 2过程的数据包,截图如下: 这里采用的方法是PBC(Push ButtonConfiguration)方式。Group Formation过程有一个叫Provisioning的阶段,Provisioning采用的WSC(WiFi Simple configuration)。因为需要等待用户输入,所以WSC大概会花费2min左右的时间。由于Group Formation阶段可能会执行多次,因此用户无法接受2min的延迟。在P2P Group形成之前,P2P Device应该获取所需的相关信息,相关信息包括从用户处获取的PIN等。P2P Device应该在15s内完成P2P Group的创建(完成Group Formation)。

下图详细地展示了P2P Group Formation过程: part-1 part-1阶段是authentication request和authentication response帧的交互。在WiFi association的过程中,我们也能看到association request和association response这些帧的交互。 part-2 在part-2中,我们看到EAP authentication过程,主要有以下阶段:

supplicant(GC)将发送EAPOL-Start帧给AP(GO)。抓的数据包中不存在这一帧,应该是GO直接初始化好了这一过程。下图是该帧的具体细节: GO将发送request identity给GC。 GC发送response identity给GO。response identity内容为“WFA-SimpleConfig-Enrollee-1-0”。同时,GO是registrar。

part-3 part-3是WSC的过程。 4. 在M1 Message之前,AP将发送WSC Start (1)给supplicant。这一帧由GO发出,如下图所示: 在WSC-START之后,我们会看到M1-M8 message帧的交互过程。在M1-M2中,diffie-helmen密钥交换将生成共享密钥。supplicant和GO都将交换公钥以生成公共共享密钥。GO和supplicant不会共享私钥,它们将使用Diffie-Helmen密钥交换算法计算共享密钥。

M1 Message是从Enrollee(supplicant)发到registrar(GO),supplicant的公钥和Enrollee的Nonce都会被发送给GO。观察下图,我们可以发现在supplicant发送的response中采用的PBC方式去形成Group。 M2 Message是GO发送给supplicant,从中可以观察到这些帧Enrollee nonce、Registrar Nonce、Public key of the Registrar(GO) and Authenticator被发送。下图展示了算法如何计算出这些值的。 下面这张图是抓包工具中的M2 Message。作为Diffie-Hellman密钥交换的一部分,Public key of the Registrar被发送给Enrollee。 M3 message帧是Enrollee发给Registrar,具体细节如下图所示: M4 Message是Registrar发给Enrollee。在M4和M5中,Registrar和Enrollee将进行相互认证authentication。在M4中,Registrar将验证前半部分PIN的正确性;在M5中,Enrollee也将验证前半部分PIN的正确性。通常,PIN码是8位数字。如果输入错误的前半部分PIN码,这将导致在M4之后不会再有其他的Message出现。同样,如果输入错误的后半部分PIN码,这将导致在M6之后不会再有其他的Message出现。

在PBC方式中,用户不会输入PIN。默认的PIN码被设置为00000000。 9. M5 Message帧是Enrollee发给Registrar。通过Registrar,Enrollee (supplicant)证明了拥有PIN的前半部分。PIN的前半部分相互认证通过该帧结束。 10. M6 Message是Registar(GO)发给Enrollee。通过Enrollee,Registar(GO)验证后半部分PIN的正确性。如果输入了错误的后半部分PIN,在M6之后就不会有任何消息了。 下图是抓包工具抓到的M6: 11. M7 Message是Enrollee (supplicant)发给Registrar (GO)。Enrollee证明了后半部分PIN的正确性,后半部分PIN的相互认证到此结束了。 下图是抓包工具抓的M7: 12. M8 Message是Registrar发给Enrollee。在M8消息中,Security configuration、New Credentials都会分发给Enrollee。现在,Enrollee必须使用新的凭据重新连接到GO。 下图是抓包工具抓的M8: 13. Enrollee发送WSC_DONE给Registrar。WSC(Wifi Simple Configuration)将在WSC_DONE帧后结束。下图可以看到WSC_DONE的具体细节。 14. Registrar将返回EAP-Fail message给Enrollee。然后,Enrollee将断开连接disassociate,再通过M8中获取的凭据credential进行重连reconnect,之前旧的连接不再有效。Registrar (GO)发送的EAP-Fail message如下所示: 15. supplicant(Enrollee)发起断开连接的动作,即发送disassociation frame给GO(Registrar)。disassociation frame如下: 16. GO(Registrar)将发送Deauthentication frame,然后Supplicant通过新的凭据进行重新连接,如下图所示: 到此,Group Formation的PHASE-1结束了。

Phase-2 接下来,介绍下Group formation过程中的Phase-2阶段。Phase-2阶段主要进行4-way handshake,这和正常association的4-way handshake一样。唯一的区别是Phase-2阶段用户不需要输入密码。在PBC方法中,M8 Message会携带凭据信息。4-way handshake会根据M8中凭据信息生成PTK、GTK和其他密钥。这里将使用AES方法完成数据的加密。下图展示了4-way handshake相关的数据包: 在4-way handshake之后,Group formation的Phase-2过程就结束了。

Phase-2之后 在4-way handshake之后,GO会发出beacon帧,beacon帧会携带P2P capability Attribute,并且group formation bit设置为0。在GO Negotiation Procedure之后,group formation bit会设置为1,在 4-way Handshake之后,该位又会置为0。

4-way handshake之后,beacon帧会从GO端立即发出,如下所示: 从下面的beacon帧中看出,group formation设置为0x0。 接下来,会进行DHCP握手阶段,GO会为GC分配IP地址,之后将进行数据通信。观察下图可以看到在Phase-2之后,立即进行了DHCP的握手。但是在wireshark抓包工具中没有看到DHCP握手情况,因为在4-way handshake之后DHCP相关消息被加密了。 在这之后,GO和GC之间将进行数据传输。下图展示了wireshark工具中DHCP的过程,这必须先抓到4-way handshake的数据包,然后在wireshark中输入PSK或PASSWORD:SSID进行解密数据流量。

在DHCP过程之后,将完成数据传输,并且P2P默认使用AES-CCMP加密。

2.3.2 P2P Autonomous Group Formation

在2.3.1节中,我们了解到通过Negotiation Method方法形成P2P Group。在这一节,我们将了解通过Autonomous GO Method形成P2P Group。同时,我们将了解这两种方法的不同。 在AUTO GO Method中,一个设备将声明自己作为GO,我们将不会看到Negotiation Phase协商阶段。 下图是通过Negotiation Method方法形成P2P Group的帧交互过程。 在上图中,用红色方框标记的就是GO negotiation过程。这个过程将决定哪个设备作为GO。在Autonomous GO (AUTO GO) 方法中,我们将看不到协商过程,因为其中一个设备已经声明它作为GO。 下图展示了P2P Auto GO的过程。 在P2P Auto GO方法中,设备声明自己作为GO,该设备就变成了GO,并选择一个channel开始发送beacon帧。 在discovery阶段,discovery是基于GO发送的beacon帧或active discovery过程。在AUTO GO方法中,GO将会发送beacon帧让passive scan的设备能够被发现。这个阶段同时也有可选服务发现optional service discovery。 一个P2P设备加入autonomous group,我们可以观察supplicant的log与设备发出的beacon帧。

IFNAME=p2p-wlan-0 <3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=xx:xx:xx:74:40:a0 SSID=DIRECT-pF

<3>P2P-GROUP-STARTED p2p-wlan0-0 GO ssid=”DIRECT-Ww” freq=2437 passphrase=”6NmClTZ8″ go_dev_addr=xx:xx:xx:74:c0:a0

在discovery阶段,可以观察到Beacon、Probe request和probe response帧的交互,如下面抓的包所示: 当任意一个设备想加入一个已经存在的P2P group时,我们能够看到P2P Provisional Discovery Request和Response帧的交互过程。Provision Discovery Request帧会在Config Methods属性中配置发送方设备想让接收方设备使用的方法。当设备接收到Provision Discovery Request帧时,会向对端设备响应Provision Discovery Response帧。Provision Discovery Response帧如果在Config Methods属性配置了相同的方法,这表示成功,如果配置为NULL,则表示失败。 观察下图中Provision Discovery Request帧的结构,config method配置为**“Push Button”,因为我们采用了Push button method连接。 观察下图Provision Discovery Response的帧结构,也是采用的“Push Button”**方法。 在这之后,将进行Group Formation中的Phase 1 and Phase 2阶段。下图展示了Phase 1 and Phase 2阶段的帧交互过程。 下图展示了Group Formation中的Phase 1 and Phase 2阶段,和使用Negotiation Method方法的Phase 1 and Phase 2一样。 一旦Group Formation成功,GO的supplicant logs会打印以下event。

IFNAME=p2p-wlan0-0 <3>AP-STA-CONNECTED xx:xx:xx:74:43:dc p2p_dev_addr=xx:xx:xx:7

4:c3:dc

<3>AP-STA-CONNECTED xx:xx:xx:74:43:dc p2p_dev_addr=xx:xx:xx:74:c3:dc

在Phase-1和Phase-2成功之后,进行DHCP,之后GO和GC之间采用AES加密进行数据传输。

2.3.3 P2P Persistent Group Formation

2.3.1节和2.3.2节分别介绍了Negotiation Method和Autonomous Method两种Group Formation方法。本节主要介绍使用Persistent Method方法去形成P2P Group Formation。在Persistent method方法中,设备会保存M8 Message中的凭据credentials,GO或GC将使用这些凭据credentials去邀请P2P device去形成P2P Group。 现在我们将了解P2P Persistent Group Formation方法。我们将了解到该方法与Negotiation和Autonomous Group方法的不同之处。

在Group Formation的开始阶段,我们将看到Phase-1和Phase-2阶段。Phase-1阶段主要用于GO分发credentials凭据给GC。P2P Persistent Group Formation没有Phase-1阶段,因为在形成Group的时候,凭据credentials已经保存起来了。任何设备想要连接到之前连接过的设备,它将使用存储起来的凭据进行连接,因此不会有Phase-1阶段,Group Formation过程进行得更快,因为在GO和GC之间少了许多帧交换。

在Persistent Method方法中,我们也不会看到Negotiation Phase协商阶段,因为GO已经在Group形成的时候就确定了。当一个P2P device获取到Persistent Group的凭据时,P2P device应该将该凭据保存起来。这样能够让GO重新创建P2P Group。甚至P2P GC也可以保存凭据,并用这些凭据邀请GO来形成P2P Group。

persistent group形成有两种方式:

GO发送P2P INVITATION REQUEST请求给GC,GC回应P2P INVITATION RESPONSE;GC发送P2P INVITATION REQUEST请求给GO,GO回应P2P INVITATION RESPONSE。 在了解Invitation过程之前,我们先了解下P2P Persistent Group Formation整体的帧交互过程。 下图展示了GO与GC之间详细的帧交互过程: 在Persistent method方法中,我们可以看到Invitation阶段。这将由GO邀请GC或GC邀请GO形成P2P Group。

在P2P Persistent Group中,Device Discovery采用Active Scanning主动扫描。Device Discovery也可以采用passive scanning,这种主要发生在Autonomous GO中,GO已经开始主动广播beacon帧。上图中的discovery主要是通过Probe Request和Probe Response帧进行的。

如果GO具有persistent Group Formation的能力,那么在P2P Capability attribute的Group Capability Bitmap field中Persistent P2P Group bit会被置为1。这里的置位主要发生在GO传输的beacon帧、Probe Response帧。

下图中Persistent Reconnect设置为0,表示GO不支持Persistent Reconnect。 P2P GO可以将Persistent Reconnect位设置为1,从而表示P2P GC可以重新连接,而无需用户干预Persistent P2P Group。我们可以从probe response中看到详细信息。 在第一次Group Formation的时候,我们可以看到Phase-1和Phase-2阶段。在Persistent P2P Group形成之后再次连接,我们只会看到Phase-2阶段,不会看到Phase-1阶段。 下面是supplicant关于Persistent Group被创建相关的log。

<3>P2P-GROUP-STARTED p2p-wlan0-13 GO ssid=”DIRECT-X7″ freq=2462 passphrase=”11W0

ozWN” go_dev_addr=xx:xx:xx:74:c0:a0 [PERSISTENT]

在persistent reconnect方法中,我们不会看到Phase-1阶段,如下所示: P2P Invitation过程

在Invitation的过程中,GO邀请GC或GC邀请GO形成一个P2P Group。P2P Invitation是一个可选的过程,主要有以下几种场景:

GO邀请一个P2P Device加入一个P2P group称为GC;P2P GC邀请另一个P2P Device加入P2P Group,该P2P GC是该P2P Group的成员,因为它希望使用该P2P Device的某些服务。请求调用Persistent P2P Group,这个Persistent P2P Group是之前配置了两个P2P设备且其中一个设备是GO。 下图是P2P invitation request帧,发送给persistent group中的P2P device,其中P2P Invitation flag被置为1。 如果Invitation request发给一个P2P device,不是persistent group,那么P2P invitation flag会被设置为0。如下图所示: 接下来看看来自GC的P2P Invitation Response帧,其中可以看到GO Configuration timeout会被设置为0。在GO邀请调用persistent group或GC邀请调用persistent group,我们能够看到相同的帧交换。 这里,P2P INVITATION RESPONSE CODES不同的值代表不同的含义,如下图所示: 当peer device没有回复Invitation Request时,status code为1,如下所示: 当一个P2P设备连接未知的P2P设备时,status code为8,如下所示: 当Invitation Procedure过程(即Group Formation)成功之后,GO会发送beacon帧,beacon帧中Persistent P2P Group位和Persistent Reconnect位会设置为1,如下所示: 在persistent group formation过程中,我们只能看到Phase-2阶段,因为设备在上次建立连接的Phase-1阶段就已经保存了credentials凭据。当Group再次创建的时候,设备将会再次使用上次保存的credentials凭据。所以我们只能看到Phase-2阶段。 至此,GO和GC之间将进行数据传输,数据通过AES-CCMP方式加密。

三、参考资料

P2P Group Formation Procedures – Negotiation Method – PART 1 P2P Group Formation Procedures – Negotiation Method – PART 2 P2P Group Formation Procedure – Autonomous Group Formation Method P2P Group Formation Procedure – Persistent Method

优惠劵

zhicpp

关注

关注

27

点赞

148

收藏

觉得还不错?

一键收藏

知道了

12

评论

WiFi Direct即P2P协议学习笔记

文章目录前言一、P2P的模型1.1 P2P的组成1.2 P2P的拓扑1.3 P2P并发模式1.4 功能和服务1.4.1 基本功能和服务1.4.2 P2P的特殊功能和服务1.4.3 P2P的两种地址二、P2P discovery阶段2.1 介绍2.2 P2P设备Discovery过程2.3前言在WiFi直连(WiFi Direct,也称为peer-to-peer,P2P)中,设备可以不通过AP(Access Point)进行连接。在P2P group中,称为GO(Group Owner)的设备具有像A

复制链接

扫一扫

专栏目录

Wifi-Direct-on-Linux:用于建立Wifi-Direct(Wifi P2P)连接的Python模块

02-06

wifid

在Linux上设置Wi-Fi Direct连接

Linux上的WiFi Direct

因此,我尝试使用Wifi-Direct连接两个设备。

一个是装有Linux的PC,另一个是Android智能手机。

我希望将Linux作为GO,将Android作为客户端。

为了建立Wifi-Direct连接,我制作了一个Python脚本以使用p2p选项启动wpa_supplicant和wpa_cli。

这就是在Linux中对我有效的方法。

wifid.py

它提供3个功能:

setup_conf_files()

start_as_go_fedora()

start_as_go

Wifi P2p点对点连接详解

即将秃头的吕同学的博客

04-21

5819

Wifi P2p的描述

Wifi P2P是在Android 4.0以及更高版本系统中加入的功能,通过Wifi P2P可以在不连接网络的情况下,直接与配对的设备进行数据交换。相对于蓝牙,Wifi P2P的搜索速度和传输速度更快,传输距离更远,底部的通讯原理是通过Binder通讯

二、Wifi P2p的开发步骤

1.在 AndroidManifest 中声明相关权限(网络和文件读...

12 条评论

您还未登录,请先

登录

后发表或查看评论

WIFI直连(Wi-Fi P2P)

Eric.Xi

12-10

902

Wifi peer-to-peer(也称Wifi-Direct)是Wifi联盟推出的一项基于原来WIfi技术的可以让设备与设备间直接连接的技术,使用户不需要借助局域网或者AP(Access Point)就可以进行一对一或一对多通信。这种技术的应用场景非常多,只要设备支持WiFiP2P的协议,就可以实现传文件,屏幕共享(Miracast),甚至是联机玩游戏,而周围没有任何可以上网的设备。

Android WiFi P2P数据传输

特立独行的博客

06-20

2056

WiFi Direct或WiFi P2P(Peer-to-Peer,点对点)是一种无线通信技术,允许设备之间直接进行点对点通信,而不需要连接到一个公共的网络中。使用WiFi P2P,设备可以发现彼此的存在并建立直接连接,这些连接可以是临时性的或长期的,这取决于应用程序需要的特定使用场景。使用WiFi P2P,可以实现像文件共享、多人游戏、流媒体传输等功能。在Android中,WiFi P2P可通过WifiP2pManager类和WifiP2pDevice类等API进行实现。

WIFI P2P (WIFI直连)源码解析

热门推荐

mr_x的博客

11-20

1万+

一:概述直接看看效果视频连接wifi直连是可以不用在WiFi环境下利用wifi传输数据的方式(当然在wifi环境下也可以)。

下面是wifi联盟的解释:并且这个wifi直连,并不是只是像蓝牙两台设备互联,可以3台及以上(没有测试过上限是多少台)。但是有个局限,就是必须其中一台设备担任groupowner角色。其他的设备担任peer角色。 1.groupowner角色就像时一台服务器。其他是设备需要

Go-P2P网络

08-14

在P2P网络环境中,彼此连接的多台计算机之间都处于对等的地位,各台计算机有相同的功能,无主从之分,一台计算机既可作为服务器,设定共享资源供网络中其他计算机所使用

WIFI P2P架构

htt789的博客

03-10

1774

WIFI P2P架构

WIFI P2P原理深入解析

baidu_33512336的博客

09-03

8810

前言

关于Wi-Fi联盟推出的另外一项重要技术规范WiFi P2P。 该规范的商品名为Wi-Fi Direct, 它支持多个Wi-Fi设备在没有AP的情况下相互连接.

在Android平台的Wi-Fi相关模块中, P2P的功能点主要集中在:

Android Framework中的WifiP2pService, 其功能和WifiService类似, 用于处理和P2P相关的工作。

wpa_supplicant中的P2P模块。

P2P基础知识

Wi-Fi P2P技术是Wi-Fi Displ...

深入理解Wi-Fi P2P

Android framework

05-08

2501

第7章 深入理解Wi-Fi P2P

本章所涉及的源代码文件名及位置

·W ifiP2pSettings.java

packages/ apps/ Settings/ src/ com/ android/ settings/ wifi/ p2p/ W ifiP2pSettings.java

·W ifiP2pService.java

frameworks/ base/ wifi/ java/ android/ net/ wifi/ p2p/ W ifiP2pService.java

·p2p_supplica

谈谈对WiFi P2P的理解

weixin_43932465的博客

08-03

8015

谈谈对WiFi P2P的理解概述P2P架构简介P2P Discovery介绍Device Discovery 流程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入

概述

Wifi peer-to-peer(也称Wifi-Di

WiFi 直连 WiFi Direct / WiFi P2P

02-03

Kemparaj Praneeth 关于 WiFi P2P 的相关博客文章

P2P Direct协议学习

10-26

P2P Direct协议学习

DirectDraw的学习笔记.doc

09-08

在使用 DirextDraw时,需要首先创建一个对象DirectDraw 的实体,该对象实体代表了微机显示适配器。然后,使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。...DirectDraw的学习笔记.doc

wlan标准协议收集(包含80211和p2p协议)

08-30

附件资源包含文件列表如下 802.11_interp.pdf 802.11-2007.pdf 802.11k-2008.pdf 802.11r-2008.pdf 802.11y-2008.pdf IEEE802.11-2012.pdf Wi-Fi_P2P_Technical_Specification_v1.7.pdf

STM32F072RB NUCLEO智能家居控制.7z

03-05

STM32F072RB NUCLEO智能家居控制.7zSTM32F072RB NUCLEO智能家居控制.7z

C++之动态规划问题汇总

最新发布

03-05

leetcode常见动态规划问题整理,包括解答和思路以及一些模式化的代码结构~

函数参考文档1.zip

03-05

函数参考文档1.zip

基于springboot+vue的网上购物商城系统研发(Java毕业设计,附源码,数据库).zip

03-05

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

wifi direct specification pdf

10-06

WiFi Direct规范PDF是指WiFi联盟开发的一种无线局域网技术规范的可供下载的PDF文档。

WiFi Direct是一种无线技术,用于在没有Wi-Fi接入点的情况下,设备之间直接建立无线连接。这意味着设备可以通过WiFi Direct功能直接进行通信和数据传输,而不需要通过路由器或其他中介设备。

WiFi Direct规范PDF是一份详细描述WiFi Direct技术的文件。它包含了WiFi Direct的工作原理、协议、连接设备的方法和相关配置等内容。该文档是为了帮助开发人员、设备制造商和服务提供商理解并实现WiFi Direct的标准化。

WiFi Direct规范PDF的重要性在于,它提供了一个统一的标准,使得不同厂商的设备可以互相兼容和互操作。开发人员可以根据该规范来开发适用于各种设备的WiFi Direct应用程序和服务。

此外,WiFi Direct规范PDF还可以帮助用户了解如何在支持WiFi Direct的设备上正确配置和使用该功能,以实现设备之间的直接通信和数据传输。

总之,WiFi Direct规范PDF是一份描述WiFi Direct技术的重要文档,它对于开发人员、设备制造商和用户来说都具有指导意义。

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

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

zhicpp

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

70

原创

5万+

周排名

175万+

总排名

18万+

访问

等级

1754

积分

49

粉丝

134

获赞

45

评论

416

收藏

私信

关注

热门文章

MATLAB max()函数报错“下标索引必须为正整数类型或逻辑类型。”

68435

C++ 中error: ‘exit’ was not declared in this scope 的解决方法

18334

WiFi Direct即P2P协议学习笔记

13483

Excel 2013 打开文件为灰色,解决办法

10393

Visual Studio 常用快捷键、字体、主题设置

8381

分类专栏

Git

4篇

WiFi Driver

3篇

啃啃csapp

3篇

踩坑记录

3篇

实用工具

1篇

面试题

4篇

Qt

1篇

操作系统

2篇

数据结构

6篇

设计模式

fastCGI

1篇

nginx

1篇

Linux网络编程

2篇

MongoDB

2篇

C++

18篇

Ubuntu

11篇

Python

2篇

MATLAB

2篇

软技能

2篇

机器学习

1篇

office

1篇

最新评论

WiFi Direct即P2P协议学习笔记

zhicpp:

WildPackets OmniPeek用得多点

WiFi Direct即P2P协议学习笔记

zhicpp:

WildPackets OmniPeek可以抓p2p对应信道上的包

WiFi Direct即P2P协议学习笔记

zhicpp:

DMG:Directional Multi-Gigabit

WiFi Direct即P2P协议学习笔记

qq_39679281:

大佬,请问DMG全称是啥意思呀

fcgi-2.4.1-SNAP-0910052249.tar.gz安装包,fastCGI安装过程

安琪郭:

感谢开源精神

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

配置alias实现快速生成.gitignore文件

80211 TIM流量指示图 附C语言实现

无线局域网WLAN的入门概念

2023年1篇

2022年3篇

2021年24篇

2020年31篇

2019年1篇

2018年12篇

目录

目录

分类专栏

Git

4篇

WiFi Driver

3篇

啃啃csapp

3篇

踩坑记录

3篇

实用工具

1篇

面试题

4篇

Qt

1篇

操作系统

2篇

数据结构

6篇

设计模式

fastCGI

1篇

nginx

1篇

Linux网络编程

2篇

MongoDB

2篇

C++

18篇

Ubuntu

11篇

Python

2篇

MATLAB

2篇

软技能

2篇

机器学习

1篇

office

1篇

目录

评论 12

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

百度知道 - 信息提示

百度知道 - 信息提示

百度首页

商城

注册

登录

网页

资讯

视频

图片

知道

文库

贴吧采购

地图更多

搜索答案

我要提问

百度知道>提示信息

知道宝贝找不到问题了>_

该问题可能已经失效。返回首页

15秒以后自动返回

帮助

 | 意见反馈

 | 投诉举报

京ICP证030173号-1   京网文【2023】1034-029号     ©2024Baidu  使用百度前必读 | 知道协议 

wifi中P2P的学习笔记 - 知乎

wifi中P2P的学习笔记 - 知乎切换模式写文章登录/注册wifi中P2P的学习笔记提高效率1,P2P discovery阶段让P2P设备快速查找周围的其他P2P设备,并建立连接。P2P discovery主要由以下几个部分组成:Device Discovery,让两个设备到达相同的信道并交换彼此的设备信息(例如设备名称和设备类型)。在P2P协议规范中,Device Discovery在1,6,11信道进行。Service Discovery,是一个可选特性,允许P2P设备在形成连接之前发现可用的上层服务。Group Formation,用于确定哪台设备时GO,并形成一个新的P2P Group。P2P Invitation,用于调用一个存在P2P Group或者邀请一个P2P设备加入这个Group。2,P2P的协商协商的时候只需要3帧的交互就可以成功,用的是owner intent,如果这个值是15,14,协商出来后本地就是GO。手机连接电视一般的协商结果手机是GO。这个是由wpa supplicant。3,P2P连接的大概过程https://blog.csdn.net/m0_38059875/article/details/122075907?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-122075907-blog-93714278.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-122075907-blog-93714278.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=6编辑于 2022-12-19 17:40・IP 属地天津Wi-Fi无线网络​赞同​​添加评论​分享​喜欢​收藏​申请

百度知道 - 信息提示

百度知道 - 信息提示

百度首页

商城

注册

登录

网页

资讯

视频

图片

知道

文库

贴吧采购

地图更多

搜索答案

我要提问

百度知道>提示信息

知道宝贝找不到问题了>_

该问题可能已经失效。返回首页

15秒以后自动返回

帮助

 | 意见反馈

 | 投诉举报

京ICP证030173号-1   京网文【2023】1034-029号     ©2024Baidu  使用百度前必读 | 知道协议 

版权声明:本文由最新下载tp安卓版发布,如需转载请注明出处。

本文链接:https://www.siyuewuyu.com/article/259.html