BlueCove, laptop and Android tablet with Bluetooth

I am trying to get the basics of using bluetooth through a simple application. I also liked the laptop application so that I could debug Bluetooth communication simply. The code below is my attempt with a laptop as a client (using BlueCove 2.1.0) and a tablet as a server (Android 2.2).

From what I understand, this should work as it is written, and the laptop selects the tablet and the proposed service. However, the string "StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);" returns null each time.

Any idea what goes wrong? Here is the result from the code:

BlueCove version 2.1.0 on winsock
Address: 68A3C44A5265
Name: WS1497
Starting a device request ...
Device Found: 2013E061D922
Found device: 00242BFE7375
INQUIRY_COMPLETED
The device request is complete.

The service request has begun.

From: Galaxy Tab
Service search completed - code: 1
From: WS1190
Service search completed - code: 4
Bluetooth devices:
1.2013E061D922 (Galaxy Tab)
2,00242BFE7375 (WS1190)
btspp: // 2013E061D922: 20; authenticate = false; encrypt = false; master = false ---- = null
Exception in thread "main" java.lang.NullPointerException
on MainClass.main (MainClass.java:104)
BlueCove shut down

And here is the code I'm using:

Laptop code:

 import java.io.DataInputStream; import java.io.IOException; 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; public class MainClass implements DiscoveryListener { // object used for waiting private static Object lock = new Object(); // vector containing the devices discovered private static Vector<RemoteDevice> vecDevices = new Vector<RemoteDevice>(); private static Vector<String> vecServices = new Vector<String>(); // main method of the application public static void main(String[] args) throws IOException { // create an instance of this class MainClass bluetoothDeviceDiscovery = new MainClass(); // 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, bluetoothDeviceDiscovery); try { synchronized (lock) { lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Device Inquiry Completed. "); System.out.println("Service Inquiry Started. "); UUID uuids[] = new UUID[1]; uuids[0] = new UUID("fa87c0d0afac11de8a390800200c9a66", false); for (RemoteDevice rd : vecDevices) { System.out.println("From: " + rd.getFriendlyName(false)); agent.searchServices(null, uuids, rd, bluetoothDeviceDiscovery); try { synchronized (lock) { lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } // print all devices in vecDevices int deviceCount = vecDevices.size(); if (deviceCount <= 0) { System.out.println("No Devices Found ."); } 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(false) + ")"); } } // System.out.println("SR: " + sr.toString()); for (String url : vecServices) { try { String url = sr .getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE); System.out.println(url + " ----=" + conn); DataInputStream din = new DataInputStream( conn.openDataInputStream()); synchronized (lock) { try { lock.wait(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (din.available() != 0) { System.out.print(din.readChar()); } System.out.println(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }// end main // methods of DiscoveryListener /** * This call back method will be called for each discovered bluetooth * devices. */ public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { System.out.println("Device discovered: " + btDevice.getBluetoothAddress()); // add the device to the vector if (!vecDevices.contains(btDevice)) { vecDevices.addElement(btDevice); } } // no need to implement this method since services are not being discovered public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { for (ServiceRecord sr : servRecord) { vecServices.add(sr.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false)); } } // no need to implement this method since services are not being discovered public void serviceSearchCompleted(int transID, int respCode) { System.out.println("Service search completed - code: " + respCode); synchronized (lock) { lock.notify(); } } /** * This callback method will be called when the device discovery is * completed. */ public void inquiryCompleted(int discType) { switch (discType) { case DiscoveryListener.INQUIRY_COMPLETED: System.out.println("INQUIRY_COMPLETED"); break; case DiscoveryListener.INQUIRY_TERMINATED: System.out.println("INQUIRY_TERMINATED"); break; case DiscoveryListener.INQUIRY_ERROR: System.out.println("INQUIRY_ERROR"); break; default: System.out.println("Unknown Response Code"); break; } synchronized (lock) { lock.notify(); } }// end method }// end class 

Android:

 package com.mira.Bluetooth; import java.io.IOException; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.os.Bundle; import android.util.Log; public class BluetoothAndroidActivity extends Activity implements Runnable { BluetoothServerSocket bss; Thread t; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter(); for (BluetoothDevice btd : bta.getBondedDevices()) { Log.i("Bluetooth Device Found", btd.toString() + "; " + btd.getName()); } try { bss = bta.listenUsingRfcommWithServiceRecord("BluetoothChat", UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66")); t = new Thread(this); t.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub boolean bContinue = true; while (bContinue) { try { Thread.sleep(100); } catch (Exception e) { } try { System.out.println("Listening for connection"); BluetoothSocket bs = bss.accept(); System.out.println("Connection received"); bs.getOutputStream().write("Hello BlueTooth World".getBytes()); bs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); bContinue = false; } } } /* * (non-Javadoc) * * @see android.app.Activity#onDestroy() */ @Override protected void onStop() { try { System.out.println("Killing ServerSocket"); bss.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } super.onStop(); } } 
+8
java android bluetooth bluecove
source share
2 answers

Update bit after a long time - it turns out that Bluetooth requires the UUID to take the form โ€œ0000xxxx00001000800000805f9b34fbโ€, which asks the question of why it is not easy to use 16-bit identifiers and not 128-bit UUIDs, but it doesnโ€™t matter.

I don't know if BlueCove works with this on my laptop, but my recent experiments on my laptop with Linux and "Bluez" suggest that any UUID of this form works. Android may need to include this in its docs as a note.

0
source share

This is an old question, so I donโ€™t know if everyone is looking for an answer, but here itโ€™s all the same ... :). The string you requested returns null because url is null. Try this UUID instead of the code in your code: 0000110100001000800000805f9b34fb .

0
source share

All Articles