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; @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) {
java android bluetooth bluecove
Doug
source share