Connecting with Wi-Fi Direct

Wifi直连(p2p)一对多音频传输 利用Wifi p2p播放立体声 系统由一台播放器(服务器)和多台接收器(客户端)构成一个wifi直连的群组,服务器是群主(GO),客户端是组员(GC)。使用Wifi直连(p2p)构造一对多的系统是很方便实现的。 阅读详情

原文地址:http://blog.sina.com.cn/s/blog_819100560101a86s.html


Connecting with Wi-Fi Direct

     Wi-Fi Direct™ APIs允许应用连接周围的设备,而不用通过网络或者热点,点对点直接连接。应用可以快速的发现周围设备并与之交互,而有效作用距离大于蓝牙。

     以下内容关于如何通过Wi-Fi Direct™发现和连接周围设备:

第一步:权限问题 Set Up Application Permissions

在manifest里添加三个权限:

CHANGE_WIFI_STATE,

ACCESS_WIFI_STATE,

INTERNET 。

Wi-Fi Direct™不需要网络,但是需要java socket,而java socket需要INTERNET 权限。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.android.nsdchat"

    ...

    <uses-permission

        android:required="true"

        android:name="android.permission.ACCESS_WIFI_STATE"/>

    <uses-permission

        android:required="true"

        android:name="android.permission.CHANGE_WIFI_STATE"/>

    <uses-permission

        android:required="true"

        android:name="android.permission.INTERNET"/>

    ...

第二步:新建广播接收器和点对点管理器

Set Up a Broadcast Receiver and Peer-to-Peer Manager

     使用Wi-Fi Direct™,需要监听(broadcast intents)广播intent,当有特定的事件发生时,你的应用就会觉察到。

在app里实例化一个IntentFilter对象出来,将其设置为监听以下内容:

WIFI_P2P_STATE_CHANGED_ACTION
Indicates whether Wi-Fi Peer-To-Peer (P2P) is enabled----P2P功能是否打开
WIFI_P2P_PEERS_CHANGED_ACTION
Indicates that the available peer list has changed.----可连接peer改变
WIFI_P2P_CONNECTION_CHANGED_ACTION
Indicates the state of Wi-Fi P2P connectivity has changed.----P2P连接状态改变
WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
Indicates this device's configuration details have changed.----设备设置改变

private final IntentFilterintentFilter = new IntentFilter();
...
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //  Indicates a change in the Wi-Fi Peer-to-Peer status.
    intentFilter.
addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);

    // Indicates a change in the list of available peers.
    intentFilter.
addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);

    // Indicates the state of Wi-Fi P2P connectivity has changed.
    intentFilter.
addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);

    // Indicates this device's details have changed.
    intentFilter.
addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    ...
}

     在onCreate()方法最后,取得一个WifiP2pManager实例,调用它的initialize()方法,这个方法返回一个WifiP2pManager.Channel对象,这个后面用来连接app和Wi-Fi Direct Framework。

@Override

Channel mChannel;

public void onCreate(Bundle savedInstanceState) {
    ....
    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); //取得对象
    mChannel = mManager.initialize(this, getMainLooper(), null);   
}

     创建一个新的 BroadcastReceiver类,用来监听系统Wi-Fi P2P的变化状态,在 onReceive()方法里,增加condition条件来处理各种P2P状态的改变。 

 @Override
 public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();     //获取接收的intent里的action

        //以下进行判断,对各种不同的P2P状态改变,执行不同的代码
     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            // 检查 Wifi Direct模式是否开启
            int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
     if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                activity.setIsWifiP2pEnabled(true);   //开启则...
            } else {
                activity.setIsWifiP2pEnabled(false);   //未开启则...
            }
        }

     else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {

            // The peer list has changed!  We should probably do something about that.
      
    }

     else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {

            // Connection state changed!  We should probably do something about that.
          
}

      else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            DeviceListFragment fragment = (DeviceListFragment) activity.getFragmentManager()
                    .findFragmentById(R.id.frag_list);
            fragment.updateThisDevice((WifiP2pDevice) intent.getParcelableExtra(
                    WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));

        }
    }

      最后,当你 主activity 激活以后,添加代码在onResume()方法里注册 intent filter 和 broadcast receiver 。当你的activity paused的时候,在onPause()方法里对它们解除注册。

    @Override

    public void onResume() {
        super.onResume();
        receiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);
    
    registerReceiver(receiver, intentFilter);
    }

    @Override
    public void onPause() {
        super.onPause();      //调用父类方法
        unregisterReceiver(receiver);   //添加新的内容,解除注册
    }
 

第三步:开始peer发现   Initiate Peer Discovery

调用discoverPeers()方法,来发现周围的设备。这个方法需要2个参数:

