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

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

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

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

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

РЕДАКТИРОВАТЬ: В ответ на комментарий, кажется разумным заявить, какова моя конечная цель. В конечном итоге я хотел бы рекламировать через ключ самые простые из простых сообщений / сигналов и поднять это на устройстве iOS (CoreBluetooth). Я смог добиться того, чтобы все работало на iOS (тонны документации по сравнению с Linux), но для меня очень сложно получить настройку адаптера в качестве периферийного устройства. Стек BlueZ для меня ужасная загадка.

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

РЕДАКТИРОВАТЬ: Хорошо, так что мои поиски обучения продолжаются. За последние пару дней я углубился в инструменты hci*, sdptool и gatttool. Я дошел до того, что смог настроить адаптер для рекламы "hciconfig hci0 leadv". На этом этапе я могу успешно "увидеть" адаптер, но на самом деле я не могу ничего с него прочитать. Я даже не вижу дружеского имени. Я буду продолжать, но, как всегда, любая помощь / предложения приветствуются.

РЕДАКТИРОВАТЬ: Соответствующая ссылка, полный обзор Bluetooth LE, относящихся к iOS. https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html

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

2 ответа

Решение

При подключенном 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 и находится в нерабочем состоянии. Выполните следующую команду, чтобы вызвать это:

$ 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 (РЕДАКТИРОВАТЬ: Но вы также должны префикс этого сообщения с действительным заголовком, см. Здесь.)

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

$ sudo hciconfig hci0 leadv 0

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

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

$ sudo hciconfig hci0 noleadv

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

  • bluez не предоставляет API DBUS для регистрации на сервере Гатт; у вас есть доступная реализация профиля, но вам нужно сконфигурировать и скомпилировать ее с опцией --enable-эксперимент или включить gatt-example в папке плагина, чтобы в качестве примера использовать другой сервер 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 для формата данных advertisgin). С этими настройками флагов устройство рекламирует себя как одновременно LE и BR-EDR.

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

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

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