Tizen включить уведомления для характеристики

Привет, я пытаюсь разработать приложение для часов Gear S3, работающих под управлением Tizen 4.0.0.4 Кратко говоря, проблема в том, что я не знаю, как включить уведомления о характеристиках. Когда я пробую обычный подход, т.е. записываю x01 x00 в дескриптор 0x2902, я получаю ошибку -1 и в логах получаю:

bt-gatt-client.c: __bluetooth_get_att_error_code(901) > Error : GDBus.Error:org.bluez.Error.NotPermitted: Write not permitted [/dev_4C_65_A8_DC_A1_F7/service002d/char002e/desc0030]

Я попытался немного заглянуть в blueZ, чтобы понять, что не так, но я только начал.

svc, char и desc выглядят так (это пользовательские символы от датчика Temp&Hum Xiaomi):

SRVC:(1/7) uuid: [0000fe95-0000-1000-8000-00805f9b34fb]
CHAR:   (1/6) uuid: [00000001-0000-1000-8000-00805f9b34fb]
DESC:       (1/1) uuid: [00002902-0000-1000-8000-00805f9b34fb]

(разрешение на CHAR пишет notify) Делаю обычное дело (после подключения и тд, бонда не делал так как вроде не нужно для девайса, ну разве что стек тизена какой-то магии с blueZ под капот с проклейкой...). Итак, я делаю примерно так: в обратном вызове connect после создания клиента я вызываю трио

bt_gatt_client_get_service()
bt_gatt_service_get_characteristic()
bt_gatt_characteristic_get_descriptor()

а затем я устанавливаю значение 0x01 0x00 как массив символов с

bt_gatt_set_value()

а потом, наконец, позвони

bt_gatt_client_write_value()

в bt_gatt_client_write_value() обратный вызов я получаю сбой записи с кодом ошибки -1 и в журнале вышеупомянутая ошибка от bluez сильный>

Я должен признать, что застрял ... Есть ли в Tizen другой способ включить уведомления о характеристиках, кроме записи x01 x00 в дескриптор CCCD? Возможно, я упускаю какое-то предварительное условие или что-то в этом роде. Честно говоря, я просто следил за учебным пособием на странице Sammys и подумал, что это должно работать ... просто так ... Просто упомянем, что с использованием rpi0 и python это работает ... спасибо. UPDATE: Забыл упомянуть, что, в принципе, я могу писать и в другие характеристики, я их уведомления не пробовал ставить, но вообще проблема только в дескрипторе CCCD сейчас. Привилегии установлены.


person Pawel K    schedule 30.09.2019    source источник
comment
Вы уже установили <privilege>http://tizen.org/privilege/bluetooth</privilege> в файле tizen-manifest.xml??   -  person UmFraWJ1bCBJc2xhbQ    schedule 30.09.2019
comment
Да делал, забыл упомянуть, в принципе могу написать на другие характеристики Я их уведомления не пробовал ставить, но вообще проблема только в дескрипторе CCCD щас. Я обновлю вопрос   -  person Pawel K    schedule 30.09.2019


Ответы (1)


Можете ли вы использовать функцию «bt_gatt_client_set_characteristic_value_changed_cb»? Даже если вы не пропишете в дескрипторе значение 0x01, вы сможете отслеживать изменение значения характеристики.

https://developer.tizen.org/development/api-references/native-application?redirect=https://developer.tizen.org/dev-guide/5.0.0/org.tizen.native.mobile.apireference/group__CAPI__NETWORK__BLUETOOTH__GATT__CLIENT__MODULE.html#ga68dc116f5d5e32c505941072fb515871

Например,

bt_gatt_client_h клиент = NULL; // глобальная переменная (клиентский дескриптор)

func { символ *svc_uuid = NULL; введите код сюда

char *chr_uuid = NULL;
bt_gatt_h svc = NULL;
bt_gatt_h chr = NULL;

svc_uuid = g_test_param.params[0];
chr_uuid = g_test_param.params[1];

ret = bt_gatt_client_get_service(client, svc_uuid, &svc);
if (ret != BT_ERROR_NONE) {
    TC_PRT("bt_gatt_client_get_service is failed : %d", ret);
    __bt_free_test_param(&g_test_param);
    break;
}

ret = bt_gatt_service_get_characteristic(svc,
        chr_uuid, &chr);
if (ret != BT_ERROR_NONE) {
    TC_PRT("bt_gatt_service_get_characteristic is failed : %d", ret);
    __bt_free_test_param(&g_test_param);
    break;
}

ret = bt_gatt_client_set_characteristic_value_changed_cb(chr,
                __bt_gatt_client_value_changed_cb, NULL);
if (ret != BT_ERROR_NONE)
    TC_PRT("bt_gatt_client_set_characteristic_value_changed_cb is failed : %d", ret);

}

person DoHyun Pyun    schedule 01.10.2019
comment
Я отмечаю это как ответ, поскольку это отвечает на вопрос. Я обнаружил это вчера, просмотрев исходный код bluetooth-frwk;) Но, похоже, он устанавливает 0x01 для характеристик, а не для дескрипторов 0x2902, по крайней мере, это то, что мне говорит сниффер nrf из журналов, когда я использую решение Python, которое я пишу к дескриптору приводит к тому, что сниффер nrf фактически показывает запись в дескриптор, а не характеристику. - person Pawel K; 01.10.2019
comment
Я только что сравнил два выхода сниффера, один из сеанса с моим решением на python, а другой сеанс с решением для Gear S3, кажется, что они совпадают на уровне пакетов, т.е. дескриптор, код операции запроса на запись и написанное значение совпадают. Я предполагаю, что у сценариев сниффера есть некоторые проблемы с анализом пакетов по какой-то причине... необработанные байты совпадают, так что, похоже, проблем нет вообще... - person Pawel K; 01.10.2019