1. WifiP2pManager.Channel

2. WifiP2pManager.ActionListener 的一个新的实现

 第一个参数是一个对象,第二个参数是内部类对象

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

        @Override
        public void onSuccess() {
            // Code for when the discovery initiation is successful goes here.
            // No services have actually been discovered yet, so this method
            // can often be left blank.  Code for peer discovery goes in the
            // onReceive method, detailed below.
        }

        @Override
        public void onFailure(int reasonCode) {
            // Code for when the discovery initiation fails goes here.
            // Alert the user that something went wrong.
        }
});

这只是启动peer discovery,方法discoverPeers()开始了发现线程,然后马上返回。如果peer discovery线程成功启动,系统就会注意到。发现一直持续直到建立连接或者建立一个P2P group。

 

第四步:获取peer 列表 Fetch the List of Peers

 首先实现WifiP2pManager.PeerListListener接口,这个接口提供了发现的peer的信息。

   private List peers = new ArrayList(); //装peer的list
    ...

    private PeerListListener peerListListener = new PeerListListener() {
        @Override
        public void onPeersAvailable(WifiP2pDeviceList peerList) {

            // Out with the old, in with the new.
            peers.clear();   //清空list,刷新
            peers.addAll(peerList.getDeviceList());

            // If an AdapterView is backed by this data, notify it
            // of the change.  For instance, if you have a ListView of available
            // peers, trigger an update.
            ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();

            //如果peers.size()=0,则没有发现peer
            if (peers.size() == 0) {
                Log.d(WiFiDirectActivity.TAG, "No devices found");
                return;
            }
        }
    }

 

修改broadcast receiver的onReceive()方法,当接收到一个action包含WIFI_P2P_PEERS_CHANGED_ACTION的Intent的时候,调用requestPeers()方法,

需要把监听器传入接收器,方法之一就是把listener传入broadcast receiver构造器。 

 

