Android Bluetooth принять () / подключиться () с уже сопряженными устройствами
У меня проблемы с подключением двух устройств Android через Bluetooth, что происходит только тогда, когда они были сопряжены ранее. Я работаю один как сервер, а другой как клиент.
Вот последовательность вещей на стороне сервера:
- Проверьте различные состояния Bluetooth (адаптер доступен, включен и т. Д.).
- вызовите listenUsingRfcommWithServiceRecord() с предопределенным UUID, который я выбрал.
- запрос на обнаружение устройства
- поскольку обнаружение происходит асинхронно, я вызываю accept() и жду входящего соединения.
На стороне клиента:
- Проверьте различные состояния Bluetooth (адаптер доступен, включен и т. Д.).
- для каждого устройства в getBondedDevices() я сравниваю getName() с именем сервера. Если есть совпадение, перейдите к шагу 6.
- Начать открытие BT
- Для каждого обнаруженного устройства (обратите внимание, что сопряженные устройства из 2a здесь не отображаются), сравните имя устройства с именем сервера. Если есть совпадение, перейдите к шагу 6.
- Отменить открытие
- На устройстве, которое было найдено на шаге 2, вызовите createRfcommSocketToServiceRecord() с тем же предопределенным UUID, который использовался на стороне сервера.
- Вызовите connect() и подождите, пока он вернет подключенный сокет.
Вышеописанный процесс прекрасно работает для меня, когда клиент и сервер никогда ранее не были сопряжены. Однако после того, как Android зарегистрирует их в списке устройств, они неизбежно прекратят свое действие на этапе connect()/accept().
Я искал решение уже пару дней и попробовал немало вещей, в том числе и эту: Подключение к уже подключенному устройству Bluetooth
Метод отражения у меня тоже не работает. Кажется, что connect() вернется сразу, но когда я попытался getOutputStream(), я получил исключение. На стороне accept() он даже не регистрирует, что кто-то пытался подключиться. Я серьезно нуждаюсь в некоторой помощи или указателе на получение устройств, чтобы установить соединение, как только они были связаны ранее.
Вот некоторая информация об устройствах:
- Я тестирую сервер и клиент на двух телефонах LG G2X.
- Оба они работают на Android 2.3.3, что соответствует уровню API 10.
- Опять же, вышеперечисленное работает после того, как я отключил устройства вручную в настройках
Спасибо заранее Мне около 2 недель в Android и Bluetooth, поэтому, если вы видите какие-либо пропущенные шаги или лучшие практики, пожалуйста, укажите их.
3 ответа
В клиенте, когда я пытаюсь установить соединение со связанным устройством, я просто вызывал его на устройстве Bluetooth, которое я нашел в BluetoothAdapter.getBondedDevices()
, Это не работает.
Чтобы правильно установить соединение Bluetooth, мне нужно было сделать что-то похожее на псевдокод ниже:
BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices();
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress());
BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID);
socket.connect();
Я получил этот ответ, точно следуя примеру чата Bluetooth: Служба чата Bluetooth. Почему это не работает на устройстве от getBondedDevices()
вне меня. Может быть, кто-то с более глубоким знанием Android может ответить на это.
Посмотрите этот пример: http://developer.android.com/resources/samples/BluetoothChat/index.html.
это может объяснить, как подключено устройство Bluetooth и передает информацию.
private static BluetoothSocket mSocket;
BluetoothDevice selectDevice = null;
void connectDevice(){
if(mSocket == null) {
//Log.d(TAG, "Socket is null");
UUID SPP_UUID = UUID
.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
Set<BluetoothDevice> bondedDevices = BluetoothAdapter
.getDefaultAdapter().getBondedDevices();
//Log.d(TAG, "Size: " + bondedDevices.size());
/**
* Select your divice form paired devices
*/
for (BluetoothDevice bluetoothDevice : bondedDevices) {
selectDevice = bluetoothDevice;
//Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress());
}
if(selectDevice.getBondState() == selectDevice.BOND_BONDED) {
//Log.d(TAG, selectDevice.getName());
try {
mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID);
} catch (IOException e1) {
// TODO Auto-generated catch block
//Log.d(TAG, "socket not created");
e1.printStackTrace();
}
try {
mSocket.connect();
} catch (IOException e) {
try {
mSocket.close();
//Log.d(TAG, "Cannot connect");
} catch (IOException e1) {
//Log.d(TAG, "Socket not closed");
e1.printStackTrace();
}
}
}