×
Namespaces

Variants
Actions
Revision as of 08:45, 7 December 2011 by hamishwillee (Talk | contribs)

Como encontrar dispositivos e serviços Bluetooth

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Artigo
Tradução:
Por dcrocha
Última alteração feita por hamishwillee em 07 Dec 2011

Original: How to search for Bluetooth devices and services

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

100 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×