2012-06-20 3 views
4

Я создаю небезопасное соединение RFCOMM от моего HTC One X к СЕН Bluetooth ESD110 Последовательного модуля с этим кодом:андроид Bluetooth RFCOMM подключение слишком медленно

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(addr); 
BluetoothSocket socket = null; 

try{ 
socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString(SERVICE_UUID)); 

mBluetoothAdapter.cancelDiscovery(); 

socket.connect(); 
sendMessage(socket,"working!"); 
socket.close(); 

Дела в том, чтобы подключить к модулю с автоматической кожурой , и все это работает, но для установления соединения требуется около 15 секунд.

отладки остается на:

socket.connect(); 

в течение 15 секунд, и только после этого соединения и перенося строку к модулю (занимает 1 сек для этого).

Возможно ли, что телефон обрабатывает некоторые другие данные (обнаружение служб и многое другое) перед подключением к MAC-адресу и как я могу подключить его к FASTER? Или это может быть проблема с аппаратным обеспечением HTC?

ответ

1

EDIT если медленный Discovery Service ваша проблема, вы можете попытаться избежать, что, пропуская обнаружения сервисов всех с помощью Reflection методы createRfcommSocket непосредственно - я делаю это по другим причинам в моих BT-SPP связанных проектах - это выглядит следующим образом:

BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter(); 
BluetoothDevice bd = bta.getRemoteDevice(mac); 
Method m = bd.getClass().getMethod("createRfcommSocket",new Class[] { int.class }); 
bt_connection = (BluetoothSocket) m.invoke(bd, Integer.valueOf(1)); 

Предварительный комментарий: вам нужно сканировать все время? Если у вас есть возможность запомнить mac, вы можете подключиться быстрее. Длительное время ожидания imho происходит от открытия - вы можете подключаться только в том случае, если это действительно закончено (а не непосредственно после mBluetoothAdapter.cancelDiscovery();) - и это может занять некоторое время.

+0

hi ligi, я сделал соединение дважды с тем же «устройством» с mac-адресом моего телефона - без сканирования, для первого подключения потребовалось 15 секунд, а 15 секунд - для второго. Я думаю, что телефон «сканирует» модуль bluetooth для доступных услуг, и он занимает слишком много времени, но я все уже дал телефону услугу uuid, в которой я нуждаюсь ... – itai

+0

привет, спасибо за помощь, я отредактировал код, но у меня есть некоторая ошибка, используя reflaction: 'BluetoothDevice device = mBluetoothAdapter.getRemoteDevice (" 00: 01: 95: 13: 5C: 4F "); Метод m = device.getClass(). GetMethod ("createInsecureRfcommSocket", новый класс [] {int.class}); BluetoothSocket сокет = (BluetoothSocket) m.invoke (устройство, Integer.valueOf (1)); 'но я получаю: \t IllegalAccessException \t - исключение Необработанного типа \t InvocationTargetException – itai

+0

createInsecureRfcommSocket/createRfcommSocket/createInsecureRfcommSocketToServiceRecord/createeRfcommSocketToServiceRecord - все reflaction к этому функция возвращает, что ошибки ..... – itai

0

Быстрее ли это во второй раз ? Поиск телефона в первый раз (до того, как ваше устройство имеет время назначения целевого устройства) занимает некоторое время.

Однако, даже если он должен найти цель, он не должен занимать 15 секунд.

Возможно, вы столкнулись с этой ошибкой: http://code.google.com/p/android/issues/detail?id=29039

Заметьте, что есть одна ситуация, в которой создать подключение работает, но занимает гораздо больше времени, то нормально.