2012-06-29 7 views
8

Sto cercando di ottenere le basi per l'utilizzo del Bluetooth tramite una semplice applicazione. Mi piacerebbe anche un'applicazione per laptop in modo da poter eseguire il debug delle comunicazioni Bluetooth semplicemente. Il codice seguente è il mio tentativo con il laptop di essere il cliente (usando BlueCove 2.1.0) e il tablet come server (Android 2.2).BlueCove, laptop e un tablet Android con Bluetooth

Da quello che ho capito, questo dovrebbe funzionare come scritto, e il laptop sta prendendo in mano sia il tablet che il servizio offerto. Tuttavia, la riga "StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);" restituisce null ogni volta.

Qualche idea è cosa non va? Ecco l'uscita dal codice:

Bluecove versione 2.1.0 su Winsock
Indirizzo: 68A3C44A5265
Nome: WS1497
partire richiesta dispositivo ...
dispositivo rilevato: 2013E061D922
dispositivo rilevato: 00242BFE7375
INQUIRY_COMPLETED
Richiesta dispositivo completata.
Richiesta di servizio avviata.
Da: Galaxy Tab ricerca
Servizio completato - Codice: 1
Da: WS1190
ricerca Servizio completato - Codice: 4
dispositivi Bluetooth:
1. 2013E061D922 (Galaxy Tab)
2. 00242BFE7375 (WS1190)
btspp: // 2013E061D922: 20; autenticare = false; crittografare = false; master = falso ---- = null
Exception in thread "main" java.lang.NullPointerException
a MainClass.main (MainClass. java: 104)
Bluecove arresto pila completata

Ed ecco il codice che sto usando:

Codice portatile:

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(); 
    } 
} 

risposta

0

Bit di un aggiornamento dopo un lungo periodo di tempo: il bluetooth richiede che gli UUID assumano il formato "0000xxxx00001000800000805f9b34fb", il che pone la domanda sul perché non utilizzare solo identificatori a 16 bit anziché UUID a 128 bit, ma non importa.

Non so se BlueCove funziona con questo sul mio portatile, ma i miei recenti esperimenti sul mio portatile con Linux e "Bluez" suggeriscono che qualsiasi UUID di quel modulo funziona. Forse Android dovrebbe includerlo nei loro documenti come una nota di qualche tipo.

0

questo è un vecchio domanda, quindi non so se qualcuno sta ancora cercando una risposta, ma eccone uno comunque. .. :). La riga che hai chiesto restituisce null perché url è nullo. Prova questo UUID al posto di quello nel tuo codice: 0000110100001000800000805f9b34fb.