Tizen включить уведомления для характеристики - PullRequest
1 голос
/ 30 сентября 2019

Привет. Я пытаюсь разработать приложение для часов 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 выглядят так (Это пользовательские символы из датчика темпа и шума 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 - уведомление о записи. ) Я делаю обычные вещи (после подключения и т. Д. Я не связывался, потому что кажется, что это не нужно для устройства, ну, если только стек Тизена не делает какую-то магию с blueZ под капотом со связыванием ...). Поэтому я делаю более или менее это: в обратном вызове подключения, после создания клиента, я вызываю трио

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 это работает ... спасибо. ОБНОВЛЕНИЕ: я забыл упомянуть, что, в принципе, я могу написать другие характеристики, которые я не пытался установить их уведомления, но в целом единственной проблемой является дескриптор CCCD прямо сейчас. Привилегии установлены.

1 Ответ

2 голосов
/ 01 октября 2019

Можете ли вы использовать функцию "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 client= NULL;// переменная grobal (дескриптор клиента)

func {char * 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);

}

...