×
Namespaces

Variants
Actions
Revision as of 17:05, 11 December 2007 by dcrocha (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Como encontrar dispositivos e serviços Bluetooth

From Nokia Developer Wiki
Jump to: navigation, search

Para utilizar o protocolo Bluetooth em aplicações [[:Category:Java_ME_(Português)], 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 {
// used to store devices we found
public Vector btDevicesFound;
// used to store service information for each device
public Vector btServicesFound;
 
public BTManager() {
btDevicesFound = new Vector();
btServicesFound = new Vector();
}
 
public int find(UUID[] aServices){
// search for devices
findDevices();
// search for services in the devices found
findServices(aServices);
return btDevicesFound.size();
}

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

public int findDevices() {
try {
// cleans previous elements
btDevicesFound.removeAllElements();
// resets status variable
isBTSearchComplete = false;
LocalDevice local = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
// start discovery of new devices
discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
while ((!isBTSearchComplete)) {
//waits for a fixed time, to avoid long search
synchronized (this) {
this.wait(BTManager.BLUETOOTH_TIMEOUT);
}
// check if search is completed
if (!isBTSearchComplete) {
// search no yet completed so let's cancel it
discoveryAgent.cancelInquiry(this);
}
}
} catch (Exception e) {
e.printStackTrace();
}
// returns the number of devices found
return btDevicesFound.size();
}
 
public void deviceDiscovered(RemoteDevice remoteDevice,
DeviceClass deviceClass) {
btDevicesFound.addElement(remoteDevice);
}
 
public void inquiryCompleted(int param) {
isBTSearchComplete = true;
// notifies and wake main thread that device search is completed
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) {
// cleans previous elements
btServicesFound.removeAllElements();
try {
LocalDevice local = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = local.getDiscoveryAgent();
// discover services
if (btDevicesFound.size() > 0) {
for (int i = 0; i < btDevicesFound.size(); i++) {
isBTSearchComplete = false;
// adds a null element in case we don't found service
btServicesFound.addElement(null);
int transID = discoveryAgent.searchServices(null, aServices,
(RemoteDevice) (btDevicesFound.elementAt(i)), this);
// wait for service discovery ends
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;
// notifies and wake mains thread that service search is completed
synchronized (this) {
this.notify();
}
}

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.

  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 complete onde eu mostro um exemplo de como usá-lo para buscar por um dispositivo GPS Bluetooth.

Downloads

97 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.

×