Inicializar una conexión bluetooth entre Android (servidor) y bluecove en pc (cliente)

Sé que hay otros temas sobre eso, pero en mi caso quiero que el dispositivo Android para inicializar la conexión Bluetooth como un servidor. Seguí la Documentación y escribí el servidor de esta manera:

private class AcceptThread implements Runnable { private final BluetoothServerSocket mmServerSocket; public AcceptThread() { BluetoothServerSocket tmp = null; try { tmp = mBluetooth.listenUsingRfcommWithServiceRecord( "myService", mUuid); } catch (IOException e) { } mmServerSocket = tmp; } public void run() { BluetoothSocket socket = null; // Keep listening until exception occurs or a socket is returned while (true) { try { System.out.println("SERVER SOCKET LISTENING"); socket = mmServerSocket.accept(); } catch (IOException e) { break; } // If a connection was accepted if (socket != null) { System.out.println("SIGNAL RECEIVED"); // Do work to manage the connection (in a separate thread) Toast.makeText(getApplicationContext(), "SIGNAL RECEIVED", Toast.LENGTH_LONG).show(); try { mmServerSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } } } /** Will cancel the listening socket, and cause the thread to finish */ public void cancel() { try { mmServerSocket.close(); } catch (IOException e) { } } } 

En el otro lado tengo la API de bluecove que descubro dispositivos y servicios remotos.

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Vector; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; /** * A simple SPP client that connects with an SPP server */ public class SampleSPPClient implements DiscoveryListener{ //object used for waiting private static Object lock=new Object(); //vector containing the devices discovered private static Vector vecDevices=new Vector(); private static String connectionURL=null; public static void main(String[] args) throws IOException { SampleSPPClient client=new SampleSPPClient(); //display local device address and name LocalDevice localDevice = LocalDevice.getLocalDevice(); System.out.println("Address: "+localDevice.getBluetoothAddress()); System.out.println("Name: "+localDevice.getFriendlyName()); //find devices DiscoveryAgent agent = localDevice.getDiscoveryAgent(); System.out.println("Starting device inquiry..."); agent.startInquiry(DiscoveryAgent.GIAC, client); try { synchronized(lock){ lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Device Inquiry Completed. "); //print all devices in vecDevices int deviceCount=vecDevices.size(); if(deviceCount <= 0){ System.out.println("No Devices Found ."); System.exit(0); } else{ //print bluetooth device addresses and names in the format [ No. address (name) ] System.out.println("Bluetooth Devices: "); for (int i = 0; i <deviceCount; i++) { RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i); System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress()+" ("+remoteDevice.getFriendlyName(true)+")"); } } System.out.print("Choose Device index: "); BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in)); String chosenIndex=bReader.readLine(); int index=Integer.parseInt(chosenIndex.trim()); //check for spp service RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(index-1); UUID[] uuidSet = new UUID[1]; uuidSet[0]=new UUID("4e3aea40e2a511e095720800200c9a66", false); System.out.println("\nSearching for service..."); agent.searchServices(null,uuidSet,remoteDevice,client); try { synchronized(lock){ lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } if(connectionURL==null){ System.out.println("Device does not support Simple SPP Service."); System.exit(0); } //connect to the server and send a line of text StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL); //send string OutputStream outStream=streamConnection.openOutputStream(); PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream)); pWriter.write("Test String from SPP Client\r\n"); pWriter.flush(); //read response InputStream inStream=streamConnection.openInputStream(); BufferedReader bReader2=new BufferedReader(new InputStreamReader(inStream)); String lineRead=bReader2.readLine(); System.out.println(lineRead); }//main //methods of DiscoveryListener public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { //add the device to the vector if(!vecDevices.contains(btDevice)){ vecDevices.addElement(btDevice); } } //implement this method since services are not being discovered public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { System.out.println(servRecord[0].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false)); if(servRecord!=null && servRecord.length>0){ connectionURL=servRecord[0].getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT,false); } synchronized(lock){ lock.notify(); } } //implement this method since services are not being discovered public void serviceSearchCompleted(int transID, int respCode) { synchronized(lock){ lock.notify(); } } public void inquiryCompleted(int discType) { synchronized(lock){ lock.notify(); } }//end method } 

El cliente encontró el dispositivo y el servicio pero cuando recupera la url de la ServiceRecord para establecer la conexión falla. Recupera una Url en la que el canal está equivocado y lanza una excepción: javax.bluetooth.BluetoothConnectionException: Error al conectarse;

¿Cómo puedo solucionar el problema?

Me las arreglé para encontrar algunos ServiceRecords teléfono cuando se utiliza:

  UUID[] uuidSet = new UUID[1]; uuidSet[0]=new UUID(0x0100); int[] attrIds = { 0x0100 }; System.out.println("\nSearching for service..."); agent.searchServices(attrIds, uuidSet, remoteDevice, client); 

Y usted llamará lock.notify () dos veces después de un serviceSearch, quítelo en la función servicesDiscovered.

También debe revisar los registros de servicio y buscar el que le interesa. La URL indicará btgoep: // o btspp: //

Al buscar a través del bucle for use este código para listar el nombre del servicio

  for(int i = 0; i < servRecord.length; i++) { String url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); DataElement serviceName = srs[i].getAttributeValue(0x0100); if (serviceName != null) { System.out.println("service " + serviceName.getValue() + " found " + url); } else { System.out.println("service found " + url); } 

Tengo el problema exacto, parece que el api de Android no registra el ServiceRecord con el SDP para que el api de Bluecove pueda encontrarlo. No importa qué UUID lo utilizo encontrará solamente los que mi registro del teléfono como defecto, es decir, las puertas de enlace audio y la agenda OBEX empujan y tales.

EDIT — Tenía el mismo problema, pero me di cuenta de que en realidad no había llamado listenUsingInsecureRFCOMMSocket todavía. Y luego no registró el registro de servicio. Pero después de eso funcionó muy bien.

  • Cómo solucionar el error BluetoothGatt: android.os.DeadObjectException error en Android?
  • Encuentra la dirección MAC del dispositivo bluetooth usando adb
  • Conexión a un dispositivo HID bluetooth (ratón) mediante L2CAP
  • Cómo activar / desactivar el bluetooth mediante programación en android
  • Impresión Bluetooth de Android
  • Android: Conexión entre el servidor y el cliente
  • Bluetooth "fuera de banda" (OOB) en el par de Android?
  • Android bluetooth: Lista de dispositivos emparejados
  • Habilitar el bluetooth que tethering android programmatically
  • Descubrir sólo dispositivos bluetooth específicos del proveedor
  • Qt Android bluetooth socket escribir problemas en Android 5.1.1 y 6.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.