2017-03-13 54 views
0

我得到了一個wifidirect應用程序,成功地發現並連接到同行,我「附加」該應用程序到我正在開發的另一個應用程序。該應用程序應該通過藍牙控制機器人,並同時通過Wifidirect進行交流,它有一個「播放按鈕」,當它被點擊時,它會轉到另一個活動,該活動有兩個片段,一個是第一個出現的片段點擊「播放」按鈕並強制用戶連接到對等體(即,我是連接到wifidirect應用程序)後,連接到第二個片段後,此片段具有遊戲界面,它具有所有藍牙部分(連接和控制機器人)。Wifidirect發現沒有找到同行

總結:第一個活動有一個播放按鈕,點擊按鈕,它會進入第二個活動並顯示兩個片段。第二項活動必須連接到Wifidirect的同伴,然後必須通過藍牙連接並控制機器人。

在第二個活動是發生Wi-Fi直連和藍牙交際的同時(彆扭......我知道)

我的問題:如果我只使用Wi-Fi直連應用程序,它searchs併成功地但與連接「融合「這兩個應用程序,它只是永遠搜索,沒有發現任何東西。任何想法發生什麼?也許很多通信或在同一活動中發生的許多事情?如果我感到困惑,請告訴我。

我Wifidiscovery活動:

public class WiFiServiceDiscoveryActivity extends Activity implements 
    DeviceClickListener, Handler.Callback, MessageTarget, 
    ConnectionInfoListener { 

public static final String TAG = "wifidirectdemo"; 

// TXT RECORD properties 
public static final String TXTRECORD_PROP_AVAILABLE = "available"; 
public static final String SERVICE_INSTANCE = "_wifidemotest"; 
public static final String SERVICE_REG_TYPE = "_presence._tcp"; 

public static final int MESSAGE_READ = 0x400 + 1; 
public static final int MY_HANDLE = 0x400 + 2; 
private WifiP2pManager manager; 

static final int SERVER_PORT = 4545; 

private final IntentFilter intentFilter = new IntentFilter(); 
private Channel channel; 
private BroadcastReceiver receiver = null; 
private WifiP2pDnsSdServiceRequest serviceRequest; 

private Handler handler = new Handler(this); 
private jogar chatFragment; 
private WiFiDirectServicesList servicesList; 

private TextView statusTxtView; 
Button botaorecomecar; 

public Handler getHandler() { 
    return handler; 
} 

public void setHandler(Handler handler) { 
    this.handler = handler; 
} 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    statusTxtView = (TextView) findViewById(R.id.status_text); 
    botaorecomecar = (Button) findViewById(R.id.botaorecomecar); 

    intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 
    intentFilter 
      .addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
    intentFilter 
      .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 

    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
    channel = manager.initialize(this, getMainLooper(), null); 
    startRegistrationAndDiscovery(); 

    servicesList = new WiFiDirectServicesList(); 
    getFragmentManager().beginTransaction() 
      .add(R.id.container_root, servicesList, "services").commit(); 

    botaorecomecar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = getIntent(); 
      finish(); 
      startActivity(intent); 
     } 


    });} 





@Override 
protected void onRestart() { 
    Fragment frag = getFragmentManager().findFragmentByTag("services"); 
    if (frag != null) { 
     getFragmentManager().beginTransaction().remove(frag).commit(); 
    } 
    super.onRestart(); 
} 

@Override 
protected void onStop() { 
    if (manager != null && channel != null) { 
     manager.removeGroup(channel, new ActionListener() { 

      @Override 
      public void onFailure(int reasonCode) { 
       Log.d(TAG, "Disconecção falhada. Razão: :" + reasonCode); 
      } 

      @Override 
      public void onSuccess() { 
      } 

     }); 
    } 
    super.onStop(); 
} 

/** 
* Registers a local service and then initiates a service discovery 
*/ 
private void startRegistrationAndDiscovery() { 
    Map<String, String> record = new HashMap<String, String>(); 
    record.put(TXTRECORD_PROP_AVAILABLE, "visivel"); 

    WifiP2pDnsSdServiceInfo service = WifiP2pDnsSdServiceInfo.newInstance(
      SERVICE_INSTANCE, SERVICE_REG_TYPE, record); 
    manager.addLocalService(channel, service, new ActionListener() { 

     @Override 
     public void onSuccess() { 
      appendStatus("Serviço local adicionado"); 
     } 

     @Override 
     public void onFailure(int error) { 
      appendStatus("Falha ao adicionar serviço"); 
     } 
    }); 

    discoverService(); 

} 

