Nano Hash - криптовалюты, майнинг, программирование

Классический Bluetooth на Android. Как реализовать фильтр для сканирования?

В своем приложении я реализовал классический Bluetooth согласно официальной документации: https://developer.android.com/guide/topics/connectivity/bluetooth. По умолчанию startDiscovery() будет сканировать все ближайшие Bluetooth-устройства. Но во многих ситуациях пользователь/разработчик уже знает нужную категорию устройств. В моем случае нужно найти конкретное устройство, реализующее метод:

bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(SERVICE_NAME, MY_UUID_INSECURE);

В идеале нужно реализовать поиск и подключить два устройства в один клик. Как выбрать нужное устройство из списка найденных устройств? Это сделано для удобства использования приложения, чтобы вам не приходилось выбирать из множества ненужных устройств. Это будет своеобразный фильтр как в BLE. Но мы говорим о Bluetooth Classic. Как я могу использовать SERVICE_NAME, MY_UUID_INSECURE, BluetoothClass для выполнения этой задачи?

ИЗМЕНИТЬ:

Я нашел несколько решений этой проблемы. Но все они не идеальны. Я пока просто исключаю из списка устройств те, у которых есть device.getType() == 2 (DEVICE_TYPE_LE).

Вариант 1

Найдите устройство, которое транслирует сервис с таким же UUID, как у меня. Для этого используйте метод fetchUuidsWithSdp() для найденных устройств. Пример реализации: https://stackoverflow.com/a/37070600

Недостаток этого метода. Время. Вы должны подождать, пока не получите BluetoothAdapter.ACTION_DISCOVERY_FINISHED, прежде чем звонить fetchUuidsWithSdp(). Это займет 12-18 секунд. В дополнение к этому необходимо дождаться завершения каждого последующего вызова fetchuuidsWithSdp(), а затем выполнить вызов этого метода для другого устройства. Это займет около 3 секунд на устройство. В общей сложности поиск нужного устройства может занять очень много времени.

Вариант 2

Измените имя устройства на закрытый ключ или специальное имя, которое клиент может использовать для идентификации устройства.

bluetoothAdapter.setName(name);

Главное не забыть вернуть название устройства к исходному.

saveName = bluetoothAdapter.getName();

Пример реализации: https://stackoverflow.com/a/40138077/4716092

Недостаток этого метода. Изменить имя устройства на самом деле не так просто. Если не вернуть старое имя устройства, пользователь может расстроиться.


  • Как насчет поиска определенного адреса устройства? 22.07.2019
  • Второе устройство (клиент) не знает конкретного адреса из списка доступных устройств. Кроме того, невозможно узнать свой адрес локального Bluetooth-адаптера. Метод bluetoothAdapter.getAddress() сегодня не работает должным образом. Для решения проблемы достаточно было бы добавить некоторое описание устройства, чтобы можно было выбрать его из списка доступных. 23.07.2019
  • Ну, я не понимаю, о чем именно вы говорите, но вы можете отсортировать List по DeviceName, DeviceAddress или BOND_STATE. Я думаю, что для всего остального потребуется уже существующее соединение. Но я думаю, что Device BluetoothAddress уникален, и вы можете использовать его в первую очередь. 23.07.2019
  • Вот пример ситуации. Два пользователя хотят использовать мое приложение и подключаться друг к другу через Bluetooth. Задача состоит в том, чтобы помочь им сделать это очень просто и не использовать настройки Bluetooth в телефоне для сопряжения. Просканировав доступные устройства, на каждом из них увидели около 20 разных устройств с разными именами и адресами. Это очень большой список для выбора нужного устройства. Кроме того, часто бывает так, что имя блютуса одинаково для нескольких устройств. 23.07.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..