Соединение Bluetooth (Android/Bluesmirf) работает корректно, только если оно еще не подключено
Я пытаюсь установить связь через Bluetooth между планшетом Android и Arduino с помощью Bluetooth-ключа BlueSmirf. В своем коде Android я сначала проверяю список уже сопряженных устройств для того, которое ищу. Если его там нет, я начинаю открывать. Обе возможности работают до такой степени, что индикатор состояния на BlueSmirf становится зеленым, указывая на успешное соединение. Но только если устройство не было сопряжено до того, как я запустил приложение, я также могу отправлять / получать данные через Bluetooth. Если устройство было сопряжено ранее, соединение устанавливается более надежно, а также быстрее, но данные не могут быть отправлены или получены. У вас есть идеи, почему это может быть? Спасибо заранее!
Вот соответствующий код:
public void connect() {
// I know I should be using an intent here...
while (!bluetoothAdapter.isEnabled()) {
bluetoothAdapter.enable();
}
pairedDevices = bluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("FireFly-8AAD")) {
mDevice = device;
}
}
}
if (mDevice == null) {
// BroadcastReceiver registered with IntentFilter(BluetoothDevice.ACTION_FOUND)
registerReceiver(mReceiver, find);
if (!bluetoothAdapter.isDiscovering ()) {
bluetoothAdapter.startDiscovery();
}
}
while (mDevice == null) {
// Wait for BroadcastReceiver to find the device and
// connect
}
if (mDevice != null) {
// Create socket connection in a new thread
Connect connection = new Connect();
new Thread(connection).start();
}
while (mSocket == null) {
// Wait for successfull socket connection
}
if (mSocket != null) {
// Get input/ouputstream
Communication communicate = new Communication();
new Thread(communicate).start();
}
}
ОБНОВИТЬ:
Я теперь также попытался заменить эту часть:
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("FireFly-8AAD")) {
mDevice = device;
}
}
}
с этим:
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("FireFly-8AAD")) {
mDevice = bluetoothAdapter.getRemoteDevice(device.getAddress());
}
}
}
как предлагается здесь: Android Bluetooth принять () / подключиться () с уже сопряженными устройствами
Но это все еще не работает...
ОБНОВЛЕНИЕ 2:
Я заменил
device.getName().equals("FireFly-8AAD")
с
device.getAddress().equals("MAC-Address here")
Все та же проблема.
Я также попытался запустить весь процесс подключения в новом потоке, в отличие от запуска только socket.connect() и socket.getInput/OuputStream, но это тоже не помогает.
ОБНОВЛЕНИЕ 3:
Я подумал, что может помочь, если я также предоставлю код, который устанавливает соединение, с помощью которого я могу отправлять / получать данные:
private class mBroadcastReceiver extends BroadcastReceiver {
private String discoveredDeviceName;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
}
if (discoveredDeviceName.equals("FireFly-8AAD")) {
bt_device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
}
}
};
1 ответ
При раннем сопряжении bluesmirf я выполняю "cancelDiscovery()" перед connect(), например:
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(macAddr);
if (adapter.isDiscovering())
adapter.cancelDiscovery();
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
btSocket = (BluetoothSocket) m.invoke(device, 1);
но иногда модуль Bluetooth остается подключенным после закрытия потока и гнезда, а зеленый светодиод остается активным и после выключения планшета. Это очень странно, я думаю, что это аппаратная проблема.