Android: как работают Bluetooth UUID?
Я не понимаю, что означает блютуз UUID. Обозначают ли UUID протоколы (например, RFCOMM)? Если так, то почему createRfcommSocketToServiceRecord()
методы требуют UUID, когда они указывают rfcomm прямо в своих именах? Почему образец кода BluetoothChat имеет, по-видимому, произвольный UUID в жестком коде?
Мой вопрос возникает потому, что, согласно этому вопросу, я получаю исключение нулевого указателя, когда устройства под управлением 4.0.4 пытаются подключиться (к внешнему устройству, не являющемуся Android), используя отражение. Однако решение этого вопроса не работает для меня. UUID muuid = device.getUuids()[0].getUuid();
выдвигает исключение
Изменить: я решил эту проблему путем жесткого кодирования UUID для службы последовательного порта в соответствии с этим ответом (используя UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
).
Я также озадачен, почему мне нужно предоставить UUID для создания незащищенного сокета rfcomm, используя createInsecureRfcommSocketToServiceRecord(),
но не используя метод отражения.
Кто-нибудь может выправить меня?
5 ответов
Обычно он представляет собой какой-то общий сервис (протокол), который поддерживает устройство Bluetooth.
При создании собственного сервера rfcomm (с listenUsingRfcommWithServiceRecord
), вы должны указать свой собственный UUID, чтобы клиенты, подключающиеся к нему, могли его идентифицировать; это одна из причин, почему createRfcommSocketToServiceRecord
требуется параметр UUID.
В противном случае некоторые общие службы имеют одинаковый UUID, просто найдите тот, который вам нужен, и используйте его.
Смотрите здесь
UUID используется для однозначной идентификации информации. Он идентифицирует конкретную услугу, предоставляемую устройством Bluetooth. Стандарт определяет основные BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB
,
Такие устройства, как медицинские датчики, могут предоставлять услугу, заменяя первые восемь цифр предварительно определенным кодом. Например, устройство, которое предлагает соединение RFCOMM, использует короткий код: 0x0003
Таким образом, телефон Android может подключиться к устройству, а затем использовать протокол обнаружения служб (SDP), чтобы выяснить, какие службы он предоставляет (UUID).
Во многих случаях вам не нужно использовать эти фиксированные UUID. Например, если вы создаете приложение для чата, один телефон Android взаимодействует с другим телефоном Android, который использует то же приложение и, следовательно, тот же UUID.
Таким образом, вы можете установить произвольный UUID для вашего приложения, используя, например, один из множества случайных генераторов UUID в сети ( например).
В Bluetooth все объекты идентифицируются UUID. Сюда входят услуги, характеристики и многое другое. Bluetooth поддерживает базу данных с присвоенными номерами для стандартных объектов и назначает поддиапазоны для поставщиков (которые заплатили достаточно для бронирования). Вы можете просмотреть этот список здесь:
https://www.bluetooth.com/specifications/assigned-numbers/
Если вы реализуете стандартную службу (например, последовательный порт, клавиатуру, гарнитуру и т. Д.), Вам следует использовать стандартный UUID этой службы - это позволит вам взаимодействовать с устройствами, которые вы не разрабатывали.
Если вы реализуете настраиваемую службу, вам следует сгенерировать уникальные UUID, чтобы убедиться, что несовместимые сторонние устройства не пытаются использовать вашу службу, думая, что это что-то другое. Самый простой способ - сгенерировать случайные, а затем жестко закодировать результат в вашем приложении (и, конечно же, использовать те же UUID в устройствах, которые будут подключаться к вашей службе).
UUID похож на номера портов в Интернете. Однако разница между Bluetooth и Интернетом заключается в том, что в Bluetooth номера портов динамически назначаются сервером SDP (протокол обнаружения служб) во время выполнения, где каждому UUID присваивается номер порта. Другие устройства будут запрашивать сервер SDP, который зарегистрирован под зарезервированным номером порта, о доступных службах на устройстве, и он будет отвечать различными службами, отличными друг от друга, будучи зарегистрированными под разными UUID.
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 = server.accept();
Подводить итоги: UUid
используется для уникальной идентификации приложений. Каждое приложение имеет уникальный UUid
Итак, используйте то же самое UUid
для каждого устройства
UUID означает универсальный уникальный идентификатор. UUID - это простая 128-битная цифра, уникально распределенная по всему миру.
Bluetooth отправляет данные по воздуху, и все находящиеся поблизости устройства могут их получать. Предположим, иногда вам нужно отправить какие-то важные файлы через Bluetooth, и все находящиеся рядом устройства могут получить к ним доступ в радиусе действия. Поэтому, когда вы соединяетесь с другими устройствами, они просто передают номер UUID и сопоставляются, прежде чем делиться файлами. Когда вы отправляете какой-либо файл, ваше устройство шифрует этот файл с помощью соответствующего UUID устройства и передает его по сети. Теперь все устройства Bluetooth в диапазоне могут получить доступ к зашифрованному файлу, но для них требуется правильный номер UUID. Таким образом, только правильные устройства с UUID имеют доступ для шифрования файла, а другие отклонят причину неправильного UUID.
Короче говоря, вы можете использовать UUID в качестве секретного пароля для обмена файлами между любыми двумя устройствами Bluetooth.