2012-06-29 10 views
8

Ich versuche, die Grundlagen der Verwendung von Bluetooth durch eine einfache Anwendung zu bekommen. Ich möchte auch eine Laptop-Anwendung, damit ich Bluetooth-Kommunikation einfach debuggen kann. Der folgende Code ist mein Versuch mit dem Laptop als Client (mit BlueCove 2.1.0) und dem Tablet als Server (Android 2.2).BlueCove, Laptop und ein Android-Tablet mit Bluetooth

Von dem, was ich verstehe, sollte dies wie geschrieben funktionieren, und der Laptop nimmt sowohl das Tablet und seinen angebotenen Service ab. Die Zeile "StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);" gibt jedes Mal null zurück.

Irgendwelche Ideen, was schief läuft? Hier ist die Ausgabe aus dem Code:

BlueCove Version 2.1.0 auf winsock
Adresse: 68A3C44A5265
Name: WS1497
Andrehvorrichtung Anfrage ...
Gerät entdeckt: 2013E061D922
Gerät entdeckt: 00242BFE7375
INQUIRY_COMPLETED
Geräteanfrage abgeschlossen.
Serviceanfrage gestartet.
Von: Galaxy Tab
Service-Suche beendet - code: 1
Von: WS1190
Service-Suche beendet - code: 4
Bluetooth-Geräte:
1. 2013E061D922 (Galaxy Tab)
2. 00242BFE7375 (WS1190)
btspp: // 2013E061D922: 20; authentifizieren = false; verschlüsseln = false; Master = false ---- = null
Exception in thread "main"
java.lang.NullPointerException bei MainClass.main (Mainclass. Java: 104)Abschaltung BlueCove Stapel abgeschlossen

Und hier ist der Code, ich verwende:

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; 

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

Antwort

0

Bit eines Updates nach langer Zeit - stellt sich heraus, Bluetooth erfordert UUIDs das Formular "0000xxxx00001000800000805f9b34fb", die die Frage warum nicht nur 16-Bit-Kennungen anstelle von 128-Bit-UUIDs, aber egal machen.

Ich weiß nicht, ob BlueCove mit diesem auf meinem Laptop funktioniert, aber meine letzten Experimente auf meinem Laptop mit Linux und 'Bluez' schlagen vor, dass jede UUID dieses Formulars funktioniert. Android sollte das in ihren Dokumenten als eine Art Notiz aufnehmen.

0

Dies ist eine alte Frage, also weiß ich nicht, ob jemand immer noch nach einer Antwort sucht, aber hier ist eine. .. :). Die Zeile, nach der Sie gefragt haben, gibt null zurück, weil url null ist. Versuchen Sie diese UUID anstelle der in Ihrem Code: 0000110100001000800000805f9b34fb.