2015-12-17 12 views
6

Woher weiß man, ob ein Bluetooth-Gerät noch mit einem Laptop verbunden ist oder nicht, bevor Daten übertragen werden? Ich schrieb ein Java-Programm mit blue-cove lib, um die Daten über den Laptop zu entdecken und weiterzugeben. Wie kann ich nach der ersten Datenübergabe prüfen, ob das Gerät noch mit dem Laptop verbunden ist, bevor Sie die Daten in der nächsten Zeit weitergeben?Überprüfen Sie den Status der verbundenen Bluetooth-Geräte

Ich sah eine ähnliche Frage wie folgt. Aber sie haben gefragt, wie man den Bluetooth-Gerätestatus überprüft, der mit dem Android verbunden ist.

Antwort

3

Sie können einer Reihe von Schritten folgen und eine asynchrone Aufgabe erstellen, um die Verbindung zu überprüfen, während Dateien zwischen Geräten gesucht und freigegeben werden. Die Funktionen deviceDiscovered() und inquiryCompleted() werden ausgeführt, wenn ein Gerät gefunden wird und die Anfrage beendet ist.

Wenn das Gerät abgeschaltet wird, würden Sie sich von dem Verfahren eine benachrichtigen bekommen inqueryCompleted und Handelt es in der Zeile:

try { 
        synchronized(lock){ 
         lock.wait(); 
        } 
       } 

       catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

Im InterruptedException Sie den Fehler umgehen können.

package bt; 

import java.io.OutputStream; 
import java.util.ArrayList; 

import javax.bluetooth.DataElement; 
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.obex.ClientSession; 
import javax.obex.HeaderSet; 
import javax.obex.Operation; 
import javax.obex.ResponseCodes; 

import bt.BTListener.MyDeviceListenerFilter; 

public class MyDiscoveryListener implements DiscoveryListener{ 

    private static Object lock=new Object(); 
    public ArrayList<RemoteDevice> devices; 

    public MyDiscoveryListener() { 
     devices = new ArrayList<RemoteDevice>(); 
    } 

    public static void main(String[] args) { 

     MyDiscoveryListener listener = new MyDiscoveryListener(); 

     try{ 
      LocalDevice localDevice = LocalDevice.getLocalDevice(); 
      DiscoveryAgent agent = localDevice.getDiscoveryAgent(); 
      agent.startInquiry(DiscoveryAgent.GIAC, listener); 

      try { 
       synchronized(lock){ 
        lock.wait(); 
       } 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
       return; 
      } 


      System.out.println("Device Inquiry Completed. "); 


      UUID[] uuidSet = new UUID[1]; 
      uuidSet[0]=new UUID(0x1105); //OBEX Object Push service 

      int[] attrIDs = new int[] { 
        0x0100 // Service name 
      }; 

      for (RemoteDevice device : listener.devices) { 
       agent.searchServices(
         attrIDs,uuidSet,device,listener); 


       try { 
        synchronized(lock){ 
         lock.wait(); 
        } 
       } 
       catch (InterruptedException e) { 
        e.printStackTrace(); 
        return; 
       } 


       System.out.println("Service search finished."); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 



    @Override 
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass arg1) { 
     String name; 
     try { 
      name = btDevice.getFriendlyName(false); 
     } catch (Exception e) { 
      name = btDevice.getBluetoothAddress(); 
     } 

     devices.add(btDevice); 
     System.out.println("device found: " + name); 

    } 

    @Override 
    public void inquiryCompleted(int arg0) { 
     synchronized(lock){ 
      lock.notify(); 
     } 
    } 

    @Override 
    public void serviceSearchCompleted(int arg0, int arg1) { 
     synchronized (lock) { 
      lock.notify(); 
     } 
    } 

    @Override 
    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { 
     for (int i = 0; i < servRecord.length; i++) { 
      String url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); 
      if (url == null) { 
       continue; 
      } 
      DataElement serviceName = servRecord[i].getAttributeValue(0x0100); 
      if (serviceName != null) { 
       System.out.println("service " + serviceName.getValue() + " found " + url); 

       if(serviceName.getValue().equals("OBEX Object Push")){ 
        sendMessageToDevice(url);     
       } 
      } else { 
       System.out.println("service found " + url); 
      } 


     } 
    } 

    private static void sendMessageToDevice(String serverURL){ 
     try{ 
      System.out.println("Connecting to " + serverURL); 

      ClientSession clientSession = (ClientSession) Connector.open(serverURL); 
      HeaderSet hsConnectReply = clientSession.connect(null); 
      if (hsConnectReply.getResponseCode() != ResponseCodes.OBEX_HTTP_OK) { 
       System.out.println("Failed to connect"); 
       return; 
      } 

      HeaderSet hsOperation = clientSession.createHeaderSet(); 
      hsOperation.setHeader(HeaderSet.NAME, "Hello.txt"); 
      hsOperation.setHeader(HeaderSet.TYPE, "text"); 

      //Create PUT Operation 
      Operation putOperation = clientSession.put(hsOperation); 

      // Send some text to server 
      byte data[] = "Hello World !!!".getBytes("iso-8859-1"); 
      OutputStream os = putOperation.openOutputStream(); 
      os.write(data); 
      os.close(); 

      putOperation.close(); 

      clientSession.disconnect(null); 

      clientSession.close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

}