Использовать стек BlueZ как периферийное устройство (рекламодатель)

  • Цель: используйте BlueZ и Bluetooth 4LE-ключ для создания периферийного устройства, которое рекламирует эквивалент Bluetooth "Hello World".

  • Где я нахожусь: у меня в настоящее время установлена ​​установка и загрузка BlueZ стека, я могу использовать инструмент hci для распознавания и просмотра Bluetooth-ключа. Я возился с hciconfig leadv, но я просто не совсем понял/понял, что происходит.

  • Какая помощь, по-моему, мне нужна. Мне нужно перейти к следующему шагу. Если кто-нибудь может указать мне на хороший ресурс, пройти меня через это или что-нибудь еще, это было бы очень признательно. Если мне нужно выполнить дополнительную работу (поиск), я могу, но я искал Google и SO с таким количеством различных производных этого вопроса, как я могу себе представить.

* Я отметил это как CoreBluetooth, а также в надежде, что, возможно, в какой-то момент разработчик iOS поработает с этим.

EDIT: В ответ на комментарий, кажется разумным указать, какова моя конечная цель. В конечном итоге я хотел бы рекламировать через ключ простейшие простые сообщения/сигналы и выбирать это на устройстве iOS (CoreBluetooth). Я был в состоянии заставить iOS стороны работать хорошо (тонны документации по сравнению с Linux стороны вещей), но эта трудная часть для меня получает эту настройку адаптера в качестве периферии. Стек BlueZ для меня ужасная загадка.

РЕДАКТИРОВАТЬ: После большего копания я в конце концов наткнулся на этот пост: Соединение с малиной Pi Bluetooth 4.0. Это привело меня к теме сервера GATT, я продолжу эту тему.

EDIT: Хорошо, поэтому мои поиски обучения продолжаются. За последние пару дней я погрузился глубже в инструменты hci *, sdptool и gatttool. Я дошел до того, что смог адаптировать адаптер для рекламы "hciconfig hci0 leadv". На этом этапе я могу успешно "видеть" адаптер, но я ничего не могу читать. Я даже не вижу дружеского имени. Я буду продолжать грузоперевозки, но, как всегда, любая помощь/предложения более чем приветствуются.

EDIT: релевантная ссылка, полный обзор Bluetooth LE, относящийся к iOS. https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html#//apple_ref/doc/uid/TP40013257-CH1-SW1

ПОСЛЕДНИЙ РЕДАКТИРОВАТЬ: Привет всем, эта ссылка описывает, как создать iBeacon с помощью малины Pi + BlueZ... http://www.wadewegner.com/2014/05/create-an-ibeacon-transmitter-with-the-raspberry-pi/

Ответ 1

Если ваш Bluetooth-ключ подключен, запуск следующей команды укажет вам имя устройства и укажите его состояние:

$ hciconfig

Результат должен выглядеть примерно так:

hci0:    Type: BR/EDR  Bus: USB
     BD Address: 00:01:02:aa:bb:cc  ACL MTU: 1021:8  SCO MTU: 64:1
     DOWN
     RX bytes:1000 acl:0 sco:0 events:47 errors:0
     TX bytes:1072 acl:0 sco:0 commands:47 errors:0

Это означает, что устройство называется hci0 находится в состоянии down. Выполните следующую команду, чтобы вызвать его:

$ sudo hciconfig hci0 up

Теперь это должно выглядеть так:

$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
     BD Address: 00:01:02:aa:bb:cc  ACL MTU: 1021:8  SCO MTU: 64:1
     UP RUNNING
     RX bytes:1000 acl:0 sco:0 events:47 errors:0
     TX bytes:1072 acl:0 sco:0 commands:47 errors:0

Затем выполните следующую команду для настройки отправляемых рекламных данных.

$ sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

Вы можете изменить шестнадцатеричные байты (начиная с 1e), чтобы отправлять разные байтовые последовательности для вашей рекламы. Тот, который буквально отправляет коды ASCII для "HELLO WORLD", будет использовать: 48 45 4c 4c 4f 57 4f 52 4c 44 (EDIT:. Но вам также нужно будет префикс этого сообщения с допустимым заголовком, см. здесь.)

Теперь, чтобы активировать рекламу на ключе, используйте следующую команду: это начнет отправлять пакеты "Helo World".

$ sudo hciconfig hci0 leadv 0

РЕДАКТИРОВАТЬ: указанная выше команда позволяет рекламируемому сервису подключаться. Если вы не хотите разрешать подключения, измените его на $ sudo hciconfig hci0 leadv 3

Вы также можете отключить рекламу, используя следующую команду:

$ sudo hciconfig hci0 noleadv

Ответ 2

добавив здесь дополнительную информацию (ref BlueZ5.x):

  • bluez не раскрывает DBUS api для регистрации сервера gatt; у вас есть какая-то реализация профиля, но вам нужно сконфигурировать и скомпилировать ее с помощью опции -enable-experimental или включить gatt-пример в папке плагина tha tregister на каком-то gatt-сервере в качестве примера

  • когда вы рекламируете hciconfig hci0 leadv, обратите внимание на рекламируемые данные. в примере ниже для iBeacon

    sudo hcitool -i hci0 cmd 0x08 0x0008 1e **02 01 1a** ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

    полужирная часть предназначена для структуры AD, которая выведена в поле флажков (проверьте спецификацию bluetooth для формата данных рекламодателя). С помощью этих настроек флагов устройство рекламирует себя как одновременное LE и BR-EDR.

    В своем опыте рекламы таким образом устройство Android, которое сканирует устройство bluez, действующее как периферийное устройство BLE, вызовет соединение по классическому bluetooth (из-за настроек флага), а не по BLE (обратите внимание, что процедуры подключения различны для LE и Classic). Не уверен, как в этом случае действует центральное устройство Apple. Во всяком случае, чтобы избежать этого, вы можете установить 06 вместо 1A, чтобы поддержка BR-EDR не была рекламирована. Таким образом вы увидите соединение через BLE.

Если вы хотите протестировать его с помощью центрального устройства Android, для этого есть бесплатное приложение для Северной Европы.