Wi-Fi P2P를 통해 서비스 제공하기

Android 2014. 3. 4. 13:45

- Wi-Fi P2P를 통해서 NSD와 같이 서비스를 검색할 수 있도록하는 방법이다.

- 이전 "Wi-Fi P2P 연결하기"와 동일한 퍼미션을 사용한다.

- 서비스를 등록하기 위해서 아래와 같이 addLocalService()를 호출한다. 아래에서 record는 클라이언트에 제공하는 데이터이다.

     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
           
}
       
});
   
}

- 주변에서 제공되는 서비스 검색을 요청할 때, 아래 2개의 Listener를 등록해서 Broadcast되는 서비스 정보를 저장한다.

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"));
           
}
       
};
   
...
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);
   
...
}

- 검색 요청은 아래 2개 메소드를 호출하면 된다.

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
                   
}
               
});
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(...)
                   
...
           
}
       
});


출처 : http://developer.android.com/

설정

트랙백

댓글