Detectar conexão bluetooth - Android

Pessoal do GUJ, boa noite…

Pesquisei um pouco e pode ser que eu não esteja utilizando os argumentos corretos de pesquisa, porque não tenho muita ideia de pelo que procurar…

O problema é o seguinte: Preciso fazer um programa SERVIDOR em android que fique escutando todas as conexões e tentativas de conexões que o aparelho receber.

Consigo pegar o bluetooth, ativar, ativar um serviço, fazer um cliente procurar pelo serviço, conectar e trafegar informações entre estes. Ou seja, sei trabalhar com aplicações cliente-servidor em bluetooth no android.
Mas não é o caso neste aplicativo, porque não posso instalar nada no celular dos clientes, sendo somente esse celular SERVIDOR responsavel por receber conexões genericas (E não de programas instalados nos clientes).

Como podem ver até a ideia é meio confusa, talvez eu nem tenha conseguido me explciar direito, mas peço a ajuda de vocês nesse problema grave e urgente que estou passando.

Agradeço,
Ricoldi.

O que vc quer talvez não seja possível em J2ME dada as limitações da JSR-82.

Recomendo se vc quer fazer um servidor, programar em Symbian ou Android (NDK) que pode oferecer muito mais controle sobre este tipo de “escuta”.

Realmente aplicações onde o cliente é o celular e o servidor é outro celular ou não são as tradicionais. Fazer o que você quer foge do arroz-com-feijão.

[quote=boone]O que vc quer talvez não seja possível em J2ME dada as limitações da JSR-82.

Recomendo se vc quer fazer um servidor, programar em Symbian ou Android (NDK) que pode oferecer muito mais controle sobre este tipo de “escuta”.

Realmente aplicações onde o cliente é o celular e o servidor é outro celular ou não são as tradicionais. Fazer o que você quer foge do arroz-com-feijão.[/quote]

Grande mestre Boone, a quanto tempo… Realmente em j2me, isso deve ser impossível de ser feito, porem, já o projeto citado acima já é Android… e não sei como fazer mesmo assim…

Alguma ajuda?

Abraços, Ricoldi.

Ricoldi,

Estou desenvolvendo um aplicativo em android que vai se conectar com dispositivos médicos (glicossimetro,balança digital,medidor de pressão e etc…) o celular vai ser o servidor que vai receber os dados e enviar via webservice para um site de monitoramento.

Para desenvolver o aplicativo eu fiz em base do aplicativo de demonstração do Android BluetoothChat e seguindo a documentação http://developer.android.com/guide/topics/wireless/bluetooth.html

Ao iniciar o aplicativo ele recebe via webservice os endereços MAC dos dispositivos para verificar o pareamento.

Caso o dispositivo não esteja pareado ele já faz o pareamento.

O aplicativo verifica se o dispositivo está pareado com o celular através do endereço MAC.

O próximo passo a pessoa escolhe qual dispositivo ela quer receber o resultado.

Após o recebimento do resultado eu envio para o site de monitoramento.

Eu não entendi bem a ideia mas espero que o exemplo assima possa ajudar em alguma coisa.

Outro detalhe importante para Android existem vários exemplos de desenvolvimento para Bluetooth.

Tendo bastante persistência acredito que você vá longe.

Abraços,

Se isso puder ajudar,

Sou Engenheiro de software trabalho tambem com telemedicina e equipamentos ECG,Expirometros,Oximetros usando bluetooth, USB, serial, Infrared etc

Meu ultimo projeto possibilitou Iphone, Ipad, macs, a comunicar com equipamentos bluetooth não Apple usando wi-fi e bluetooth

de um lado wi-fi do outro bluetooth.

Isso funcionou em Android 3.0 Xoon também. Se houver interesse, o hardware que desenvolvi, acompanha driver de diversas plataformas.

Trabalhando com wi-fi voce terá mais flexibilidade em projetos.

Não fui autorizado pela minha empresa em divulgar o video mas se tiver interesse, existe um topico meu antigo com um Motorola XT 720 2.1 e um modulo Bluetooth e no video abaixo do mesmo modulo Blutooth conectado ao Samsung Android.

