Я подключаюсь к модулю Bluetooth HC05 и общаюсь с Arduino, и это работает довольно хорошо.
Но я столкнулся с проблемой.
Иногда невозможно подключиться кмодуль Bluetooth снова после отключения, если я не перезапущу HC05.
Я думаю, может быть, это как-то связано с тем, как я делаю подключение и отключение.Я использую различные действия для подключения и отключения соединения с моим модулем Bluetooth.
Я вызываю это, чтобы запустить соединение Bluetooth:
try {
findBT();
openBT();
} catch (IOException e) {
Log.e("Bluetooth", "Couldn't find or connect to bluetooth");
}
Вот мой код для поиска определенного модуля Bluetooth:
void findBT() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast errore = makeText(Menu2.this, "Error, enable bluetooth", Toast.LENGTH_LONG);
errore.show();
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
.getBondedDevices();
if (pairedDevices.isEmpty()) {
Log.e("bluetooth",
"No devices paired...");
return ;
}
String MY_MAC_ADDR = getResources().getString(R.string.Machine_Bluetooth_MAC);
for (BluetoothDevice device : pairedDevices) {
Log.d("Bluetooth", "Device : address : " + device.getAddress() + " name :"
+ device.getName());
if (MY_MAC_ADDR.equals(device.getAddress())) {
mmDevice = device;
break;
}
}
Log.e("Bluetooth", "Bluetooth device found01");
//Toast found = makeText(MachineReady.this, "Bluetooth device found", Toast.LENGTH_LONG);
//found.show();
}
Подключение к Bluetooth:
void openBT() throws IOException {
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
Log.e("Bluetooth", "Almost connected");
mBluetoothAdapter.cancelDiscovery();
mmSocket.connect();
Log.e("Bluetooth", "Connected");
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
if(mmSocket.isConnected()){
bluConnection = true;
beginListenForData();
Log.e("Bluetooth", "Bluetooth connection has been established4");
try {
String msg = "512\n";
mmOutputStream.write(msg.getBytes());
} catch (IOException e) {
Log.e("Send bluetooth", "Couldn't send text");
}
}else if(!mmSocket.isConnected()){
Log.e("Bluetooth", "Bluetooth couldn't connect to the device");
}
}
Прослушивание данных, полученных с Bluetooth:
void beginListenForData()
{
final Handler handler = new Handler();
final byte delimiter = 10; //This is the ASCII code for a newline character
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopWorker)
{
try
{
int bytesAvailable = mmInputStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for(int i=0;i<bytesAvailable;i++)
{
byte b = packetBytes[i];
if(b == delimiter)
{
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable()
{
public void run()
{
Log.e("Bluetooth", "Bluetooth data received is " + data);
if(data.contains("z")){
sendokcommand();
try {
closeBT();
} catch (IOException e) {
Log.e("Close bluetooth", "Couldn't close the bluetooth connection13");
e.printStackTrace();
}
busyMachineString = data;
MachinesAdapter.setString(busyMachineString);
}
}
});
}
else
{
readBuffer[readBufferPosition++] = b;
}
}
}
}
catch (IOException ex)
{
stopWorker = true;
}
}
}
});
workerThread.start();
}
Когда я получаю команду, я посылаю команду OK, чтобы подтвердить, что я получил правильное сообщение:
public void sendokcommand(){
if(bluConnection) {
try {
String msg = "0\n";
mmOutputStream.write(msg.getBytes());
//Toast b = Toast.makeText(this, msg, Toast.LENGTH_LONG);
//b.show();
} catch (IOException e) {
Log.e("Send bluetooth", "Couldn't send text");
}
}
}
Я использую CloseBT всякий раз, когда я покидаю свою деятельность:
void closeBT() throws IOException
{
stopWorker = true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
}
Методы подключения и отключения выглядят правильно, или мне нужно сделать это по-другому?Я получаю эту ошибку в своем Журнале, когда происходит сбой: «Не удалось найти или подключиться к Bluetooth», который взят из моего первого фрагмента кода.
Извините за этот длинный пример, я просто подумал, что будет важнопокажи, как я справляюсь с различными сценариями Bluetooth.Я надеюсь, что вы можете и поможете мне.