java - teclado - BlueCove, computadora portátil y una tableta Android con Bluetooth
teclado bluetooth tablet (2)
Estoy tratando de obtener los conceptos básicos del uso de Bluetooth a través de una aplicación simple. También me gustaría una aplicación de computadora portátil para que pueda depurar las comunicaciones de Bluetooth simplemente. El siguiente código es mi intento con la computadora portátil como cliente (usando BlueCove 2.1.0) y la tableta como servidor (Android 2.2).
Por lo que entiendo, esto debería funcionar como está escrito, y la computadora portátil está recogiendo tanto la tableta como su servicio ofrecido. Sin embargo, la línea "StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);"
devuelve nulo todo el tiempo.
¿Alguna idea es qué está yendo mal? Aquí está el resultado del código:
BlueCove versión 2.1.0 en winsock
Dirección: 68A3C44A5265
Nombre: WS1497
Iniciando consulta del dispositivo ...
Dispositivo descubierto: 2013E061D922
Dispositivo descubierto: 00242BFE7375
INQUIRY_COMPLETED
Consulta del dispositivo completada.
Indagación de servicio iniciada.
De: Galaxy Tab
Búsqueda de servicio completada - código: 1
De: WS1190
Búsqueda de servicio completada - código: 4
Dispositivos Bluetooth:
1. 2013E061D922 (Galaxy Tab)
2. 00242BFE7375 (WS1190)
btspp: // 2013E061D922: 20; authenticate = false; encrypt = false; master = false ---- = null
Excepción en el hilo "main" java.lang.NullPointerException
en MainClass.main (MainClass.java:104)
Cierre de la pila BlueCove completado
Y aquí está el código que estoy usando:
Código de computadora portátil:
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
Androide:
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();
}
}
Esta es una vieja pregunta, así que no sé si alguien todavía está buscando una respuesta, pero aquí hay uno de todos modos ... :). La línea sobre la que has preguntado está devolviendo nulo porque url
es nulo. Pruebe este UUID en lugar de uno en su código: 0000110100001000800000805f9b34fb
.
Una pequeña actualización después de mucho tiempo, resulta que bluetooth requiere que los UUID adopten el formato "0000xxxx00001000800000805f9b34fb", lo que plantea la pregunta de por qué no utilizar identificadores de 16 bits en lugar de UUID de 128 bits, pero no importa.
No sé si BlueCove funciona con esto en mi computadora portátil, pero mis experimentos recientes en mi computadora portátil con Linux y ''Bluez'' sugieren que cualquier UUID de esa forma funciona. Android tal vez debería incluir eso en sus documentos como una nota de algún tipo.