[youtube]http://www.youtube.com/watch?v=2pzO642BAss&feature=player_detailpage[/youtube]

Prezado Mohawk,
sou professor e estou com um problema sério e urgente em um projeto que desenvolvo: tenho um hardware construído para captar as medidas de sensores e transmiti-las, via Bluetooth, para um dispositivo móvel.
Quando uso um terminal bluetooth para ler que está vindo, está tudo ok. Isto comprova que o programinha gravado no microcontrolador está ok.
Entretanto, quando faço meu programa Android (um server) e instalo no smarthphone os dados vêem todos truncados.
Como não tenho thread no emissor (circuito eletrônico), os dados são enviados dentro de um laço infinito de repetições. No servidor (Android) tenho as threads, mas a sensação que tenho é de que estão sem sincronismo.
Você pode me ajudar? Estou precisando disso urgentíssimo.
Antecipo meus agradecimentos!
Att.

Gabriel

[quote=gabrields]Prezado Mohawk,
sou professor e estou com um problema sério e urgente em um projeto que desenvolvo: tenho um hardware construído para captar as medidas de sensores e transmiti-las, via Bluetooth, para um dispositivo móvel.
Quando uso um terminal bluetooth para ler que está vindo, está tudo ok. Isto comprova que o programinha gravado no microcontrolador está ok.
Entretanto, quando faço meu programa Android (um server) e instalo no smarthphone os dados vêem todos truncados.
Como não tenho thread no emissor (circuito eletrônico), os dados são enviados dentro de um laço infinito de repetições. No servidor (Android) tenho as threads, mas a sensação que tenho é de que estão sem sincronismo.
Você pode me ajudar? Estou precisando disso urgentíssimo.
Antecipo meus agradecimentos!
Att.

Gabriel[/quote]

Eu dou aula de Android para interfaces Bluetooth e Wi-Fi nunca viu o que voce esta dizendo, bom você não disse mas o que você deve estar usando um módulo bluetooth utilizando o SPP, certo?

O que realmente é necessário para o Android se conectar se for o caso. Digamos que é um módulo semelhante a da empresa Roving Networks de Los Gatos no EUA no qual eu sou suporte Android para Bluetooth www.rovingnetwork.com

é um modulo de tunel serial UART <-> Bluetooth.

Se for, siga estes passos.

Parear o modulo fora da aplicação. Não tente uma conexão sem pareamento, não é uma boa prática.

Nem preciso dizer sobre as permissões isso é básico.

  1. Teste se a unidade local esta ligada
  2. Obtenha a unidade remota pelo mac dela mas faça o pareamento pelo aparelho e não por software. Houve uma mudança do 2.1 para 2.2 e quem não sabe das diferenças vai se embananar aqui.
  3. Obtenha o socket com a unidade remota, passo anterior, junto com o UUID do SPP
  4. Com o socket obtenha os IOs. InputStream e OutputStream.
  5. Ainda com o socket poderá usar o método connect() pronto sua conexão pronta nas camadas: física, enlace e rede. OSI

Esqueça um pouco essa estrutura de Mestre e Escravo pelo visto voce começou j2me, seria isso? no Android o que se aprendeu em j2me não se aplica quase nada.

Se não souber como faz, eu dou aulas disso nesta empresa http://www.microgenios.com.br um curso de Android como interface homem máquina.

Esta parecendo que voce esta por exemplo com um MCU em uma taxa de transmissão serial e o modulo em outra. Um erro de configuração muito comum mas como seu terminal Bluetooth funciona como vc diz

só resta uma pergunta sua conversão de array de bytes esta correta? se estamos falando somente no Bluetooth(rádio) e não no serial(UART) ou voce não converteu de forma correta de String para array de bytes ou de array de bytes para String.

Coloque seu código aqui para que eu possa analisar. Não precisa de Thread se voce conhece o que e quando vai receber ainda mais se a aplicação é didática.

Você não conseguiu entender o exemplo do chat Bluetooth? bastar trocar a UUID? Lá sim usa Thread de uma forma magnífica. O Blueterm copiou eu também usei e fiz para Roving a minha aplicação RN Talk e deixei livre também no Google Market a quase 2 anos.

