2017-01-19 2 views
0

Я сканирование с помощью следующего кода:Почему не может быть обнаружена определенная периферийная служба BLE?

self.centralManager?.scanForPeripherals(withServices: serviceUUID, options: nil) 

Это прекрасно работает (мой tableview получает заполняется BLE устройств), если я или заменить serviceUUID с nil или определить его как

let serviceUUID = [CBUUID(string:"1803")] 

Но это не будет работать с

let serviceUUID = [CBUUID(string:"00001803-494c-4f47-4943-544543480000")] 

Doublechecked with Lightblue, но сервис UUID не работает, t, похоже, опечатки. Lightblue screenshot

+1

Вы можете сканировать в поисках servicesUUID, он был передан устройством, то есть он должен быть найден в рекламеДетали периферии. Если нет, он не будет найден. Но устройства часто не транслируют все UUID, они часто передают одну или две особенности (например, знать, что они из этой компании, или вид устройства, например, например, что у них есть вид обслуживания кровяного давления, и т. д.) – Larme

+0

Попробуйте «let serviceUUID = [CBUUID (строка:« 00001803-494C-4F47-4943-544543480000 »)]', в верхнем регистре для букв? Я не помню, было ли это чувствительным к регистру или нет. Или просто используйте 'nil' в параметрах, регистрирует объявлениеData в' didDiscoverPeripheral: 'и скопируйте-вставьте здесь найденное значение. – Larme

+0

благодарит Larme, пробовал заглавный и тот же результат, а не с учетом регистра. Я попробую посоветоваться и работать оттуда. –

ответ

0

Я думаю, что Larme уже дал соответствующее решение, но я сформулирую его как ответ вместо комментария, потому что комментарий, вероятно, был упущен.

Вы просматриваете периферийные устройства, которые предоставляют конкретную услугу в своих рекламных данных. Это означает, что вся строка 00001803-494c-4f47-4943-544543480000 должна быть частью рекламных данных. Если устройство не найдено, но если оно работает для 1803, кажется, что только 1803 транслируется устройствами в качестве служебной информации.

Проверьте данные об их использовании. Если они выставляют только 16-битный UUID, вы нашли причину проблемы.

Помните, что рекламные данные ограничены длиной 31 байт, и это дополнительно уменьшается по объявлениям типа длины и типа данных для каждого элемента. Таким образом, достаточно распространять только 16-битные UUID и не тратить значительную часть полезной нагрузки на 128-битный UUID.

+0

Спасибо Nebr - я добавил ссылку на скриншот, взятую из Lightblue, в исходном вопросе из рекламируемого сервиса; вся строка транслируется. –

+0

Если я правильно понял скриншот, элемент «Service UUID» просто содержит строку «1803». И это элемент, который проверяется с помощью параметра serviceUUID. Вот почему работает 1803, но полный 128-битный UUID не работает. – Nebr

+0

Я так сосредоточился на том, чтобы увидеть все эти 128-битные UUID, что я действительно не считал сервис UUID 1803 «UUID», который нужно искать, я смотрел на (полный 128-битный) UUID только в разделе рекламных данных - Большое спасибо Nebr! –

0

Я считаю, что 128-битная версия UUID 0x1803 будет 00001803-0000-1000-8000-00805F9B34FB. Светло-голубой показывает вам это значение в разделе «Данные рекламы (Service UUID)» или он показывает вам 00001803-494c-4f47-4943-544543480000? Потому что независимо от фактического сервисного UUID, на которое устройство отвечает через GATT, scanForPeripherals только вернет устройства с указанным сервисом UUID в рекламных данных.

+0

Да, Lightblue показывает точный сервис UUID; Я добавил ссылку на скриншот в исходном сообщении. PS: Я дал вам предложение по 128-битной версии попробовать, но ничего не поднял. –

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