Bluetooth: failed service discovery

I am trying to establish a Bluetooth connection between my Android application (on a Samsung phone running 4.1.2: client) and my laptop (Win7, 64 bit: server). He always failed when the service failed.

I read various topics about this ( here and there ), but this did not solve my problem.

I have two questions:

  • which means the well-known UUID "00001101-0000-1000-8000-00805F9B34FB". Why / when should it be used?
  • Any suggestion to study / solve my problem would be appreciated.

Notes:

  • I tried to establish a secure and insecure connection (same failure with both)
  • I can connect my laptop and my device with settings> Bluetooth
  • As suggested in the comments: I tried with a randomly generated UUID (but the same on both sides), and not with a known one, but I still have exactly the same behavior.

I have these permissions

<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 

EDIT

Instead of encoding the UUID on the client side, I tried the following (but still getting the same error):

 UUID uuid = bluetoothDevice.getUuids()[bluetoothDevice.getUuids().length-1].getUuid(); 

The echo server UUID is always the last in the array.

End edit

Here are the relevant logs on the client:

 08-22 12:30:28.627: ERROR/BluetoothService.cpp(12008): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) 08-22 12:30:28.647: INFO/BluetoothSocket.cpp(18030): Setting Master socket option 08-22 12:30:28.647: VERBOSE/BluetoothSocket.cpp(18030): ...fd 43 created (RFCOMM, lm = 7) 08-22 12:30:28.687: DEBUG/BluetoothPolicyService(12008): getAllowBluetoothDataTransfer - showMsg: true 08-22 12:30:28.687: DEBUG/BluetoothPolicyService(12008): MDM: isProfileEnabled = true 08-22 12:30:28.697: DEBUG/BluetoothUtils(18030): isSocketAllowedBySecurityPolicy start : device null 08-22 12:30:28.727: ERROR/BluetoothEventLoop.cpp(12008): onCreateDeviceResult: D-Bus error: org.bluez.Error.AlreadyExists (Already Exists) 08-22 12:30:28.727: VERBOSE/BluetoothService.cpp(12008): discoverServicesNative 08-22 12:30:28.727: VERBOSE/BluetoothService.cpp(12008): ... Object Path = /org/bluez/12635/hci0/dev_00_09_DD_50_88_54 08-22 12:30:28.727: VERBOSE/BluetoothService.cpp(12008): ... Pattern = , strlen = 0 08-22 12:30:29.138: VERBOSE/BluetoothEventLoop.cpp(12008): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/12635/hci0/dev_00_09_DD_50_88_54 08-22 12:30:29.138: DEBUG/BluetoothEventLoop(12008): Device property changed 08-22 12:30:32.141: DEBUG/BluetoothA2DPStateReceiver(15827): BluetoothA2DPStateReceiver constructor call() 08-22 12:30:32.141: DEBUG/BluetoothA2DPStateReceiver(15827): onReceive(): action = android.bluetooth.device.action.ACL_CONNECTED 08-22 12:30:32.141: DEBUG/BluetoothA2DPStateReceiver(15827): ACTION_ACL_CONNECTED 08-22 12:30:32.141: DEBUG/BluetoothA2DPSinkInfo(15827): checkBlackListCarkit() : isBlackListCarkit false 08-22 12:30:32.161: DEBUG/BluetoothNotiBroadcastReceiver(15910): onReceive 08-22 12:30:40.749: ERROR/Bluetooth(18030): Cannot connect java.io.IOException: Service discovery failed at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:475) at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:241) at com.company.BlueToothTestActivity.open(BlueToothTestActivity.java:48) at com.company.BlueToothTestActivity$1.run(BlueToothTestActivity.java:29) 08-22 12:30:40.749: WARN/Bluetooth(18030): Unable to open connection ! 

Here is the code for reproducing the error (this is a simplified version, it compiles and reproduces the error - at least on my hardware)

