Android - Ler ou Escrever dados usando Bluetooth

E ai galera, seguinte tenho um leitor RFID no qual emparelho ele manualmente com meu celular que roda ANDROID através do bluetooth, preciso achar uma forma de transferir e receber dados através desses aparelhos. Já tentei pesquisar em alguns foruns e fazer alguns teste porém sem sucesso, também foi na documentação do android em bluetooth porém não consegui implementar uma solução para o meu caso, se alguém tiver alguma coisa que possa me ajudar eu agradeço muito(seja uma biblioteca ou código), obrigado a todos!

Caro Ivan, Bom dia !
espero que te ajude,

criei uma comunicação entre um dispositivo Bluetooth leitor de código de barras com esse guia que é bem prático.

Abraços.

[quote=Tenkara Kiddo]Caro Ivan, Bom dia !
espero que te ajude,

criei uma comunicação entre um dispositivo Bluetooth leitor de código de barras com esse guia que é bem prático.

Abraços.
[/quote]

Bom dia Tenkara Kiddo Também testei os código dessa documentação mais o máximo que consegui foi detectar o aparelho pareado mais não consegui realizar a comunicação entre os dois dispositivos, vou continuar tentando em cima dessa documentação, se você tiver um exemplo simples ai também agradeço!

Não tenho nenhum exemplo comigo porém tive um problema parecido com o seu…

provavelmente por ser um dispositivo portátil o mesmo não tem o suporte a comunicações Bluetooth “seguras”,
são aquelas comunicações em que os dois dispositivos que serão pareados utilizam um código para validação.

por ex:

para conectar sem o uso de passwords. utilize uma conexão insegura

no exemplo de “Connecting as Client” você tem…

na versão 2.1 do Android não existe uma maneira aberta de você criar uma conexão insegura, mais tem como você utilizar Reflection para obter essa conexão.

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); tmp = (BluetoothSocket) m.invoke(device, 1);

referência: http://stackoverflow.com/questions/5308373/how-to-create-insecure-rfcomm-socket-in-android

não sei se eu fui bem explicativo, qualquer coisa deixa uma msg.

abraços.

Acredito que você está totalmente certo tanto que para parear com meu aparelho eu uso um código padrão que é 0000 ai quando eu vi aquele UUID da documentação fiquei boiando, vou testar a solução e posto qualquer resultado, vlw!

Beleza,
abraços.

Tenkara Kiddo voltei aqui testei a solução o código abaixo que você me passou funciona sem erros

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
BluetoothSocket mp = (BluetoothSocket) m.invoke(device, 1);

porém quando tento conectar para obter o getOutputStream e o getInputStream

Aparece o erro de Connection Refused, você sabe se tem alguma solução? Obrigado!

[quote=Ivan Alves]Tenkara Kiddo voltei aqui testei a solução o código abaixo que você me passou funciona sem erros


porém quando tento conectar para obter o getOutputStream e o getInputStream

Aparece o erro de Connection Refused, você sabe se tem alguma solução? Obrigado!
[/quote]

Acredito que o dispositivo RFID não dê permissão para conectar pela maneira insegura…
posta o stacktrace pra dar uma olhada melhor…

Uma pergunta meu leitor de RFID conecta automático pela chave 0000 e possível que ele me fornece um UUID para realizar essa conexão do modo seguro??

Você pode tentar dessa maneira

UUID MY_UUID =  UUID.fromString("0000"); que retorna um UUID 
 para ser usado aqui  tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

sendo que 0000 é a chave que você informou que era padrão do dispositivo…

Pelo que eu pesquisei agora UUID é o Universal Unique Indentifier que é uma Hash de 128 bits *acredito eu que seja uma criptografia de segurança para conectar com os dois dispositivos bluetooth e ele não pertence ao Android mais sim ao próprio Java

tenta dessa mandeira e manda um feedback…

abraços.

Olá pessoal, estou desenvolvendo aqui um joguinho para android que utiliza bluetooth. Só estou tendo dificuldades para testar no emulador alguém saberia uma forma de testar esta comunicação?

vlw…

Caro aquino,
utilize o celular para testar, o emulador não da suporte a Bluetooth.

você deve possuir um celular com Android com a versão maior que 2.x

1-Instale o driver USB do seu celular, não se engane os Androids por padrão dão suporte a somente “Sistema de arquivos”, somente após instalar o driver USB que você vai conseguir debugar pelo celular
2-Ative a debugação pelo Android esse artigo vai te ajudar http://developer.android.com/guide/developing/device.html
3-Depois de tudo certo é só conectar o celular no USB do computador e o Eclipse deve identificar automaticamente
4-Quando der o play na aplicação o Eclipse já deve te perguntar qual dispositivo você quer utilizar.

