BlueCove, ноутбук и планшет Android с Bluetooth

Я пытаюсь освоить основы использования Bluetooth с помощью простого приложения. Я также хотел бы приложение для ноутбука, чтобы я мог легко отлаживать связь Bluetooth. Приведенный ниже код — это моя попытка использовать ноутбук в качестве клиента (с использованием BlueCove 2.1.0), а планшет — в качестве сервера (Android 2.2).

Насколько я понимаю, это должно работать так, как написано, и ноут подхватывает и планшет, и предлагаемую им услугу. Однако строка "StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);"каждый раз возвращает значение null.

Есть идеи, что происходит? Вот результат кода:

BlueCove версии 2.1.0 на winsock
Адрес: 68A3C44A5265
Имя: WS1497
Запуск запроса устройства...
Обнаружено устройство: 2013E061D922
Обнаружено устройство: 00242BFE7375
INQUIRY_COMPLETED
Запрос устройства завершен.
Начат сервисный запрос.
От: Galaxy Tab
Поиск услуги завершен - код: 1
От кого: WS1190
Поиск услуги завершен - код: 4
Устройства Bluetooth:
1. 2013E061D922 (вкладка «Галактика»)
2. 00242BFE7375 (WS1190)
btspp://2013E061D922:20;authenticate=false;encrypt=false;master=false ----=null
Исключение в потоке "основной" java.lang.NullPointerException
в MainClass.main(MainClass.java:104)
Выключение стека BlueCove завершено

И вот код, который я использую:

Код ноутбука:

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
задан Matt Olan 30 October 2012 в 20:18
поделиться