Client

 import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import java.io.IOException; import java.util.UUID; public class BlueToothTestActivity extends Activity { private String macAddress = "00:09:DD:50:88:54"; //hardcoded laptop macAddress private BluetoothAdapter mBluetoothAdapter; private BluetoothDevice bluetoothDevice; private BluetoothSocket socket; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread bluetoothClientThread = new Thread(){ @Override public void run() { if(open()){ Log.i("Bluetooth","Connection is open !"); }else{ Log.w("Bluetooth","Unable to open connection !"); } } }; bluetoothClientThread.start(); initUI(); } public boolean open() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress); String BT_UUID = "00001101-0000-1000-8000-00805F9B34FB"; try { mBluetoothAdapter.cancelDiscovery(); //socket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(BT_UUID)); socket = bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(BT_UUID)); socket.connect(); //Block 12 sec here, then throw the exception. return true; } catch (IOException e) { try { socket.close(); } catch (IOException closeException) { } Log.e("Bluetooth", "Cannot connect", e); return false; } } private void initUI(){ LinearLayout linearLayout = new LinearLayout(this); Button finish = new Button(this); finish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } BlueToothTestActivity.this.finish(); } }); finish.setText("Exit"); linearLayout.addView(finish); setContentView(linearLayout); } } 

Server - a simple echo server (based on the Bluecove library, I took the code from here: http://www.miniware.net/mobile/articles/viewarticle.php?id=22 )

Server

 import java.io.*; import javax.bluetooth.*; import javax.microedition.io.*; // sample code from : http://www.miniware.net/mobile/articles/viewarticle.php?id=22 (Nikos Fotiou) public class EchoServer { public final UUID uuid = new UUID("0000110100001000800000805F9B34FB",false); public final String name = "EchoServer"; //the name of the service public final String url = "btspp://localhost:" + uuid + ";name=" + name + ";authenticate=false;encrypt=false;"; LocalDevice local = null; StreamConnectionNotifier server = null; StreamConnection conn = null; public EchoServer() { try { System.out.println("Setting device to be discoverable..."); local = LocalDevice.getLocalDevice(); local.setDiscoverable(DiscoveryAgent.GIAC); System.out.println("Start service:"+url); server = (StreamConnectionNotifier)Connector.open(url); System.out.println("Waiting for incoming connection..."); conn = server.acceptAndOpen(); // stop and wait here System.out.println("Client Connected..."); //never reach this line DataInputStream din = new DataInputStream(conn.openInputStream()); while(true){ String cmd = ""; char c; while (((c = din.readChar()) > 0) && (c!='\n') ){ cmd = cmd + c; } System.out.println("Received " + cmd); } } catch (Exception e) { System.err.println("Exception Occured: " + e.toString()); e.printStackTrace(); } } public static void main (String args[]){ EchoServer echoserver = new EchoServer(); } } 

Pom.xml server

 <dependencies> <dependency> <groupId>net.sf.bluecove</groupId> <artifactId>bluecove</artifactId> <version>2.1.1-SNAPSHOT</version> </dependency> </dependencies> <repositories> <repository> <id>pyx4me-web-snapshot</id> <url>http://www.pyx4me.com/maven2-snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories> 
+4
source share
2 answers

The UUID you are trying to use is the serial port profile UUID. It can be declared in code, for example

 private static final UUID BLUETOOTH_SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 

I tried my code with a Windows 8 and Nexus S laptop. First I had to connect devices from Nexus. Then I started the server and used the Bluetooth SPP application to test the connection. He worked flawlessly. Then I started my code, and it worked, and it worked too.

I could throw a “Service Discovery” exception when the server side was not running. In addition, after I watched all 30 channels using the createRfcommSocket method, the bluetooth stack on the phone is damaged and I had to restart the device.

In conclusion, to make sure you can communicate:

  • on the laptop, make sure that Bluetooth is in a detection state.
  • (optional) disable UAC and use an administrator account to make sure that you do not encounter security errors (I did not need to do this, but the second time the firewall had to be open for eclipse to enable debugging)
  • restart the phone.
  • couple from the phone
  • use SPU UUID, not custom
  • make sure you use the correct MAC address by adding System.out.println(local.getBluetoothAddress()); somewhere before calling acceptAndOpen() .
  • Check the connection with the third-party application in the playback store. I used this in command line mode. Only the connection needs to be checked.
  • update the MAC address and run the application
  • he should work.

Here is the result I got from the launch:

 Start service:btspp://localhost:0000110100001000800000805f9b34fb;name=EchoServer;authenticate=false;encrypt=false; MAC 402CF454215C Waiting for incoming connection... Client Connected... Exception Occured: java.io.EOFException BlueCove stack shutdown completed java.io.EOFException at java.io.DataInputStream.readChar(Unknown Source) at examples.bluetooth_spp_server.EchoServer.<init>(EchoServer.java:30) at examples.bluetooth_spp_server.EchoServer.main(EchoServer.java:42) 

For completeness, here is the error returned under various conditions

  • Windows bluetooth off: javax.bluetooth.BluetoothStateException: Bluetooth not detected
  • Android bluetooth off: java.io.IOException: Unable to start Service Discovery
  • Windows server is down: java.io.IOException: Service discovery failed
  • TimeoutException : TimeoutException

Theoretically, pairing should occur automatically when a secure connection is initiated, but in fact the pairing dialog may not be displayed in all cases on the phone or in Windows. This is an uncertainty factor that must be considered when failures occur.

+8
source

a) UUID is the serial port UUID - mainly for use with devices that do not speak SDP. small embedded RFCOMM devices.

b) Check if Bluetooth is enabled on your phone.

+1
source

Source: https://habr.com/ru/post/1498355/


All Articles