美文网首页
使用WiFi p2p做Service Discovery进行通信

使用WiFi p2p做Service Discovery进行通信

作者: changchengfeng | 来源:发表于2016-12-19 15:59 被阅读441次

    1.配置权限

    <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"/>
        ...
    

    2.加入本地服务

     manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
            channel = manager.initialize(this, getMainLooper(), null);
    
      //  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.
            manager.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
                }
            });
    
    

    3.注册监听服务

    final HashMap<String, String> buddies = new HashMap<String, String>();
    //可获取其他servece广播的信息
    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"));
                }
            };
    //可发现其他设备的信息
    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);
            }
        };
    
    manager.setDnsSdResponseListeners(channel, servListener, txtListener);
     
    

    4.查找服务

    //必须先进行addServiceRequest才能进行查找
     serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
            manager.addServiceRequest(channel, serviceRequest,
                    new ActionListener() {
    
                        @Override
                        public void onSuccess() {
                            appendStatus("Added service discovery request");
                        }
    
                        @Override
                        public void onFailure(int arg0) {
                            appendStatus("Failed adding service discovery request");
                        }
                    });
    
    manager.discoverServices(channel, new ActionListener() {
    
                @Override
                public void onSuccess() {
                    appendStatus("Service discovery initiated");
                }
    
                @Override
                public void onFailure(int arg0) {
                    appendStatus("Service discovery failed");
    
                }
            });
    
    

    5.连接服务

    在注册监听的时候当发现服务可用时会回调onDnsSdServiceAvailable方法中获取到WifiP2pDevice对象

     WifiP2pConfig config = new WifiP2pConfig();
            config.deviceAddress = device.deviceAddress;
            config.wps.setup = WpsInfo.PBC;
            if (serviceRequest != null)
                //连接时removeServiceRequest
                manager.removeServiceRequest(channel, serviceRequest,
                        new ActionListener() {
    
                            @Override
                            public void onSuccess() {
                            }
    
                            @Override
                            public void onFailure(int arg0) {
                            }
                        });
    
            manager.connect(channel, config, new ActionListener() {
    
                @Override
                public void onSuccess() {
                    appendStatus("Connecting to service");
                }
    
                @Override
                public void onFailure(int errorCode) {
                    appendStatus("Failed connecting to service");
                }
            });
    
    

    6.后续操作参考我的另外一篇文章

    android wifi 点对点传输

    相关文章

      网友评论

          本文标题:使用WiFi p2p做Service Discovery进行通信

          本文链接:https://www.haomeiwen.com/subject/chdtvttx.html