Corebluetooth, как получить уникальный UUID?
Мой вопрос UUID CBPeripheral, кажется, не является уникальным.
У меня два iPad2 и устройство bluetooth4.0.
UUID устройства Bluetooth отличается от двух iPad.
Как показано на следующих изображениях.
Есть ли способ найти уникальный UUID устройства Bluetooth на устройстве iOS?
Мне нужно найти UUID или MAC-адрес, который не будет меняться между различными устройствами.
Большое спасибо, пожалуйста, помогите мне!
4 ответа
Периферийное устройство использует произвольно разрешаемый адрес, который меняется не реже чем каждые 15 минут, после чего периферийное устройство будет выглядеть как новое. Чтобы изменить это поведение, необходимо выполнить сопряжение с периферийным устройством, тогда вы увидите UUID, и он будет постоянным.
Я искал способ развернуть независимые от платформы статические конфигурации устройств BLE. Я был обескуражен (UUID Apple не имеет смысла +/-, а MAC/BDADDR, который можно получить на большинстве / всех других платформах, недоступен из CoreBluetooth). К счастью, я заметил, что профиль "Служба информации об устройстве" (0x180A) содержит атрибут "System ID" (0x2A23), который кодирует уникальный MAC-адрес / BDADDR-адрес устройства. Однако я не знаю, обязательно ли для BLE-устройства предоставлять эту услугу.
В случае, если вы разрабатываете и управляете устройством Bluetooth 4.0+,
Вариант № 1 Назначить адрес Bluetooth имени устройства и поместить его в ответ сканирования
Присвойте своему устройству Bluetooth адрес в качестве имени устройства и передайте его через пакет Scan Response.
Пакет Scan Response представляет собой 31 байт данных, передаваемых устройством Bluetooth после того, как ведущее устройство (например, смартфон) отправит запрос на сканирование.
Важный
Некоторые устройства Bluetooth позволяют устанавливать свое имя без программирования, например, имя модуля Bluetooth HM-10 можно изменить с помощью текстовой команды AT+NAME.
Вариант № 2 Отправка уникальных специфических данных производителя в рекламных данных
Вы можете добавить некоторые уникальные "Данные, специфичные для производителя" в пакет рекламных данных Bluetooth и прочитать их с iOS. Это намного быстрее, чем чтение атрибута "System ID" из "Device Information Service", как было предложено в другом ответе, потому что это не требует подключения к устройству Bluetooth.
Длинное объяснение
Рекламные данные - это 31 байт данных, которые Bluetooth 4.0+ транслирует в эфир (до того, как кто-либо подключится к нему) через определенный промежуток времени (от 20 мс до 10 с) в зависимости от конфигурации этого устройства.
Также есть данные ответа на сканирование, это дополнительный пакет из 31 байта, который устройство Bluetooth транслирует после того, как ведущее устройство (например, смартфон) отправит запрос на сканирование. Он имеет ту же структуру, что и рекламный пакет данных.
Всего есть 31+31=62 байта данных, которые мы можем использовать.
Рекламные данные состоят из набора рекламных структур данных (AD struct)
Первый байт описывает длину структуры AD, включая 1 байт типа данных + полезную нагрузку переменного размера.
Второй байт описывает тип данных, хранящихся в AD Struct, здесь список идентификаторов.
Все последующие байты являются данными полезной нагрузки.
Для рекламных данных обязательно включить конфигурацию Flags AD Struct (не относится к ответу сканирования), она занимает 3 байта. У нас осталось 28 байтов.
Предполагая, что вы разрабатываете свой собственный сервис GATT, вам необходимо указать его идентификатор в рекламных данных. Пользовательский идентификатор UUID службы GATT может быть только в 128-битном формате полной длины (в отличие от 16-битных и 32-битных идентификаторов службы, предопределенных стандартом Bluetooth). В рекламных данных он будет занимать 2+16=18 байт. Итак, у нас осталось 10 байтов.
Теперь мы можем определить данные производителя 2 байта, используемые для длины и типа данных
первые 2 байта в полезной нагрузке идут для идентификатора компании (как требуется в документе "Дополнение к разделу 1.4 Базовой спецификации Bluetooth"), идентификаторы компании назначаются Специальной группой по интересам Bluetooth
В целях тестирования вы можете использовать идентификатор 0xFF, 0xFF
А используя оставшиеся 6 байтов, вы можете однозначно идентифицировать 281 474 976 710 656 устройств.
Образец рекламных данных, написанный на С:
#define GAP_ADV_FLAGS 0x01
#define GAP_ADV_128_UUID 0x06
#define GAP_ADV_MANUF_DATA 0xFF
uint8_t raw_adv_data[31] = {
// len type payload....
0x02, GAP_ADV_FLAGS, 0x06,
// GATT service 128 bit UUID
0x11, GAP_ADV_128_UUID, 0x1d, 0x15, 0xee, 0x49,
0x10, 0x78, 0xc8, 0xa3,
0x9f, 0xaa, 0x82, 0x84,
0x8e, 0x28, 0xbe, 0x43,
// 2 bytes of company ID
0x09, GAP_ADV_MANUF_DATA, 0xff, 0xff,
// 6 bytes of unique data
0xff, 0xff,
0xff, 0xff,
0xff, 0xff,
};
PS: Ну, если вам нужно отправить еще больше данных, вы можете положить в пакет ответа сканирования, который даст вам дополнительный 31 байт полезной нагрузки.
Чтобы ответить на ваш вопрос, UUID является уникальным для той же пары iDevice-btDevice, но он меняется, если вы меняете устройство iOS, как вы заметили в своей попытке.
Для достижения цели иметь уникальный идентификатор, к сожалению, вам нужно изменить прошивку и добавить идентификатор приложения.