Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务

原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/nsd-wifi-direct.html

本阶段的第一节课 Using Network Service Discovery 展示了如何搜索本地网络服务。然而,使用WI-FI P2P搜索服务可以直接搜索附近的设备,而不需要专门通过本地网络。这项特性使得在没有本地网络或者热点的情况下还可以在不同的设备间进行通信。

虽然这里的API与NSD的API的目的很相似,但是实现的过程却完全不同。这节课展示了如何通过WI-FI P2P网络来搜索附近的可用服务。这节课建立在已经对Wi-Fi P2P API熟悉的基础之上。

设置清单文件

如果要使用WI-FI P2P技术,需要在程序的清单文件中添加CHANGE_WIFI_STATE, ACCESS_WIFI_STATE, INTERNET三项权限。虽然Wi-Fi P2P并不需要互联网连接,但是它需要使用标准的Java Socket通讯技术,所以需要使用INTERNET权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android.nsdchat"...<uses-permissionandroid: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"/>...

添加本地服务

如果程序提供了本地服务,还需要将该服务注册到搜索服务中。一旦本地服务完成注册,那么框架会自动的响应另一端点的搜索服务请求。

创建本地网络有以下过程:

  • 1.创建一个WifiP2pServiceInfo对象。
  • 2.将服务的相关信息填入其中。
  • 3.调用addLocalService()方法完成本地服务注册。
     private void startRegistration() {//  Create a string map containing information about your service.Map record = new HashMap();record.put("listenport", String.valueOf(SERVER_PORT));record.put("buddyname", "John Doe" + (int) (Math.random() * 1000));record.put("available", "visible");// Service information.  Pass it an instance name, service type// _protocol._transportlayer , and the map containing// information other devices will want once they connect to this one.WifiP2pDnsSdServiceInfo serviceInfo =WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record);// Add the local service, sending the service info, network channel,// and listener that will be used to indicate success or failure of// the request.mManager.addLocalService(channel, serviceInfo, new ActionListener() {@Overridepublic void onSuccess() {// Command successful! Code isn't necessarily needed here,// Unless you want to update the UI or add logging statements.}@Overridepublic void onFailure(int arg0) {// Command failed.  Check for P2P_UNSUPPORTED, ERROR, or BUSY}});}

搜索附近的服务

Android会使用回调方法来通知应用程序有可用的服务,所以首先要做的就是设置该回调。创建一个WifiP2pManager.DnsSdTxtRecordListener来监听传入的记录。这个记录由其它设备随意广播。当其中一条记录到达时,会将该设备的地址及其它相关的信息拷贝到一个外部的数据结构中,这样的话就可以晚一些访问。下面的代码假设这个记录包含一条”buddyname”的属性,用于识别用户的身份。

final HashMap<String, String> buddies = new HashMap<String, String>();
...
private void discoverService() {DnsSdTxtRecordListener txtListener = new DnsSdTxtRecordListener() {@Override/* Callback includes:* fullDomain: full domain name: e.g "printer._ipp._tcp.local."* record: TXT record dta as a map of key/value pairs.* device: The device running the advertised service.*/public void onDnsSdTxtRecordAvailable(String fullDomain, Map record, WifiP2pDevice device) {Log.d(TAG, "DnsSdTxtRecord available -" + record.toString());buddies.put(device.deviceAddress, record.get("buddyname"));}};...
}

如要获取服务的相关信息,需要创建一个WifiP2pManager.DnsSdServiceResponseListener接口。 这个接口会接收实际的连接信息。上面代码段中的Map对象将设备的地址与”buddy name”组成了键值对。服务响应监听器利用这项特性与DNS记录建立连接。一旦两个监听器都已经实现,那么将它们添加到WifiP2pManager的setDnsSdResponseListeners()方法中即可。

private void discoverService() {
...DnsSdServiceResponseListener servListener = new DnsSdServiceResponseListener() {@Overridepublic void onDnsSdServiceAvailable(String instanceName, String registrationType,WifiP2pDevice resourceType) {// Update the device name with the human-friendly version from// the DnsTxtRecord, assuming one arrived.resourceType.deviceName = buddies.containsKey(resourceType.deviceAddress) ? buddies.get(resourceType.deviceAddress) : resourceType.deviceName;// Add to the custom adapter defined specifically for showing// wifi devices.WiFiDirectServicesList fragment = (WiFiDirectServicesList) getFragmentManager().findFragmentById(R.id.frag_peerlist);WiFiDevicesAdapter adapter = ((WiFiDevicesAdapter) fragment.getListAdapter());adapter.add(resourceType);adapter.notifyDataSetChanged();Log.d(TAG, "onBonjourServiceAvailable " + instanceName);}};mManager.setDnsSdResponseListeners(channel, servListener, txtListener);...
}

接下来需要创建一个新的服务请求,然后将其作为参数调用addServiceRequest()方法,这个方法同样需要一个监听器来反应成功还是失败。

        serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();mManager.addServiceRequest(channel,serviceRequest,new ActionListener() {@Overridepublic void onSuccess() {// Success!}@Overridepublic void onFailure(int code) {// Command failed.  Check for P2P_UNSUPPORTED, ERROR, or BUSY}});

最后,调用discoverServices()方法开始搜索服务。

        mManager.discoverServices(channel, new ActionListener() {@Overridepublic void onSuccess() {// Success!}@Overridepublic void onFailure(int code) {// Command failed.  Check for P2P_UNSUPPORTED, ERROR, or BUSYif (code == WifiP2pManager.P2P_UNSUPPORTED) {Log.d(TAG, "P2P isn't supported on this device.");else if(...)...}});

如果上面的都已经完成,那么可以喊一声哈利路亚了,已经完成了所有的步骤。如果遇到了问题,寻找那个将WifiP2pManager.ActionListener作为参数的方法,这个回调方法会告知程序是成功还是失败。如果要解决这个问题,请将调试代码放入onFailure()方法中。方法所提供的错误代码会告知问题所在。下面是可能出现的错误代码以及它们的解释:

P2P_UNSUPPORTED

    当前设备不支持Wi-Fi P2P

BUSY

    系统处于繁忙处理状态

ERROR

    由于内部错误造成操作失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全栈深度学习第2期: 开发套件与工具篇

一起追剧鸭简介Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目&#xff0c;通过微信群为同期追剧的小伙伴提供交流平台。关于该计划的详请见这里。1. Berkeley深度学习追剧群目前已有1000小伙伴加入&#xff0c;公众号后台回复口令 深度学习追剧 入群…

LeetCode 700. 二叉搜索树中的搜索

1. 题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 NULL。 2. 解题 class Solution {//递归写法TreeNode *ans NULL; public:TreeNode* searchB…

NLP-美团技术团队(搜索-推荐-召回排序-Bert)

NLP-美团技术团队&#xff1a;https://tech.meituan.com/tags/nlp.html

iOS系统中导航栏的转场解决方案与最佳实践

背景 目前&#xff0c;开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案&#xff0c;但对于历史包袱沉重的美团 App 而言&#xff0c;这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景&#xff0c;有的方案迁移成本较大&#xff0c;为此我们提出了一套解决方案…

论文浅尝 - WSDM20 | 基于弱监督及逐步推理的多关系知识图谱问答

论文笔记整理&#xff1a;刘晓臻&#xff0c;东南大学计算机科学与工程学院本科生。来源&#xff1a;WSDM ’20链接&#xff1a;https://dl.acm.org/doi/abs/10.1145/3336191.3371812动机知识图谱问答(KG-QA)系统大多包含两个步骤&#xff1a;链接问题中的topic entity到KG&…

Android官方开发文档Training系列课程中文版:网络操作之网络连接

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/network-ops/index.html 引言 这节课将会学习最基本的网络连接&#xff0c;监视网络连接状况及网络控制等内容。除此之外还会附带描述如何解析、使用XML数据。 这节课所包含的示例代码演示了最基本的网络操…

算法工程师的落地能力具体指的是什么?

文 | 桔了个仔知乎本文已获作者授权&#xff0c;禁止二次转载大家好&#xff0c;这里是桔了个仔&#xff0c;目前是一名Data Scientist(不太想翻译成数据科学家&#xff0c;毕竟感觉自己就是个工程师&#xff09;&#xff0c;过去几年在做基于机器学习的风控与合规系统&#xf…

国内外自然语言处理(NLP)研究组

2015年国内外自然语言处理(NLP)研究组&#xff1a; https://blog.csdn.net/wangxinginnlp/article/details/44890553 补充&#xff1a; 名称 地址 最近更新 HanLP https://github.com/hankcs/HanLP 2天前 腾讯开源深度学习文本分类工具 https://github.com/Tencent/NeuralNLP-…

Android官方开发文档Training系列课程中文版:网络操作之网络管理

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/network-ops/managing.html 这节课将会学习如何对网络资源的使用情况拥有更细粒度的控制力。如果应用程序经常执行大量的网络操作&#xff0c;那么程序应当提供一项设置&#xff0c;以便用户可以控制应用的数…

LeetCode 728. 自除数

1. 题目 自除数 是指可以被它包含的每一位数除尽的数。 例如&#xff0c;128 是一个自除数&#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 还有&#xff0c;自除数不允许包含 0 。 给定上边界和下边界数字&#xff0c;输出一个列表&#xff0…

论文浅尝 - AAAI2020 | 通过句子级语义匹配和答案位置推断改善问题生成

论文笔记整理&#xff1a;王春培&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/1912.00879.pdf动机本文主要聚焦问答系统&#xff08;Q&A&#xff09;的反问题---问题生成&#xff08;Question Generation&#xff0c;Q&G&#xff09;。问题生成的…

美团深度学习系统的工程实践

背景 深度学习作为AI时代的核心技术&#xff0c;已经被应用于多个场景。在系统设计层面&#xff0c;由于其具有计算密集型的特性&#xff0c;所以与传统的机器学习算法在工程实践过程中存在诸多的不同。本文将介绍美团平台在应用深度学习技术的过程中&#xff0c;相关系统设计的…

一个程序员的理财观

文 | 王喆你好&#xff0c;我叫王喆&#xff0c;看过我技术文章的朋友知道&#xff0c;我是一个搞推荐系统的机器学习工程师&#xff0c;不熟悉的同学也没关系&#xff0c;就当我是一名普普通通的程序员就好。但今天我们不谈技术&#xff0c;也不谈996这些烦人的话题&#xff0…

Android官方开发文档Training系列课程中文版:网络操作之XML解析

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/network-ops/xml.html 扩展标记语言(XML)是一系列有序编码的文档。它是一种很受欢迎的互联网数据传输格式。像需要频繁更新内容的网站来说&#xff0c;比如新闻站点或者博客&#xff0c;需要经常更新它们的X…

2020年最值得收藏的60个AI开源工具

原本链接:https://www.infoq.cn/article/2uabiqaxicqifhqikeqw 本文&#xff0c;InfoQ梳理了60个2019年至今GitHub上热门的开源工具&#xff0c;献给那些对新征程满怀期待的开发者们。Flair (顶级 NLP 库&#xff09;2018 年是 NLP 井喷的一年。像 ELMo 和谷歌 BERT 这样的库层…

LeetCode 942. 增减字符串匹配

1. 题目 给定只含 “I”&#xff08;增大&#xff09;或 “D”&#xff08;减小&#xff09;的字符串 S &#xff0c;令 N S.length。 返回 [0, 1, …, N] 的任意排列 A 使得对于所有 i 0, …, N-1&#xff0c;都有&#xff1a; 如果 S[i] "I"&#xff0c;那么…

Netty堆外内存泄露排查盛宴

导读 Netty 是一个异步事件驱动的网络通信层框架&#xff0c;用于快速开发高可用高性能的服务端网络框架与客户端程序&#xff0c;它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。 Netty 底层基于 JDK 的 NIO&#xff0c;我们为什么不直接基于 JDK 的 NIO 或者其他NIO框架…

论文浅尝 - ESWC2020 | YAGO 4: A Reason-able Knowledge Base

论文笔记整理&#xff1a;叶群&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。会议&#xff1a;ESWC 2020链接&#xff1a;https://suchanek.name/work/publications/eswc-2020-yago.pdfIntroductionYAGO是世界上最大的链接数据库之一&#xff0c;由德国马普研…

责任链模式在Android中的应用

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 责任链其实在Android中出现的频率还蛮高的&#xff0c;事件传递就是一种责任链机制。接下来我为大家介绍在开发应用时责任链的用处&#xff1a; 1.触摸事件的应用。2.响应事件的应用。 何为责任…

sklearn网格搜索找寻最优参数

大家好&#xff0c;在机器学习中&#xff0c;调参是一个非常重要的步骤&#xff0c;它可以帮助我们找到最优的模型参数&#xff0c;从而提高模型的性能。然而&#xff0c;手动调参是一项繁琐且耗时的工作&#xff0c;因此需要一种自动化的方法来搜索最佳参数组合。在这方面&…