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

简介: 原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/nsd-wifi-direct.html本阶段的第一节课 Using Network Service Discovery 展示了如何搜索本地网络服务。

原文地址: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-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"/>
    ...

添加本地服务

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

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

     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() {
            @Override
            public void onSuccess() {
                // Command successful! Code isn't necessarily needed here,
                // Unless you want to update the UI or add logging statements.
            }
            @Override
            public 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记录建立连接。一旦两个监听器都已经实现,那么将它们添加到WifiP2pManagersetDnsSdResponseListeners()方法中即可。

private void discoverService() {
...
    DnsSdServiceResponseListener servListener = new DnsSdServiceResponseListener() {
        @Override
        public 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() {
                    @Override
                    public void onSuccess() {
                        // Success!
                    }
                    @Override
                    public void onFailure(int code) {
                        // Command failed.  Check for P2P_UNSUPPORTED, ERROR, or BUSY
                    }
                });

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

        mManager.discoverServices(channel, new ActionListener() {
            @Override
            public void onSuccess() {
                // Success!
            }
            @Override
            public void onFailure(int code) {
                // Command failed.  Check for P2P_UNSUPPORTED, ERROR, or BUSY
                if (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

    由于内部错误造成操作失败
目录
相关文章
|
14天前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
6天前
|
监控 网络架构 Windows
第六十八章 使用 Web 服务监控 IRIS - 监控网络客户端
第六十八章 使用 Web 服务监控 IRIS - 监控网络客户端
6 0
|
6天前
|
云安全 安全 网络安全
云端防御策略:融合云服务与网络安全的未来之路
【5月更文挑战第23天】随着企业纷纷拥抱云计算以提升灵活性和效率,网络安全问题也愈发凸显。本文深入探讨了在动态的云环境中维护信息安全的挑战,并提出了一个多层次、融合式的安全框架,以保障数据完整性和服务可用性。我们将从云服务的分类出发,分析各类服务模型(IaaS, PaaS, SaaS)所面临的独特安全威胁,并结合最新的加密技术、身份认证机制以及入侵检测系统来构建一个全面的安全策略。文章最终目的是为读者提供一个明确的指南,用以评估和强化其云基础设施的安全防御能力。
|
6天前
|
边缘计算 数据中心 云计算
边缘网络加速服务
边缘网络加速服务
12 0
|
9天前
|
监控 安全 网络安全
云端防御策略:融合云服务与网络安全的未来之路
【5月更文挑战第20天】 在数字化时代,云计算为企业提供了灵活性、可扩展性和成本效益,但同时也带来了前所未有的安全挑战。本文探讨了如何通过融合云服务和网络安全技术来构建一个安全稳固的云环境。我们将重点讨论云安全的关键领域,包括数据加密、身份管理、威胁检测与响应,以及合规性监控。通过深入分析这些技术领域的最新进展,我们旨在为读者提供一个关于如何在享受云服务带来的便利的同时确保信息安全的综合视角。
|
9天前
|
监控 安全 网络安全
云端防御:融合云服务与网络安全的信息安全策略
【5月更文挑战第20天】 随着企业加速数字化转型,云计算已成为支撑现代业务架构的关键。然而,数据和应用的云端迁移也带来了前所未有的安全挑战。本文探讨了在动态且复杂的云环境中,如何构建一个全面的网络安全策略来确保信息的完整性、保密性和可用性。通过分析云服务模型、网络安全技术以及最佳实践,我们提出了一系列创新措施,以帮助企业在享受云计算带来的便利的同时,有效防御潜在的网络威胁。
|
11天前
|
域名解析 网络协议 网络性能优化
如何提升自建DNS服务下的网络体验
网络质量和网络体验是通信过程中的两个不同层面,质量涉及设备上下行表现,而体验关乎端到端通信效果。衡量质量常用带宽、延迟、丢包率等指标;体验则关注可访问性,DNS解析速度和服务位置等。现代路由器能自动调整网络质量,普通用户无需过多干预。自建DNS服务时,选择权威DNS能解决可访问性,但可能不提供最优体验。AdguardHome和Clash等工具能进一步优化DNS解析,提升网络体验。
42 6
如何提升自建DNS服务下的网络体验
|
11天前
|
云安全 安全 网络安全
云端防御策略:融合云服务与网络安全的未来之路
【5月更文挑战第18天】 在数字化浪潮的推动下,企业纷纷将业务迁移至云端以追求更高效率和灵活性。然而,随着数据和服务的集中,安全威胁也随之增加。本文探讨了云计算环境下的安全挑战,分析了当前云服务中存在的安全隐患,并提出了一系列创新的网络安全防护措施。这些措施旨在帮助组织构建一个既灵活又安全的云环境,确保信息资产的完整性、保密性和可用性得到充分保护。
|
12天前
|
JSON Android开发 数据格式
Android框架-Google官方Gson解析,android开发实验报告总结
Android框架-Google官方Gson解析,android开发实验报告总结
|
14天前
|
运维 安全 网络安全
云端防御策略:融合云服务的网络安全新范式
【5月更文挑战第15天】 随着企业逐渐将关键业务迁移至云平台,云计算服务的安全性成为维护信息安全的前沿阵地。本文深入探讨了云服务模型中的网络安全挑战与对策,分析了在公有云、私有云和混合云环境下,如何通过创新的安全架构和技术手段强化数据保护和威胁防御。文章着重讨论了多租户环境中的数据隔离问题、云安全访问控制的最新进展以及针对云环境的安全运维管理实践。通过综合分析,提出了一个多层次、动态适应的安全框架,旨在为云服务用户提供一个更加安全、可靠的计算环境。

热门文章

最新文章