Namespaces
Variants
Actions
(Difference between revisions)

Como encontrar dispositivos e serviços Bluetooth

Jump to: navigation, search
Line 19: Line 19:
  
 
public class BTManager implements DiscoveryListener {
 
public class BTManager implements DiscoveryListener {
   // used to store devices we found
+
   // Variável para armazenar os dispositivos encontrados
 
   public Vector btDevicesFound;
 
   public Vector btDevicesFound;
   // used to store service information for each device
+
   // Variável utilizada para armazenar os serviços de cada dispositivo
 
   public Vector btServicesFound;
 
   public Vector btServicesFound;
 
    
 
    
Line 30: Line 30:
  
 
   public int find(UUID[] aServices){         
 
   public int find(UUID[] aServices){         
     // search for devices
+
     // Procurar por dispositivos
 
     findDevices();
 
     findDevices();
     // search for services in the devices found
+
     // Procura por serviços de um determinado serviço
 
     findServices(aServices);
 
     findServices(aServices);
 
     return btDevicesFound.size();
 
     return btDevicesFound.size();
Line 38: Line 38:
 
</code>
 
</code>
  
Como você pode ver, implementaremos a interface <tt>DiscoveryListener</tt>. Esta interface fornece todos os callbacks para nossas chamadas Bluetooth. Vamos começar procurando por dispositivos:
+
Como você pode observar, implementaremos a interface <tt>DiscoveryListener</tt>. Esta interface fornece todos os ''callbacks'' para nossas chamadas Bluetooth. Vamos começar procurando por dispositivos:
  
 
<code java>
 
<code java>
 
public int findDevices() {
 
public int findDevices() {
 
     try {
 
     try {
       // cleans previous elements
+
       // Limpa elementos anteriores
 
       btDevicesFound.removeAllElements();
 
       btDevicesFound.removeAllElements();
       // resets status variable
+
       // Reseta variáveis de status
 
       isBTSearchComplete = false;
 
       isBTSearchComplete = false;
 
       LocalDevice local = LocalDevice.getLocalDevice();
 
       LocalDevice local = LocalDevice.getLocalDevice();
 
       DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();       
 
       DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();       
       // start discovery of new devices
+
       // Inicializa a descoberta por novos dispositivos
 
       discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
 
       discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
 
       while ((!isBTSearchComplete)) {
 
       while ((!isBTSearchComplete)) {
         //waits for a fixed time, to avoid long search
+
         //Espera por um intervalo de tempo fixo para evitar longos períodos
 
         synchronized (this) {           
 
         synchronized (this) {           
 
           this.wait(BTManager.BLUETOOTH_TIMEOUT);
 
           this.wait(BTManager.BLUETOOTH_TIMEOUT);
 
         }
 
         }
         // check if search is completed
+
         // Checa se a busca foi completada
 
         if (!isBTSearchComplete) {
 
         if (!isBTSearchComplete) {
           // search no yet completed so let's cancel it
+
           // Descoberta ainda não finalizada. Força a finalização!
 
           discoveryAgent.cancelInquiry(this);
 
           discoveryAgent.cancelInquiry(this);
 
         }
 
         }
Line 65: Line 65:
 
       e.printStackTrace();
 
       e.printStackTrace();
 
     }
 
     }
     // returns the number of devices found
+
     // Retorna o número de dispositivos encontrados
 
     return btDevicesFound.size();
 
     return btDevicesFound.size();
 
   }
 
   }
Line 76: Line 76:
 
   public void inquiryCompleted(int param) {
 
   public void inquiryCompleted(int param) {
 
     isBTSearchComplete = true;
 
     isBTSearchComplete = true;
     // notifies and wake main thread that device search is completed
+
     // Notifica e acorda a thread principal para informar que a descoberta foi completada
 
     synchronized (this) {
 
     synchronized (this) {
 
       this.notify();
 
       this.notify();
Line 87: Line 87:
 
<code java>
 
<code java>
 
public void findServices(UUID[] aServices) {
 
public void findServices(UUID[] aServices) {
     // cleans previous elements
+
     // Limpa elementos adicionados anteriormente
 
     btServicesFound.removeAllElements();
 
     btServicesFound.removeAllElements();
 
     try {
 
     try {
 
       LocalDevice local = LocalDevice.getLocalDevice();
 
       LocalDevice local = LocalDevice.getLocalDevice();
 
       DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
 
       DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
       // discover services
+
       // Descoberta de serviços
 
       if (btDevicesFound.size() > 0) {
 
       if (btDevicesFound.size() > 0) {
 
         for (int i = 0; i < btDevicesFound.size(); i++) {
 
         for (int i = 0; i < btDevicesFound.size(); i++) {
 
           isBTSearchComplete = false;
 
           isBTSearchComplete = false;
           // adds a null element in case we don't found service
+
           // Adiciona uma referência null no caso de não dispositivos não serem descobertos
 
           btServicesFound.addElement(null);
 
           btServicesFound.addElement(null);
 
           int transID = discoveryAgent.searchServices(null, aServices,
 
           int transID = discoveryAgent.searchServices(null, aServices,
 
               (RemoteDevice) (btDevicesFound.elementAt(i)), this);
 
               (RemoteDevice) (btDevicesFound.elementAt(i)), this);
           // wait for service discovery ends
+
           // Espera até que a descoberta dos serviços sejam finalizados
 
           synchronized (this) {
 
           synchronized (this) {
 
             this.wait(BTManager.BLUETOOTH_TIMEOUT);
 
             this.wait(BTManager.BLUETOOTH_TIMEOUT);
Line 123: Line 123:
 
  public void serviceSearchCompleted(int transID, int respCode) {
 
  public void serviceSearchCompleted(int transID, int respCode) {
 
     isBTSearchComplete = true;
 
     isBTSearchComplete = true;
     // notifies and wake mains thread that service search is completed
+
     // Notifica e acorda a thread principal para informar a finalização da descoberta de serviços
 
     synchronized (this) {
 
     synchronized (this) {
 
       this.notify();
 
       this.notify();
Line 130: Line 130:
 
</code>
 
</code>
  
Depois que pegamos todos os dados armazenados em nossos Vectors, precisamos apenas adicionar dois novos métodos, um para buscar a URL de conexão e outro para obter o nome amigável (friendly name) do aparelho, pois para o usuário final endereços MAC de dispositivos Bluetooth não são muito úteis.
+
Depois que obtermos todos os dados armazenados nos objetos Vectors, precisamos apenas adicionar dois novos métodos, um para buscar a URL de conexão e outro para obter o nome amigável (friendly name) do aparelho, pois para o usuário final endereços MAC de dispositivos Bluetooth não são muito úteis.
  
 
<code java>
 
<code java>
Line 154: Line 154:
 
</code>
 
</code>
  
Com esses últimos métodos completamos nossa classe Bluetooth finder. Você pode checar o código-fonte complete onde eu mostro um exemplo de como usá-lo para buscar por um dispositivo GPS Bluetooth.
+
Com esses últimos métodos, completamos nossa classe Bluetooth finder. Você pode checar o código-fonte completo onde eu mostro um exemplo de como usá-lo para buscar por um dispositivo GPS Bluetooth.
  
 
== Downloads ==
 
== Downloads ==

Revision as of 04:40, 1 October 2009

Para utilizar o protocolo Bluetooth em aplicações Java ME, seu dispositivo precisa implementar JSR-82, Bluetooth API.

Um dos principais desafios em aplicações Bluetooth é descobrir os endereços de conexão, para devices com serviços específicos disponíveis.

No próximo exemplo implementaremos este código usando uma classe chamada BtManager.

Vamos começar criando a classe e algumas variáveis para armazenar nossos resultados.

import java.util.Vector;
// bluetooth classes
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;
 
public class BTManager implements DiscoveryListener {
// Variável para armazenar os dispositivos encontrados
public Vector btDevicesFound;
// Variável utilizada para armazenar os serviços de cada dispositivo
public Vector btServicesFound;
 
public BTManager() {
btDevicesFound = new Vector();
btServicesFound = new Vector();
}
 
public int find(UUID[] aServices){
// Procurar por dispositivos
findDevices();
// Procura por serviços de um determinado serviço
findServices(aServices);
return btDevicesFound.size();
}

Como você pode observar, implementaremos a interface DiscoveryListener. Esta interface fornece todos os callbacks para nossas chamadas Bluetooth. Vamos começar procurando por dispositivos:

public int findDevices() {
try {
// Limpa elementos anteriores
btDevicesFound.removeAllElements();
// Reseta variáveis de status
isBTSearchComplete = false;
LocalDevice local = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
// Inicializa a descoberta por novos dispositivos
discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
while ((!isBTSearchComplete)) {
//Espera por um intervalo de tempo fixo para evitar longos períodos
synchronized (this) {
this.wait(BTManager.BLUETOOTH_TIMEOUT);
}
// Checa se a busca foi completada
if (!isBTSearchComplete) {
// Descoberta ainda não finalizada. Força a finalização!
discoveryAgent.cancelInquiry(this);
}
}
} catch (Exception e) {
e.printStackTrace();
}
// Retorna o número de dispositivos encontrados
return btDevicesFound.size();
}
 
public void deviceDiscovered(RemoteDevice remoteDevice,
DeviceClass deviceClass) {
btDevicesFound.addElement(remoteDevice);
}
 
public void inquiryCompleted(int param) {
isBTSearchComplete = true;
// Notifica e acorda a thread principal para informar que a descoberta foi completada
synchronized (this) {
this.notify();
}
}

Agora que temos uma lista de dispositivos, vamos procurar apenas aqueles serviços que nos interessam:

public void findServices(UUID[] aServices) {
// Limpa elementos adicionados anteriormente
btServicesFound.removeAllElements();
try {
LocalDevice local = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
// Descoberta de serviços
if (btDevicesFound.size() > 0) {
for (int i = 0; i < btDevicesFound.size(); i++) {
isBTSearchComplete = false;
// Adiciona uma referência null no caso de não dispositivos não serem descobertos
btServicesFound.addElement(null);
int transID = discoveryAgent.searchServices(null, aServices,
(RemoteDevice) (btDevicesFound.elementAt(i)), this);
// Espera até que a descoberta dos serviços sejam finalizados
synchronized (this) {
this.wait(BTManager.BLUETOOTH_TIMEOUT);
}
if (!isBTSearchComplete) {
discoveryAgent.cancelServiceSearch(transID);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
 
public void servicesDiscovered(int param, ServiceRecord[] serviceRecord) {
int index = btServicesFound.size() - 1;
for (int i = 0; i < serviceRecord.length; i++) {
btServicesFound.setElementAt(serviceRecord[i], index);
}
}
 
public void serviceSearchCompleted(int transID, int respCode) {
isBTSearchComplete = true;
// Notifica e acorda a thread principal para informar a finalização da descoberta de serviços
synchronized (this) {
this.notify();
}
}

Depois que obtermos todos os dados armazenados nos objetos Vectors, precisamos apenas adicionar dois novos métodos, um para buscar a URL de conexão e outro para obter o nome amigável (friendly name) do aparelho, pois para o usuário final endereços MAC de dispositivos Bluetooth não são muito úteis.

  public String getDeviceName(int deviceID) {
try {
return ((RemoteDevice) btDevicesFound.elementAt(deviceID))
.getFriendlyName(false);
} catch (Exception e) {
e.printStackTrace();
}
return "Error";
}
 
public String getServiceURL(int deviceID) {
try {
return ((ServiceRecord) btServicesFound.elementAt(deviceID))
.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
} catch (Exception e) {
e.printStackTrace();
}
return "Error";
}

Com esses últimos métodos, completamos nossa classe Bluetooth finder. Você pode checar o código-fonte completo onde eu mostro um exemplo de como usá-lo para buscar por um dispositivo GPS Bluetooth.

Downloads

176 page views in the last 30 days.
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2013 All rights reserved