Android: Как работают UUID для Bluetooth?
Я не понимаю, что означает UUID Bluetooth. Обозначают ли UUID протоколы (например, RFCOMM)? Если да, почему методы createRfcommSocketToServiceRecord()
требуют UUID, когда они указывают rfcomm прямо в их именах? Почему код кода BluetoothChat имеет кажущийся произвольный, жестко запрограммированный UUID?
Мой вопрос возникает, потому что, по этому вопросу, я получаю исключение нулевого указателя, когда устройства, работающие под управлением 4.0.4, пытаются подключиться (к внешнему, -android device) с использованием отражения. Однако решение этого вопроса для меня не работает. UUID muuid = device.getUuids()[0].getUuid();
вызывает исключение.
Изменить. Я решил эту проблему путем жесткого кодирования UUID для службы Serial Port в соответствии с этим ответом (используя UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
).
Я также озадачен тем, почему мне нужно предоставить UUID для создания незащищенного сокета rfcomm, используя createInsecureRfcommSocketToServiceRecord(),
, но не используя метод отражения.
Кто-нибудь может меня выправить?
Ответы
Ответ 1
Обычно это представляет собой какой-то общий сервис (протокол), который поддерживает устройство Bluetooth.
При создании вашего собственного сервера rfcomm (с помощью listenUsingRfcommWithServiceRecord
) вы должны указать свой собственный UUID, чтобы клиенты, подключающиеся к нему, могли его идентифицировать; это одна из причин, почему createRfcommSocketToServiceRecord
требует параметр UUID.
В противном случае некоторые общие службы имеют одинаковый UUID, просто найдите тот, который вам нужен, и используйте его.
Смотри здесь
Ответ 2
UUID используется для уникальной идентификации информации. Он идентифицирует конкретную услугу, предоставляемую устройством Bluetooth. Стандарт определяет базовый BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB
.
Устройства, такие как датчики здравоохранения, могут предоставлять услугу, заменяя первые восемь цифр на предопределенный код. Например, устройство, которое предлагает соединение RFCOMM, использует короткий код: 0x0003
Таким образом, телефон Android может подключиться к устройству, а затем использовать протокол обнаружения служб (SDP), чтобы узнать, какие службы он предоставляет (UUID).
Во многих случаях вам не нужно использовать эти фиксированные UUID. В случае, если вы создаете приложение чата, например, один телефон Android взаимодействует с другим телефоном Android, который использует одно и то же приложение и, следовательно, тот же UUID.
Таким образом, вы можете установить произвольный UUID для своего приложения, используя, например, один из многих генераторов случайных UUID в Интернете (например).
Ответ 3
UUID похож по отношению к номерам портов в Интернете. Однако разница между Bluetooth и Интернетом заключается в том, что в Bluetooth номера портов динамически назначаются сервером SDP (протокол обнаружения службы) во время выполнения, когда каждому UUID присваивается номер порта. Другие устройства будут запрашивать у SDP-сервера, который зарегистрирован под номером зарезервированного порта, о доступных услугах на устройстве, и он будет отвечать разными службами, отличающимися друг от друга, будучи зарегистрированными в разных UUID.
Ответ 4
UUID - это просто номер. Он не имеет никакого значения, кроме того, что вы создаете на стороне сервера приложения для Android. Затем клиент подключается с использованием того же UUID.
Например, на стороне сервера вы можете сначала запустить uuid = UUID.randomUUID()
для генерации случайного числа, такого как fb36491d-7c21-40ef-9f67-a63237b5bbea. Затем сохраните этот, а затем жесткий код, который будет в вашей программе прослушивания следующим образом:
UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea");
Ваша программа на сервере Android будет прослушивать входящие запросы с этим UUID следующим образом:
BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);
BluetoothSocket socket = server.accept();
Ответ 5
Подводя итог: UUid
используется для однозначной идентификации приложений. Каждое приложение имеет уникальный UUid
Итак, используйте те же UUid
для каждого устройства
Ответ 6
В Bluetooth все объекты идентифицируются по UUID. К ним относятся услуги, характеристики и многое другое. Bluetooth поддерживает базу данных назначенных номеров для стандартных объектов и назначает поддиапазоны для поставщиков (которые заплатили достаточно за резервирование). Вы можете просмотреть этот список здесь:
https://www.bluetooth.com/specifications/assigned-numbers/
Если вы внедряете стандартную услугу (например, последовательный порт, клавиатуру, гарнитуру и т.д.), Вам следует использовать этот стандарт сервиса UUID - это позволит вам взаимодействовать с устройствами, которые вы не разрабатывали.
Если вы внедряете пользовательскую службу, вам следует сгенерировать уникальные UUID, чтобы убедиться, что несовместимые сторонние устройства не пытаются использовать вашу службу, думая, что это что-то другое. Самый простой способ - сгенерировать случайные и затем жестко закодировать результат в вашем приложении (и, конечно, использовать те же UUID на устройствах, которые будут подключаться к вашему сервису).