private void discoverService() { 

    /* 
    * Register listeners for DNS-SD services. These are callbacks invoked 
    * by the system when a service is actually discovered. 
    */ 

    manager.setDnsSdResponseListeners(channel, 
      new DnsSdServiceResponseListener() { 

       @Override 
       public void onDnsSdServiceAvailable(String instanceName, 
                String registrationType, WifiP2pDevice srcDevice) { 

        // A service has been discovered. Is this our app? 

        if (instanceName.equalsIgnoreCase(SERVICE_INSTANCE)) { 

         // update the UI and add the item the discovered 
         // device. 
         WiFiDirectServicesList fragment = (WiFiDirectServicesList) getFragmentManager() 
           .findFragmentByTag("serviços"); 
         if (fragment != null) { 
          WiFiDevicesAdapter adapter = ((WiFiDevicesAdapter) fragment 
            .getListAdapter()); 
          WiFiP2pService service = new WiFiP2pService(); 
          service.device = srcDevice; 
          service.instanceName = instanceName; 
          service.serviceRegistrationType = registrationType; 
          adapter.add(service); 
          adapter.notifyDataSetChanged(); 
          Log.d(TAG, "onBonjourServiceAvailable " 
            + instanceName); 
         } 
        } 

       } 
      }, new DnsSdTxtRecordListener() { 

       /** 
       * A new TXT record is available. Pick up the advertised 
       * buddy name. 
       */ 
       @Override 
       public void onDnsSdTxtRecordAvailable(
         String fullDomainName, Map<String, String> record, 
         WifiP2pDevice device) { 
        Log.d(TAG, 
          device.deviceName + " é " 
            + record.get(TXTRECORD_PROP_AVAILABLE)); 
       } 
      }); 

    // After attaching listeners, create a service request and initiate 
    // discovery. 
    serviceRequest = WifiP2pDnsSdServiceRequest.newInstance(); 
    manager.addServiceRequest(channel, serviceRequest, 
      new ActionListener() { 

       @Override 
       public void onSuccess() { 
        appendStatus("Adicionado pedido de descoberta de serviços"); 
       } 

       @Override 
       public void onFailure(int arg0) { 
        appendStatus("Falha ao adicionar pedido de descoberta de serviços"); 
       } 
      }); 
    manager.discoverServices(channel, new ActionListener() { 

     @Override 
     public void onSuccess() { 
      appendStatus("Descoberta de serviços iniciada"); 
     } 

     @Override 
     public void onFailure(int arg0) { 
      appendStatus("Descoberta de serviços falhada"); 

     } 
    }); 
} 

@Override 
public void connectP2p(WiFiP2pService service) { 
    WifiP2pConfig config = new WifiP2pConfig(); 
    config.deviceAddress = service.device.deviceAddress; 
    config.wps.setup = WpsInfo.PBC; 
    if (serviceRequest != null) 
     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("A conectar a um serviço"); 
     } 

     @Override 
     public void onFailure(int errorCode) { 
      appendStatus("Falha ao conectar a serviço"); 
     } 
    }); 
} 

@Override 
public boolean handleMessage(Message msg) { 
    switch (msg.what) { 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[]) msg.obj; 
      // construct a string from the valid bytes in the buffer 
      String readMessage = new String(readBuf, 0, msg.arg1); 
      Log.d(TAG, readMessage); 
      (chatFragment).pushMessage(readMessage); 
      break; 

     case MY_HANDLE: 
      Object obj = msg.obj; 
      (chatFragment).setChatManager((ChatManager) obj); 

    } 
    return true; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    receiver = new WiFiDirectBroadcastReceiver(manager, channel, this); 
    registerReceiver(receiver, intentFilter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    unregisterReceiver(receiver); 
} 

@Override 
public void onConnectionInfoAvailable(WifiP2pInfo p2pInfo) { 
    Thread handler = null; 
    /* 
    * The group owner accepts connections using a server socket and then spawns a 
    * client socket for every client. This is handled by {@code 
    * GroupOwnerSocketHandler} 
    */ 

    if (p2pInfo.isGroupOwner) { 
     Log.d(TAG, "Conectado como GroupOwner"); 
     try { 
      handler = new GroupOwnerSocketHandler(
        ((MessageTarget) this).getHandler()); 
      handler.start(); 
     } catch (IOException e) { 
      Log.d(TAG, 
        "Falha ao criar uma thread de servidor - " + e.getMessage()); 
      return; 
     } 
    } else { 
     Log.d(TAG, "Conectado como peer"); 
     handler = new ClientSocketHandler(
       ((MessageTarget) this).getHandler(), 
       p2pInfo.groupOwnerAddress); 
     handler.start(); 
    } 
    chatFragment = new jogar(); 
    getFragmentManager().beginTransaction() 
      .replace(R.id.container_root, chatFragment).commit(); 
    statusTxtView.setVisibility(View.GONE); 
} 

public void appendStatus(String status) { 
    String current = statusTxtView.getText().toString(); 
    statusTxtView.setText(current + "\n" + status); 
} 

}

回答

0

您的代碼看起來是正確的和預期應該工作。但是,我看到被忽略,可能會導致該服務的一個情況下(從上面的代碼):

// A service has been discovered. Is this our app? 

if (instanceName.equalsIgnoreCase(SERVICE_INSTANCE)) { 

當服務發現你的應用程序是通過服務名稱過濾他們,我覺得這兩個應用之間的混淆他們正在使用不同的服務名稱。 您可以嘗試刪除此「if」語句並再次測試該應用程序嗎?

希望這會有所幫助,

Goodluck。

相關問題