public void onReceive(Context context, Intent intent) {
    ...
    else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {

        // Request available peers from the wifi p2p manager. This is an
        // asynchronous call and the calling activity is notified with a
        // callback on PeerListListener.onPeersAvailable()
        if (mManager != null) {
            mManager.requestPeers(mChannel, peerListener);
        }
        Log.d(WiFiDirectActivity.TAG, "P2P peers changed");
    }...
}
 

    这样的话,一个intent的action是 WIFI_P2P_PEERS_CHANGED_ACTION 的时候,就会触发更新peer list的请求。

 第五步:连接peer:Connect to a Peer

     要连接peer,就要new一个新的 WifiP2pConfig对象,并把想连接的peer的信息写入,最后调用 connect()方法。

  @Override
    public void connect() {
        // Picking the first device found on the network.
        WifiP2pDevice device = peers.get(0);

       WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = device.deviceAddress;
        config.wps.setup = WpsInfo.PBC;

        mManager.connect(mChannel, config, new ActionListener() {

            @Override
            public void onSuccess() {
                // WiFiDirectBroadcastReceiver will notify us. Ignore for now.
            }

            @Override
            public void onFailure(int reason) {
                Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }

     WifiP2pManager.ActionListener只是负责通知peer initiation是否成功,要监听P2P状态改变的话,就要实现WifiP2pManager.ConnectionInfoListener,它的onConnectionInfoAvailable()回调方法会在P2P状态改变时做出反应。在多个设备需要连接同一个设备的情况下,有一个设备会被指定为“group owner“。

   @Override

    public void onConnectionInfoAvailable(final WifiP2pInfo info) {

        // InetAddress from WifiP2pInfo struct.

        InetAddress groupOwnerAddress = info.groupOwnerAddress.getHostAddress());


        // After the group negotiation, we can determine the group owner.

        if (info.groupFormed && info.isGroupOwner) {

            // Do whatever tasks are specific to the group owner.

            // One common case is creating a server thread and accepting

            // incoming connections.

        } else if (info.groupFormed) {

            // The other device acts as the client. In this case,

            // you'll want to create a client thread that connects to the group

            // owner.

        }

    }

返回到 broadcast receiver里的 onReceive()方法,修改下, 接收到WIFI_P2P_CONNECTION_CHANGED_ACTION 这个intent的时候,调用requestConnectionInfo()方法。

..

        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {

      if (mManager == null) {

                return;

            }

   NetworkInfo networkInfo = (NetworkInfo) intent

                    .getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);

            if (networkInfo.isConnected()) {

                // We are connected with the other device, request connection

                // info to find group owner IP

                mManager.requestConnectionInfo(mChannel, connectionListener);

            }

            ...

 

 

 

 

 

 

 

 

 

 

 

 

Wio Terminal基于Blynk平台实现无线OTA更新的完整实践指南 OTA(空中下载技术)是物联网设备实现远程固件升级的核心机制,其原理是通过无线网络将新固件安全传输至设备端,完成本地烧录与版本切换。这项技术对于提升设备可维护性、降低现场维护成本具有重要价值,广泛应用于智能家居、工业监测、环境传感等需要长期部署与功能迭代的场景。在嵌入式开发中,OTA的实现涉及网络连接稳定性、存储空间管理、更新流程设计等关键工程实践。本文以Wio Terminal硬件平台和Blynk物联网云服务为例,深入解析如何构建一个健壮的OTA解决方案,涵盖从基础连接到异常处理、安全考量等全流程,并重点 阅读详情

相关推荐

Jetson TK1无线联网指南:Intel 7260驱动安装与射频调试

Wi-Fi驱动在嵌入式Linux中并非简单安装即可运行,而是固件加载、内核模块绑定和用户空间配置三层协同的结果。以Intel 7260为例,其依赖iwlwifi驱动与linux-firmware微码,需确保固件版本兼容、PCIe硬件识别正常、射频使能状态有效。该方案在ARM架构的Jetson TK1上具有突出的主线内核支持与社区成熟度,是老旧嵌入式平台实现稳定无线连接的典型技术路径。本文围绕硬件兼容性、固件加载机制、NetworkManager接管逻辑等核心环节,提供可复现的分层验证方法与高频问题闭环排查策

weixin_33688840的博客 453

Using Wi-Fi Direct for Service Discovery 直接使用Wi-Fi服务发现

Using Network Service Discovery, showed you how to discover services that are connected to a local network. However, using Wi-Fi Direct&trad; Service Discovery allows you to discover the services of n

曹浩洋的专栏 1932

Codex本地安装全平台避坑指南:绕过官网访问与系统拦截

Codex作为一款面向开发者的本地AI编程代理工具,依托Llama 3、DeepSeek-Coder等开源模型实现代码理解与生成,其核心价值在于离线可用、隐私可控和模型可替换。技术原理上,它通过Ollama/vLLM加载GGUF格式模型,由Electron/Tauri封装前端交互,形成端到端的本地智能编码工作流。在实际落地中,‘ofox.io无法访问’和‘安装包报错’成为高频阻塞点,本质是SNI识别拦截、二进制签名缺失与运行时依赖不兼容三重问题叠加所致。本文聚焦真实工程场景,覆盖macOS Gatekeep

weixin_34295316的博客 360

WI-FI Direct关键机制和重要功能

WiFi直连的关键机制 设备发现(强制):包括两个阶段:侦听与搜索(在该阶段确保两台正处于设备发现的WiFi直连设备处于同一条信道)侦听状态下,设备将收到含有WiFi直连信息成分的搜索请求,探测设备响应侦听设备之后便可以在设备列表中显示侦听到的设备的信息了。 服务发现(可选):告知其他WiFi直连设备,其他WiFi直连认证的设备在一定范围中可以查看其他设备发来的请求。 小组构建(强制)

weixin_36059247的博客 1205

COMSOL 6.3企业级部署:安装、验证与NUMA感知性能调优

COMSOL作为主流多物理场仿真平台,其安装配置远超常规软件——本质是面向HPC环境的系统级工程。理解Java运行时兼容性、MPI并行架构、GPU加速依赖链及许可证协议机制,是保障求解器稳定高效运行的前提。尤其在Windows Server/专业版环境下,TLS策略冲突、NUMA内存绑定失效、驱动版本错配等确定性故障,会直接导致加速比断崖式下跌。本文聚焦COMSOL 6.3真实部署场景,结合OpenMPI 4.0迁移与Parallel Meshing Engine v2特性,解析从系统准备、静默安装、许可证

weixin_33860553的博客 528

Wi-Fi display and Wi-Fi direct

详细介绍了Wi-Fi direct/display的定义以及他们之间的区别和联系,分别介绍了他们的特点以及在生活中的应用。

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

首先感谢各位兄弟姐妹们的耐心等待。根据今天得到的消息,本书预计在下周各大网店提供预订。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。注意,如下是本章目录,本文节选7.1~7.2.2 7.4~7.4.1.2节,7.5 为了方便读者深入学习,本系列连载都会将作者研究过  程中所学习的参考文献列出来                第七章  深入理解Wi-Fi P2P     本章主要

Innost的专栏 4万+

【UE5】三步搞定Pixel Streaming:从零搭建Windows像素流服务

本文详细介绍了如何在Windows平台上快速搭建UE5 Pixel Streaming像素流服务,从插件安装、项目打包到服务启动的全流程操作。通过实战案例和优化配置,帮助开发者实现零客户端配置、跨设备兼容的高性能3D应用流式传输,特别适合建筑可视化和实时协作场景。

weixin_29000991的博客 318

Connecting with Wi-Fi Direct 与Wi-Fi直接连接

The Wi-Fi Direct™ APIs allow applications to connect to nearby devices without needing to connect to a network or hotspot. This allows your application to quickly find and interact with nearby devices

曹浩洋的专栏 2298

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9228

Unity Android log view(Android Debug Bridge)

Android Debug Bridge

蛰伏--当你不够强大时,就不要放弃努力 4154

计数译码驱动显示电路实验报告_京东方G0A电路、阵列基板、显示 装置及驱动方法广州威彩...

图1、实施例二所述的选择子单元的结构示意图图2、实施例四所述的GOA电路结构示意图图3、实施例七所述的阵列基板的局部结构示意图图4、实施例所述的极性反转驱动方法的第一场的各信号时序图图5、实施例所述的极性反转驱动方法的第二场的各信号时序图图6、实施例所述的极性反转驱动方法的第三场的各信号时序图图7、实施例所述的极性反转驱动方法的第四场的各信号时序图图8、为图4所示时序下,实施例八所述显示...

weixin_35696112的博客 924

window11使用wsl2下载编译android 8代码,并用emulator运行

博主需要使用android 8代码进行学习,电脑环境window11,踩了很多坑才完成了android 8的代码下载编译运行,在此做记录。如遇到网络问题,一般使用清华源或者中科源。博主生活在中原地区,离中科源更近,所以优先使用的中科源。

xunyan6234的博客 511

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2727

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6476

Wifi Direct技术是Wi-Fi产业链向蓝牙技术发起的挑战,它试图完全取代蓝牙.

第一,Wi-Fi Direct是一种点对点连接技术,它可以在两台station之间直接建立tcp/ip链接,并不需要AP的参与;其中一台station会起到传统意义上的AP的作用,称为Group Owner(GO),另外一台station则称为Group Client(GC),像连接AP一样连接到GO。GO和GC不仅可以是一对一,也可以是一对多;比如,一台GO可以同时连接着多台GC 当前,已

shenfumin的专栏 3038

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 609

WiFi Direct简介

Wi-Fi Direct技术是由WFA(Wi-Fi联盟)在2009年提出,目前最新的规范是v1.2版本。这个技术的目的是在没有Wi-Fi AP的情况下由两个或者多个Wi-Fi设备互相之间进行高速的数据通信。通信完全基于TCP/IP 协议,因此对于开发基于Wi-Fi Direct的应用来说非常友好。 Wi-Fi Direct在刚提出时叫Wi-Fi Peer-to-Peer,所以也可以称

杜远的专栏 4224

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

第五章 WiFi服务启动流程

系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、Wi-Fi服务是什么?二、Wi-Fi服务启动流程总结 前言 Android系统服务都是运行在system_server进程,Wi-Fi服务是众多系统服务中的一个,也是在system_server进程启动时初始化好后应用通过bin der IPC

Frank.Zhang的专栏 2871

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Wi-Fi Direct

Wi-Fi Direct 目录 简介 认证标志 特点 优缺点 相关介绍 编辑本段简介 2010年10月,Wi-Fi Alliance(wi-fi联盟)发布Wi-Fi Direct白皮书,白皮书中介绍了有关于这种技术的基本信息、这种技术的特点和这种技术的功能,Wi-Fi Direct标准是指允许无线网络中的设备无需通过无线路由器

flymachine的专栏 1639

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WiFi Direct详解(p2p使能,扫描,连接流程)基于Android8.1.0

简介:Wi-Fi Direct技术的目的是在没有Wi-Fi AP的情况下由两个或者多个Wi-Fi设备互相之间进行高速的数据通信。通信完全基于TCP/IP 协议,因此对于开发基于Wi-Fi Direct的应用来说非常友好。 Wi-Fi Direct在刚提出时叫Wi-Fi Peer-to-Peer,所以也可以称作Wi-Fi P2P。它的主要竞争对手是Blue Tooth,在目前看来Wi-Fi Dire...

一个Android菜鸟的博客 2万+

BroadcastReceiver注册、发送、接收源码分析

BroadcastReceiver包括两方面,一是广播的注册过程,二是广播的发送和接收过程。 首先要定义一个广播的接受者,只需要集成BroadcastReceiver,并重写它的onReceiver()方法就可以了,在该方法内不要做超过10ms的耗时工作。 注册广播接受者有两种方式; 一是在AndroidManifest文件中静态注册: 二是在代码中动态注册,采用registerRecei

JoneRen的博客 1942
上一篇: Android环境搭建及开发利器
下一篇: keystore相关 (java)
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值