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

  • Цель: используйте 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#//apple_ref/doc/uid/TP40013257-CH1-SW1

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


person Ceryni    schedule 22.04.2013    source источник
comment
Как вы управляете другой стороной (получаете рекламу)? Если у вас два ключа, вы должны сделать hciconfig leadv на ведомом устройстве и hcitool lescan на главном устройстве.   -  person TJD    schedule 22.04.2013
comment
В конечном итоге я хочу управлять централизованно через устройство iOS. Конечная игра будет состоять в том, что ключ будет рекламировать какое-то базовое сообщение, а устройство iOS подберет его и отобразит. Надеюсь, это внесет ясность.   -  person Ceryni    schedule 23.04.2013
comment
@Fitzeryni, добились ли вы в этом дальнейшего прогресса? Точно так же я пытаюсь использовать BlueZ 5 на Raspberry Pi, чтобы рекламировать сервис Bluetooth LE для устройств iOS.   -  person Matt    schedule 01.06.2013
comment
@Matt, К сожалению, я больше не продвинулся в этом и в настоящее время больше не занимаюсь этим. Что касается рекламы устройства iOS для использования, это был именно тот вариант использования, к которому я стремился. Мне удалось добиться того, чтобы мое устройство iOS увидело адаптер Pi, но мне не удалось подключиться или получить какие-либо данные из сигнала. Желаю удачи, BlueZ не для слабонервных. Я оставлю и эту ссылку здесь: ti.com/ww/en/wireless_connectivity/sensortag/ Мне очень удалось использовать это устройство.   -  person Ceryni    schedule 01.07.2013
comment
Последняя ссылка мертва;)   -  person vanthome    schedule 23.09.2014
comment
Спасибо @vanthome. Нашел новую ссылку, которую я вставил на ее место.   -  person Ceryni    schedule 15.09.2015


Ответы (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 (EDIT: Но вам также нужно будет добавить к этому сообщению префикс действительного заголовка, см. здесь.)

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

$ sudo hciconfig hci0 leadv 0

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

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

$ sudo hciconfig hci0 noleadv

person davidgyoung    schedule 26.09.2013
comment
Это действительно хороший пример того, как начать рекламу. Я принимаю это, поскольку он отвечает на исходный вопрос. Но для полноты картины не могли бы вы описать, как затем принять рекламное сообщение с помощью другой пары устройство / ключ? - person Ceryni; 03.10.2013
comment
Извините, я на самом деле никогда этого не делал, поэтому подробностей не знаю. Все мои чтения рекламных объявлений были связаны с API Bluetooth для iOS и Android. - person davidgyoung; 27.10.2013
comment
Потенциально глупый вопрос: что означает 1e 02 01 1a 1a ff? - person Mark Peterson; 13.11.2013
comment
Это преамбула к рекламе Apple iBeacon, которую я пытался создать, когда понял, как это сделать. - person davidgyoung; 13.11.2013
comment
Я немного смущен протоколом iBeacon и тем, что вы здесь сказали ... вы сказали это you can change the hex bytes (starting with 1e), но, сделав это, не нарушит ли это протокол iBeacon, поскольку вы удаляете преамбулу Apple iBeacon? Я просто не понимаю, где именно будет размещаться ваш собственный текст, например hello world, в этом наборе рекламных данных. - person Mark; 18.12.2013
comment
@Mark, да, вы совершенно правы, что это нарушит преамбулу iBeacon. Вопрос выше касался того, как отправить рекламу Bluetooth LE (НЕ рекламу iBeacon) Hello World. Поэтому я показал ему свой код, который создает рекламу iBeacon, и объяснил, как он может изменить его, чтобы вместо этого рекламировать Hello World. Есть смысл? - person davidgyoung; 18.12.2013
comment
@davidgyoung Я не знаю, глупый ли это вопрос, но можно ли будет рекламировать данные Hello World как рекламу iBeacon? Есть ли у какой-либо из реализаций какие-либо плюсы или минусы для поиска указанных данных в приложении для iOS? - person jonathanwiesel; 15.01.2014
comment
Что ж, я полагаю, вы могли бы встроить строку Hello World в идентификаторы iBeacon, но это будет не очень полезно для iOS. Чтобы увидеть iBeacon, приложение iOS должно сначала сообщить ОС ProximityUUID (16 байт) iBeacon, который должен быть видим. Таким образом, вы действительно не можете вставить неизвестную строку в это поле. Остается только четыре байта в главном и второстепенном полях. С 8-битной кодировкой символов этого достаточно для ада, но недостаточно для Hello World - person davidgyoung; 15.01.2014
comment
Спасибо за ответ @davidgyoung, так как в этом случае я могу получить рекламу BLE, как вы продемонстрировали (не iBeacon) с приложением iOS, без необходимости сопряжения или чего-то еще? - person jonathanwiesel; 17.01.2014
comment
Извините, но вы не можете. API-интерфейсы Apple CoreBluetooth запрещают доступ к исходному тексту объявления. - person davidgyoung; 17.01.2014
comment
Пытался сделать именно то, что вы предложили, но при чтении данных (с другого устройства) с помощью простого hcidump --raw я получаю 4 байта полезной нагрузки, например b2 0 0a 02, где первый байт изменяется примерно каждую секунду, вместо указанного в cmd. Bluez 5.26, идеи? - person marce; 31.01.2015
comment
@marce, наверное, стоит задать новый вопрос по этому поводу и показать точные команды, которые вы используете для запуска рекламы. - person davidgyoung; 31.01.2015
comment
@davidgyoung Я сделал и обнаружил / осознал разницу между и ваш подход. - person marce; 01.02.2015

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

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

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

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

person user3891941    schedule 30.07.2014
comment
как добавить услугу на устройстве рекламодателя, которое отображается на центральном устройстве с разрешением на запись? - person lucifer; 08.11.2016