×
Namespaces

Variants
Actions
(Difference between revisions)

Como encontrar dispositivos e serviços Bluetooth

From Nokia Developer Wiki
Jump to: navigation, search
hamishwillee (Talk | contribs)
m (Hamishwillee - Automated change of category from Lang-PT to Unlikely Category. (Moving))
hamishwillee (Talk | contribs)
m (Hamishwillee - Fix broken link)
Line 1: Line 1:
 +
[[Category:Java ME]]
 
Original: [[How to search for Bluetooth devices and services]]
 
Original: [[How to search for Bluetooth devices and services]]
  
Para utilizar o protocolo [[Bluetooth]] em aplicações [[:Category:Java_ME_(Português) | Java ME]], seu dispositivo precisa implementar JSR-82, Bluetooth API.
+
Para utilizar o protocolo [[Bluetooth]] em aplicações [[Portal:Java_ME_(Português) | 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.
 
Um dos principais desafios em aplicações Bluetooth é descobrir os endereços de conexão, para devices com serviços específicos disponíveis.
Line 163: Line 164:
 
* [http://sergioestevao.com/midp/files/2008/08/bluetoothgps.jar Jar File]
 
* [http://sergioestevao.com/midp/files/2008/08/bluetoothgps.jar Jar File]
  
[[Category:Lang-Portuguese]][[Category:Code Examples]][[Category:Java ME]]
+
[[Category:Lang-Portuguese]][[Category:Code Examples]]

Revision as of 13:51, 14 July 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

79 page views in the last 30 days.
×