2016-06-27 6 views
0

Я создаю приложение для обмена мобильными устройствами Android с Bluetooth-маяками. Я успешно достиг этого между одним маяком (который действует как клиент) и одним мобильным устройством Android (действует как сервер, слушая соединение). Пожалуйста, найдите фрагмент кода ниже,Android-соединение Bluetooth с помощью createInsecureRfcommSocketToServiceRecord без MAC-адреса

Client приложение

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MACaddress); 
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
mBluetoothAdapter.cancelDiscovery(); 
socket.connect(); 

приложение Сервер

mmServerSocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("NAME", UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
socket = mmServerSocket.accept(); 

Это прекрасно работает с одного мобильного устройства (сервер), где я могу получить его MACaddress путем сканирования поблизости устройств Bluetooth. Но рассмотрим случай, когда около 20-25 мобильных устройств присутствуют в диапазоне - сканирование будет потреблять столько времени. Я хотел бы сделать это, не выполняя проверку.

Есть ли способ достичь этого, не используя MACaddress сервера? Можно ли установить соединение только с уникальным UUID? Обратите внимание, что я не хочу подключать устройства.

Любые другие решения в этом отношении также приветствуются. Благодаря!

ответ

0

Вы не можете создать подключение сокета к устройству Bluetooth без идентификации самого устройства bluetooth, а уникальный идентификатор устройства Bluetooth - это MAC-адрес. Даже если бы был API Android, который позволил бы вам делать это только через UUID, основной реализации все равно пришлось бы искать соседние устройства (например, сканирование) и найти тот, который принимает соединения сокетов с использованием UUID. Поэтому сканирование, упомянутое в вопросе, все равно должно произойти.

Да, сканирование может использовать немного энергии и интенсивность процессора, если рядом устройств Bluetooth. Вы можете ограничить это двумя способами:

  1. Только сканирование ненадолго. Для вашего случая использования кажется, что вы можете просто отсканировать несколько секунд, а затем остановить, как только найдете вспомогательное устройство. Это не должно быть слишком ресурсоемким.

  2. Используйте фильтры сканирования на Android 5.0 и выше, чтобы соответствовать только те устройства, которые вы заинтересованы в.

+0

Спасибо Дэвид! Я собираюсь попробовать фильтры сканирования в BLE. Однако, как временная работа, есть способ издеваться/подмахивать MAC-адресом сервера через код? Таким образом, я мог бы избежать сканирования, так как знаю MAC заранее. Я нашел несколько методов спуфинга MAC через укоренение устройств и различные сторонние приложения, но ни один из них не был через Java-код! – deadpool

+0

Мой опыт такой же. Вам нужен доступ с низким уровнем доступа с помощью root, чтобы подменить MAC. – davidgyoung

+0

Я создал фильтр сканирования с использованием UUID, и для получения результата с одним сервером требуется 3-4 секунды. Это вызвало еще одно сомнение: фильтр делает медленное сканирование? поскольку фрагмент сканера должен проверять соответствие UUID. Я надеялся, что могу сканировать 1 устройство в секунду, возможно ли это? ваши мысли, пожалуйста .. @davidgyoung – deadpool

Смежные вопросы