Caso tenha dúvidas é só deixar uma msg…

abraços.

Ola Tenkara, desculpe-me mas me expliquei mal. Gostaria de testar minha aplicação em outro aparelho Android mas so tenho um e nao consigo testar a comunicação bluetooth, teria como testar esta conexao de outra forma ou somente com outro aparelho?

Estou tentando receber dados de outros aparelhos para armazenar os valores e retornar p o aparelho q enviou o pedido e muito parecido com um chat via bluetooth so q para mais pessoas.

Vlw pela ajuda, obrigado…

Ola Tenkara, desculpe-me mas me expliquei mal. Gostaria de testar minha aplicação em outro aparelho Android mas so tenho um e nao consigo testar a comunicação bluetooth, teria como testar esta conexao de outra forma ou somente com outro aparelho?

Estou tentando receber dados de outros aparelhos para armazenar os valores e retornar p o aparelho q enviou o pedido e muito parecido com um chat via bluetooth so q para mais pessoas.

Vlw pela ajuda, obrigado…

Desculpe Aquino,
acabei entendendo errado :oops: hehehehehe
acho que só com outro aparelho mesmo…

Tenkara, bom dia!

Fiz uma aplicação Android para receber dados enviado a partir de um circuito eletrônico com bluetooth.
Quando uso algum terminal para receber estes dados no computador, a mensagem vem correta.
Na programação embarcada no microcontrolador é enviada a “palavra” com um \n no final.
No entanto, quando recebo estes dados no aplicativo Android (a conexão está ok, sem problemas), está havendo um problema tipo um “truncamento” da palavra. Por exemplo: se eu envio as palavras “teste” e “exemplo”, uma de cada vez (em um laço de repetição), quando mostro no celular aparece “teste” e depois “xemplo”, sumindo com a primeira letra da segunda palavra. Em algumas vezes, some até com 2 letras.
Será que pode ser algum problema com o \n que está sendo enviado ao final da palavra?

Obs: a conexão e todo o tratamento é feito como descrito no link: http://developer.android.com/guide/topics/connectivity/bluetooth.html

Aguardo retorno assim que possível! Estou precisando muito resolver isso!

Obrigado!

Bom dia Gabrields,
por favor poste como você fez a classe que recebe os dados do Bluetooth,
abraços.

[quote=Tenkara Kiddo]Bom dia Gabrields,
por favor poste como você fez a classe que recebe os dados do Bluetooth,
abraços.
[/quote]

Tenkara, segue o código de 2 classes: uma que faz a conexão e outra que recebe os dados transmitidos.

CLASSE BluetoothConnection <<<<<<

package modocon.procon.b4bcon.connection.bluetooth;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;

import modocon.procon.b4bcon.BeltProjectActivity;

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;

public class BluetoothConnection extends Thread {

	private final BluetoothSocket mmSocket;
	private final BluetoothDevice mmDevice;
	private final Handler mHandler;
	private BeltProjectActivity context;

	public BluetoothConnection(BluetoothDevice device, Handler handler) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		mHandler = handler;
		BluetoothSocket tmp = null;
		mmDevice = device;
		Method m = mmDevice.getClass().getMethod("createRfcommSocket",
			new Class[] { int.class });
			
		mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);
			
	}

	public void run() {
		try {
			mmSocket.connect();
		} catch (IOException connectException) {
			try {
				mmSocket.close();
			} catch (IOException closeException) {

			}
			return;
		}

		Reader r = new Reader(mmSocket, mHandler);
		Thread t = new Thread(r);
		t.start();
	}

	public void cancel() {
		try {
			mmSocket.close();
		} catch (IOException e) {

		}
	}
}

CLASSE READER <<<<<<

package modocon.procon.b4bcon.connection.bluetooth;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import modocon.procon.b4bcon.BeltProjectActivity;
import modocon.procon.b4bcon.control.InitializeDataProcessing;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;

public class Reader extends Thread {
	
	private final BluetoothSocket mmSocket;
	private final InputStream mmInStream;
	private final Handler mHandler;

	public Reader(BluetoothSocket socket, Handler handler) {
		mHandler = handler;
		mmSocket = socket;
		InputStream tmpIn = null;
	
		try {
			tmpIn = socket.getInputStream();
		} catch (IOException e) {
			
		}
		mmInStream = tmpIn;
	}
	
    public void run() {
        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()
        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                          	
            	bytes = mmInStream.read(buffer);
             	mHandler.obtainMessage(BeltProjectActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

	public void cancel() {
		try {
			mmSocket.close();
		} catch (IOException e) {
		}
	}
}

Obrigado!

E aí, Tenkara! Alguma novidade?
Abraço e obrigado!