Пользовательские Bluetooth низкоэнергетические рекламные данные и данные ответа сканирования

Я пытаюсь создать собственную рекламу BLE и отсканировать ответ. Реклама является iBeacon. Я также хочу, чтобы это передавало доступность сервиса. Я не могу добавить UUID службы в данные рекламы, потому что он будет слишком длинным (насколько я понимаю, BGScript от Bluegiga допускает только 32 октета в данных рекламы). Я добавил сервисный uuid в ответ на сканирование, надеясь, что это позволит мобильному устройству видеть сервис для поиска и подключения к устройству. По какой-то причине я не могу заставить его работать. iOS больше не воспринимает устройство BLE как iBeacon и не признает, что сервис доступен. Какой тип AD я бы использовал для uuid службы и как мне отформатировать эти данные (включая uuid службы)?

Вот что у меня так далеко:

Рекламные данные

02 01 06 // flags
1a ff 4c 00 02 15 // manufacturer data, apple company id, iBeacon preamble
aa aa aa aa - aa aa - aa aa - aa aa - aa aa aa aa aa aa // iBeacon UUID
00 01 00 01 // iBeacon major, minor
c6 // measured tx power

Сканирование данных ответа

11 // length
16 // ad type (I am not sure what this should be)
a5 b7 67 a0 - 74 9b - 11 e3 - 98 1f - 08 00 20 0c 9a 66 // service UUID

Для лучшего контекста, вот раздел из BGScript для BLE112:

event system_boot( major, minor, patch, build, ll_version, protocol_version, hw )

    call gap_set_adv_parameters( 20, 100, 7 )

    call gap_set_mode( gap_general_discoverable, gap_undirected_connectable )

    # Flags
    data( 0:1) = $02
    data( 1:1) = $01
    data( 2:1) = $06

    # Manufacturer data
    data( 3:1) = $1a
    data( 4:1) = $ff

    # Preamble
    data( 5:1) = $4c
    data( 6:1) = $00
    data( 7:1) = $02
    data( 8:1) = $15

    # UUID
    data( 9:1) = $aa
    data(10:1) = $aa
    data(11:1) = $aa
    data(12:1) = $aa
    data(13:1) = $aa
    data(14:1) = $aa
    data(15:1) = $aa
    data(16:1) = $aa
    data(17:1) = $aa
    data(18:1) = $aa
    data(19:1) = $aa
    data(20:1) = $aa
    data(21:1) = $aa
    data(22:1) = $aa
    data(23:1) = $aa
    data(24:1) = $aa

    # Major
    data(25:1) = $00
    data(26:1) = $01

    # Minor
    data(27:1) = $00
    data(28:1) = $01

    # Measured power (specified in 2's complement, so 0xC6 is -58)
    data(29:1) = $c6

    # Scan Response Data
    sr_data( 0:1) = $11
    sr_data( 1:1) = $21

    # Service Uuid
    sr_data( 2:1) = $a5
    sr_data( 3:1) = $b7
    sr_data( 4:1) = $67
    sr_data( 5:1) = $a0
    sr_data( 6:1) = $74
    sr_data( 7:1) = $9b
    sr_data( 8:1) = $11
    sr_data( 9:1) = $e3
    sr_data(10:1) = $98
    sr_data(11:1) = $1f
    sr_data(12:1) = $08
    sr_data(13:1) = $00
    sr_data(14:1) = $20
    sr_data(15:1) = $0c
    sr_data(16:1) = $9a
    sr_data(17:1) = $66

    # Set advertisement data
    call gap_set_adv_data(0, 30, data(0:30))
    call gap_set_adv_data(1, 18, sr_data(0:18))

    #set bondable mode
    call sm_set_bondable_mode(1)

end

2 ответа

Решение

Мне удалось заставить сервис uuid транслироваться в ответном пакете сканирования. Он отлично работает как с CLLocationManager (iBeacon), так и с CBCentralManager (BLE) одновременно. Я думаю, что было несколько других изменений в другом месте, которые заставили это работать, но я не уверен, где они были. Я использовал тип AD "Неполный список 128-битных UUID класса обслуживания" (0x06) и понял, что у меня обратный порядок байтов в обратном порядке.

Вот данные ответа на сканирование, которые я использовал:

    # Scan Response Data
    sr_data( 0:1) = $11
    sr_data( 1:1) = $06

    # Service Uuid
    sr_data( 2:1) = $66
    sr_data( 3:1) = $9a
    sr_data( 4:1) = $0c
    sr_data( 5:1) = $20
    sr_data( 6:1) = $00
    sr_data( 7:1) = $08
    sr_data( 8:1) = $1f
    sr_data( 9:1) = $98
    sr_data(10:1) = $e3
    sr_data(11:1) = $11
    sr_data(12:1) = $9b
    sr_data(13:1) = $74
    sr_data(14:1) = $a0
    sr_data(15:1) = $67
    sr_data(16:1) = $b7
    sr_data(17:1) = $a5

Зачем вообще нужен сервис UUID? Вы должны иметь возможность просто подключиться к iBeacon после сканирования его с помощью CoreBluetooth.

Смотрите здесь для примера. Этот пример призван доказать невозможность чтения идентификаторов iBeacon с помощью CoreBluetooth. Но это также показывает, что API CoreBluetooth позволяют подключаться к iBeacon после его сканирования, даже если вы не можете прочитать его идентификаторы.

Также возможно использовать CoreBluetooth для запроса маяка о сервисах после того, как это соединение установлено.

Другие вопросы по тегам