Como encontrar dispositivos e serviços Bluetooth
hamishwillee
(Talk | contribs) m (Hamishwillee - Bot update of Template:ArticleMetaData - Deleting duplicate original translation link) |
|||
| (6 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
| − | Para utilizar o protocolo [[Bluetooth]] em aplicações [[ | + | {{ArticleMetaData |
| + | |sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] --> | ||
| + | |installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) --> | ||
| + | |devices= <!-- Devices tested against - e.g. ''devices=Nokia 6131 NFC, Nokia C7-00'') --> | ||
| + | |sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) --> | ||
| + | |platform= <!-- Compatible platforms - e.g. Symbian^1 and later, Qt 4.6 and later --> | ||
| + | |devicecompatability= <!-- Compatible devices e.g.: All* (must have internal GPS) --> | ||
| + | |dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 --> | ||
| + | |signing=<!-- Signing requirements - empty or one of: Self-Signed, DevCert, Manufacturer --> | ||
| + | |capabilities=<!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. --> | ||
| + | |keywords= <!-- APIs, classes and methods (e.g. QSystemScreenSaver, QList, CBase --> | ||
| + | |id= <!-- Article Id (Knowledge base articles only) --> | ||
| + | |language=Lang-Portuguese | ||
| + | |translated-by=[[User:Dcrocha]] | ||
| + | |translated-from-title=How to search for Bluetooth devices and services | ||
| + | |translated-from-id=19191 | ||
| + | |review-by=<!-- After re-review: [[User:username]] --> | ||
| + | |review-timestamp=<!-- After re-review: YYYYMMDD --> | ||
| + | |update-by=<!-- After significant update: [[User:username]]--> | ||
| + | |update-timestamp=<!-- After significant update: YYYYMMDD --> | ||
| + | |creationdate=20071211 | ||
| + | |author=[[User:SergioEstevao]] | ||
| + | }}[[Category:Java ME]] | ||
| + | |||
| + | 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 157: | Line 181: | ||
== Downloads == | == Downloads == | ||
| − | * [http://sergioestevao.com/midp/ | + | * [http://sergioestevao.com/midp/files/2008/08/bluetoothgps-source-code.rar Full Source Code] |
| − | * [http://sergioestevao.com/midp/ | + | * [http://sergioestevao.com/midp/files/2008/08/bluetoothgps.jad Jad File] |
| − | * [http://sergioestevao.com/midp/ | + | * [http://sergioestevao.com/midp/files/2008/08/bluetoothgps.jar Jar File] |
| − | [[Category:Lang- | + | [[Category:Lang-Portuguese]][[Category:Code Examples]] |
| + | <!-- Translation --> [[en:How to search for Bluetooth devices and services]] | ||
Latest revision as of 09:37, 8 December 2011
Dados do artigo
Artigo
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.

