2017-03-13 3 views
0

私は正常に発見してピアに接続するwifidirectアプリを持っています。私が開発している別のアプリにそのアプリを「添付」しました。 Wifidirectを使ってロボットをブルートゥースで制御すると同時にそのアプリケーションには「再生ボタン」があり、クリックすると別のアクティビティに移動し、そのアクティビティには2つのフラグメントがあり、1つが最初に表示されます"プレイ"ボタンをクリックして、ユーザーがピアに接続することを義務づけた後(それは私がwifidirectアプリを添付していた)、それを接続した後、このフラグメントはゲームインターフェイスを持ち、ロボットの接続と制御)。Wifidirectディスカバリーがピアを見つけられない

要約:最初のアクティビティには再生ボタンがあり、ボタンをクリックすると、2つのフラグメントで2番目のアクティビティに移動します。第2のアクティビティは、Wifidirectのピアに接続しなければならず、その後はブルートゥースを使用してロボットを接続して制御する必要があります。第二の活動で

(私が知っている...混乱)を同時にWifiDirectとBluetoothコミュが起こっている

私の問題:私はもっぱらWifidirectアプリを使用している場合は、それが捜しますとsucessfully接続しているけど」と両方のアプリの "融合"を、それは何も発見せずに永遠に検索します。何が起こっているのアイデア?多分コミュニケーションや同じ活動の中で起こっている多くの事に?私が混乱している場合は教えてください。

マイ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

関連する問題