Я расширяю 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 должно подключаться к центральному?) Не работает по неизвестной причине.