2012-12-26 18 views
5

Próbuję wysłać wiadomość od klienta Android do Mac OS X przez bluetooth. Używam bluecove 2.0.1 Biblioteka bluetooth Java w systemie Mac OS X Snow Leopard.nie można połączyć się z gniazdem Bluetooth na Androidzie

kod dla serwera:

public class EchoServer2 { 
private static final String UUID_STRING = "00001101-0000-1000-8000-00805F9B34FB"; // 32 hex digits 
private static final String SERVICE_NAME = "echoserver"; 

private LocalDevice mLocalDevice; 

public EchoServer2() { 
    try { 
     mLocalDevice = LocalDevice.getLocalDevice(); 
    } catch(IOException e) { 
     System.err.print("Error connection to bluetooth"); 
    } 
} 

public void start() throws IOException { 
    StreamConnectionNotifier connectionNotifier = 
     (StreamConnectionNotifier) Connector.open(
       "btspp://localhost:" + UUID_STRING + 
       ";name=" + SERVICE_NAME + ";authenticate=false"); 

    System.out.println("Bluetooth Address: " + mLocalDevice.getBluetoothAddress()); 

    System.out.println("Waiting for a connection..."); 
    StreamConnection streamConnection = connectionNotifier.acceptAndOpen(); 

    System.out.println("Found a new device."); 

    RemoteDevice device = RemoteDevice.getRemoteDevice(streamConnection); 
    System.out.println("New Device connected: " + device.getFriendlyName(false).toString()); 

    DataInputStream is = streamConnection.openDataInputStream(); 

    byte[] bytes = new byte[1024]; 
    int r; 
    while((r = is.read(bytes)) > 0) { 
     System.out.println(new String(bytes, 0, r)); 
    } 

} 

}

Kod dla klienta Android:

public class MainActivity extends Activity { 

private static final String TAG = "MainActivity"; 

EditText editText; 
TextView textView; 

String send_msg; 
String rcv_msg; 

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // 32 hex digits 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.d(TAG, "onCreate"); 

    editText = (EditText) findViewById(R.id.edit_msg); 
    textView = (TextView) findViewById(R.id.rcv_msg); 

    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 

    if(adapter == null) { 
     textView.append("Bluetooth NOT Supported!"); 
     return; 
    } 

    // Request user to turn ON Bluetooth 
    if(!adapter.isEnabled()) { 
     Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(intent, RESULT_OK); 
    } 




} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void onClick(View view) { 
    Log.d(TAG, "onClick"); 
    new SendMessageToServer().execute(send_msg); 
} 

private class SendMessageToServer extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... msg) { 
     Log.d(TAG, "doInBackground"); 

     BluetoothSocket clientSocket = null; 
     BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     mBluetoothAdapter.enable(); 
     // Client knows the server MAC address 
     BluetoothDevice mmDevice = mBluetoothAdapter.getRemoteDevice("00:25:00:C3:1C:FE"); 
     Log.d(TAG, "got hold of remote device"); 
     Log.d(TAG, "remote device: " + mmDevice.getName().toString()); 

     try { 
      // UUID string same used by server 
      clientSocket = mmDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

      Log.d(TAG, "bluetooth socket created"); 

      mBluetoothAdapter.cancelDiscovery(); // Cancel, discovery slows connection 

      clientSocket.connect(); 
      Log.d(TAG, "connected to server"); 

      DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 
      DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream()); 

      out.writeUTF(msg[0]);   // Send message to server 
      Log.d(TAG, "Message Successfully sent to server"); 
      return in.readUTF();   // Read response from server 
     } catch (Exception e) { 

      Log.d(TAG, "Error creating bluetooth socket"); 
      Log.d(TAG, e.getMessage()); 

      return ""; 
     } 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.d(TAG, "onPostExecute"); 
     rcv_msg = result; 
     textView.setText(rcv_msg); 
    } 

} 

}

nie jestem w stanie połączyć się z serwerem, chociaż UUID są tak samo dla klienta i serwera. Android zgłasza wyjątek: Wykrywanie usług nie powiodło się. Jednak jestem w stanie wydrukować nazwę zdalnego urządzenia (klienta) na serwerze. Stąd acceptAndOpen() nie może zaakceptować połączenia z gniazdem.

Proszę mi pomóc w zrozumieniu, dlaczego nie jestem w stanie clientSocket.connect(); na Androida?

+0

Czy zdołałeś rozwiązać ten problem? Mam dokładnie ten sam problem i nie mogę sprawić, żeby to działało. – blastervla

Odpowiedz

1

Zgaduję, że ma to coś wspólnego z numerami UUID, których używałeś. Zależą one wyłącznie od rodzaju używanego urządzenia. Więc upewnij się, że wyglądasz tak i że są one poprawne dla urządzenia z Androidem. Kiedy robiłem androida, przez długi czas mnie to kręciło. UUID nie jest czymś, co ustawisz. Oto link How can I get the UUID of my Android phone in an application? Albo ten Android - Get Bluetooth UUID for this device

Jeśli to nie jest to. Czy wykrywanie zakończyło się niepowodzeniem na obu końcach? czy widzisz urządzenie po obu stronach? Po której stronie możesz wydrukować nazwę? Możesz chcieć rzucić okiem na przykładowy program Bluetooth dla google. I użyj tego, aby zacząć.

Powiązane problemy