Mohawk

Mohawk, obrigado pelo breve retorno!
Bom, preciso explicar alguns detalhes: sou iniciante com Android e o projeto é desenvolvido em parceria com outra escola que fez a parte eletronica de captura. Sim, é utilizado um SPP, pela substituicao do firmware no componente F2M03MLA (conforme me foi informado pelo outro professor).
O que preciso fazer é receber 8 valores a partir do bluetooth, referentes aos ID e respectivas leituras de 4 sensores. No dispositivo eltronico esta tudo certo porque, como eu disse, no terminal chega tudo certinho.
Abaixo seguem as 2 classes que construimos para receber e mostrar estes dados (no Log).
Como disse, somos iniciantes e peço desculpas pelos erros imaturos.

package br.project.b4bnote.connection.bluetooth;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.UUID;
import br.project.b4bnote.connection.Connection;
import br.project.b4bnote.control.Config;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

public class BluetoothConnection implements Connection {
	@Override
	public void connect() {
		BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
		BluetoothDevice mmDevice = null;
		Set<BluetoothDevice> pairedDevices = bluetooth.getBondedDevices();
		if (pairedDevices.size() > 0) {			
			// Loop through paired devices			
			for (BluetoothDevice device : pairedDevices) {
				//apenas para vermos os dispositivos emparelhados no log
				//System.out.println("name: "+device.getName()+" - MAC: "+device.getAddress());
				// finding the device that has the belt according to its mac
				// substituir o Config.mac pelo nome do dispositivo a conectar
				if (device.getName().equals(Config.mac)) {
					mmDevice = device;
					break;
				}
			}
		}
		BluetoothSocket mmSocket;		
		try {
			Method m = mmDevice.getClass().getMethod("createRfcommSocket",
					new Class[] { int.class });
			mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);
			//Em alguns celulares está dando erro no método invoke acima.
			// connecting
			mmSocket.connect();
			// new thread to receive data
			Reader lei = new Reader(mmSocket);
			Thread t = new Thread(lei);
			t.start();
		} catch (Exception e) {
			System.out.println("*********** O ERRO FOI : " + e);
		}
	}
}
package br.project.b4bnote.connection.bluetooth;
import java.io.InputStream;
import br.project.b4bnote.connection.ConnectionFacade;
import android.bluetooth.BluetoothSocket;
public class Reader implements Runnable {

	private BluetoothSocket socket;
	private ConnectionFacade facade;

	public Reader(BluetoothSocket socket) {
		this.socket = socket;
		// usado no nosso projeto, nao tem nada a ver com a conexao bluetooth
		//facade = new ConnectionFacade();
	}

	public void run() {
		try {
			InputStream in = socket.getInputStream();
			// temos que receber 8 bytes enviados pelo dispositivo eletronico
			byte[] buffer = new byte[8];
			while (true) {
				in.read(buffer);
				//facade.addByte(new String(buffer));
				System.out.println(new String(buffer));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Obrigado,

Faz isso aqui para obter o socket

private static final UUID SPP_UUID = UUID.fromString(“00001101-0000-1000-8000-00805f9b34fb”);

mmSocket = mmDevice.createRfcommSocketToServiceRecord(SPP_UUID);

Voce fez um while sem fim!

Nem precisa de Thread para ler se voce sabe o que vem. Usa um CR e detecte-o para terminar o while pelo menos.

Se é didático não complique para os pobres alunos.

Eu não vou corrigir seu código inteiro, da uma olhada no exemplo Chat Bluetooth já que você quer fazer uma Thread, reinventar a roda para que ta muito bem feito lá.

No meu curso eu faço meus alunos acenderem leds, lampadas, ligar motores tudo via Bluetooth e wi-fi sem usar Threads e Runnables.

Não copie o código de terceiros entenda e faça o seu. O importantes é demonstrar as classes do bluetooth local, remoto, socket e lógico os IOs

Não existe um metodo que diga que o Bluetooth remoto desligou isso sai por exception, dê o tratamento devido e saia desse seu while eterno!

Boa sorte
Mohawk