Java - Bluetooth API Bluecove Issue

2019-07-14 02:32发布

问题:

I'm having an issue using the Bluecove API in Java. I plan to create a basic BT listener in order to receive some data from a homemade device (Arduino powered). I've the following code which is quite easy to understand:

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 javax.bluetooth.*;
import javax.microedition.io.*;

public class Bluetooth
{
    private void startServer() throws IOException
    {
    //Create a UUID for SPP
    UUID uuid = new UUID("1101", true);
    //Create the servicve url
    String connectionString = "btspp://localhost:" + uuid +";name=Magic Merlin Server";

    //open server url
    StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open(connectionString);

    //Wait for client connection
    System.out.println("\nServer Started. Waiting for clients to connect...");
    StreamConnection connection = streamConnNotifier.acceptAndOpen();

    RemoteDevice dev = RemoteDevice.getRemoteDevice(connection);
    System.out.println("Remote device address: "+dev.getBluetoothAddress());
    System.out.println("Remote device name: "+dev.getFriendlyName(true));

    //read string from spp client
    InputStream inStream=connection.openInputStream();
    BufferedReader bReader=new BufferedReader(new InputStreamReader(inStream));
    String lineRead=bReader.readLine();
    System.out.println(lineRead);

    //send response to spp client
    OutputStream outStream = connection.openOutputStream();
    PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
    pWriter.write("Response String from SPP Server\r\n");
    pWriter.flush();
    pWriter.close();

    streamConnNotifier.close();
    }

    public static void main(String[] args) throws IOException
    {
    LocalDevice localDevice = LocalDevice.getLocalDevice();
    System.out.println("Address: "+localDevice.getBluetoothAddress());
    System.out.println("Name: "+localDevice.getFriendlyName());

    Bluetooth sampleSPPServer = new Bluetooth();
    sampleSPPServer.startServer();
    }
}

WHen I try to execute my code, I got this weird error:

Exception in thread "main" javax.bluetooth.BluetoothStateException: BlueCove com.intel.bluetooth.BluetoothStackBlueZ not available
at com.intel.bluetooth.BlueCoveImpl.loadStackClass(BlueCoveImpl.java:342)
at com.intel.bluetooth.BlueCoveImpl.detectStack(BlueCoveImpl.java:427)
at com.intel.bluetooth.BlueCoveImpl.access$500(BlueCoveImpl.java:65)
at com.intel.bluetooth.BlueCoveImpl$1.run(BlueCoveImpl.java:1020)
at java.security.AccessController.doPrivileged(Native Method)
at com.intel.bluetooth.BlueCoveImpl.detectStackPrivileged(BlueCoveImpl.java:1018)
at com.intel.bluetooth.BlueCoveImpl.getBluetoothStack(BlueCoveImpl.java:1011)
at javax.bluetooth.LocalDevice.getLocalDeviceInstance(LocalDevice.java:75)
at javax.bluetooth.LocalDevice.getLocalDevice(LocalDevice.java:95)
at Bluetooth.main(Bluetooth.java:50)

The 50th line is LocalDevice localDevice = LocalDevice.getLocalDevice();.

I have a BT dongle on my computer which is enabled, so I'm really disapointed with that. If you have any idea on how to solve this, it'd be kind!

Thanks anyway for reading this subject. Regards.

回答1:

If this is on Linux, two things that you can check:

  • Do you have net.sf.bluecove:bluecove-gpl:2.1.0 in your classpath? See this for more info.
  • Do you have libbluetooth-dev package installed? This may be Xubuntu specific, though. This package contains BlueZ, type apt-cache show libbluetooth-dev to see the description. Other Linux distributions probably have an equivalent library

Hope this helps.



回答2:

Anyone else having this issue may need to download bluecove-gpl-x.x.x.jar in addition to bluecove-x.x.x.jar. You can get it here, https://code.google.com/p/bluecove/downloads/list.



回答3:

Finally I found an easier way using an application named "GlovePie". It provides a very simple interface to retrieve the sensor values and send it through a network protocol. Then a java program listen to that protrocol and grab the values.

The above error (in my first post) is a common issue that has been reported on Bluecove tracker.