Как отправить уведомление Bluetooth Low Energy GATT с помощью Bluez?

Я расширяю plugin / gatt_example.c в исходниках Bluez, чтобы безуспешно опробовать функцию уведомления BLE. Я использую прилагаемый образец Battery Service в исходном коде Bluez. Он имеет 1 характеристику со свойствами READ и NOTIFY. Я добавляю метод dbus для вызова attrib_db_update () для обновления значения характеристики извне демона bluetooth.

Теперь я могу подключить какой клиент (Nexus4 с Android 4.3 и iPhone (бесплатные приложения LightBlue)) и запустить уведомление (установка флагов уведомления CCC дескриптора). (примечание: дескриптор ccc char имеет разрешение аутентификации по умолчанию, поэтому изменение CCC (start notify) на iPhone заставит bluez возвращать ошибку: не авторизовать разрешение. Поскольку я планирую иметь дело с авторизацией позже, я временно изменяю разрешение по умолчанию на none , и iPhone может устанавливать флаги уведомлений CCC).

Проблема в том, что даже у клиента (как Android, так и iOS) есть стартовое уведомление, вызов attrib_db_update () не заставляет bluez отправлять какие-либо уведомления клиенту (монитор с hcidump, пакет не отправляется клиенту).

Вопрос: Требуется ли какой-либо шаг, кроме attrib_db_update (), чтобы bluez отправлял уведомление клиенту? Я ценю любую ссылку на источник образца. PS. Я использую bluez в качестве конфигурации периферийного сервера + gatt (так же, как обслуживание батареи в plugin / gatt_example.c), а не наоборот.

Спасибо.

=== Обновление (я не знаю, как работает форматирование комментариев ... поэтому я добавляю здесь обновление.)
О образце профиля / предупреждения:
Да, я уже проверял профиль / предупреждение, прежде чем задавать вопрос . Другая проблема заключается в том, что я не смог запустить этот образец (это единственная причина, по которой я задаю вопрос в первую очередь).
profile / alert / server.c: attio_connected_cb () - это функция обратного вызова, зарегистрированная filter_devices_notify () в server.c. Он использует btd_device_add_attio_callback () (из src / device.c). Дальнейшая проверка src / device.c, похоже, что он проверяет device-> attrib, если он существует для exec (сначала вставьте в очередь, затем обратный вызов exec) обратного вызова или просто вставьте в очередь до тех пор, пока устройство не подключится?
Отладка. , похоже, что device-> attrib пуст, даже если я уже подключил устройство.

Для тех, кто хочет запустить / отладить образец профиля предупреждения (поскольку документа нет :().
Закомментируйте следующее if (около строки 564), нас не интересует эта проверка ...


    /*
        if (!g_str_equal(alert->srv, sender)) {
            DBG("Sender %s is not registered in category %s", sender,
                                    category);
            return btd_error_invalid_args(msg);
        }
    */

Запустите bluetoothd: ex. bluetoothd -n -d -p alert
Подключите устройство до начала уведомления

Зарегистрируйте оповещение с другой консоли:


    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.RegisterAlert" string:"simple" objpath:"/org/bluez/AlertAgent1" 

Создать новое оповещение:


    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.NewAlert" string:"simple" uint16:"1" string:"test"

Я получил следующий журнал bluetoothd:


    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001c
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x0021
    bluetoothd[1928]: profiles/alert/server.c:register_alert() RegisterAlert("simple", "/org/bluez/AlertAgent1")
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001e
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() 0x1b6e718 registered ATT connection callback
    bluetoothd[1928]: src/device.c:device_set_auto_connect() 10:68:3F:E1:4E:F2 auto connect: 1
    bluetoothd[1928]: src/adapter.c:adapter_connect_list_add() /org/bluez/hci0/dev_10_68_3F_E1_4E_F2 added to BlueZ 5.14's connect_list
    bluetoothd[1928]: src/adapter.c:trigger_passive_scanning()
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() device->attrib = false
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() cfunc = true
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() no idle
    bluetoothd[1928]: profiles/alert/server.c:new_alert() NewAlert("simple", 1, "simple")
    bluetoothd[1928]: src/adapter.c:passive_scanning_complete() status 0x03
    bluetoothd[1928]: Wrong size of start scanning return parameters

Напоминание: добавление отладочного вывода в device.c. Кажется, что device-> attrib пуст. И автоподключение (почему сервер / периферийное устройство gatt должно подключаться к центральному?) Не работает по неизвестной причине.


person user1012131    schedule 27.09.2013    source источник


Ответы (1)


Изменить: мне удалось запустить образец предупреждения, используя скрипт python для тестового предупреждения в коде.

Я напрямую связался с разработчиком и спросил. Оказалось, что при запуске bluez в качестве периферийного устройства возникла ошибка, поэтому он создал несколько патчей в списке рассылки.

http://marc.info/?l=linux-bluetooth&m=139092431515560&w=2

После применения патча запустите сервер и попробуйте использовать тестовое оповещение:

  1. Подключитесь и напишите в правый дескриптор ccc для уведомления на стороне клиента
  2. On server side, run test-alert such as (-w is to keep the test-alert persistent, -r for registering email alert, -u for unread email, 30 is the number of unread email):

    test-alert -w -r email -u email 30

person Isa A    schedule 23.01.2014
comment
Спасибо за информацию Иса. Похоже, патча еще нет в последней версии (5.14). Я возьму последний исходный код из git, чтобы узнать. Но, как сказал Андерсон, он может работать не полностью. (Чувствую, чтобы понять, почему Android переключает стек блютуза с 4.3 и дальше ...). Я тоже ищу другое решение, например, bleno. В прошлый раз я проверял, что у него еще нет уведомления, но я просто проверяю, что оно уже реализовано. - person user1012131; 20.02.2014
comment
Плохие новости. К сожалению, это не работает (с использованием тестового предупреждения). Я использую iOS7 BlueLight для подключения, журнал такой же, как и мое обновление (устройство- ›attrib равно nil, неправильный размер ...). Также протестируйте с Nexus 4 (для BLE требуется 4.4.2, есть много исправлений ошибок, которые вы можете Не подключаюсь к bluez с 4.3 или 4.4) На этот раз лог другой. Но до сих пор у меня не было ни отправки уведомлений на nexus, ни hcidump, отправляющих пакет уведомлений. Постараюсь блено. - person user1012131; 20.02.2014