【问题标题】:Tizen enable notifications for characteristicTizen 启用特征通知
【发布时间】:2019-09-30 07:59:58
【问题描述】:

您好,我正在尝试为运行 Tizen 4.0.0.4 的 Gear S3 手表开发应用程序 简而言之,问题是我不知道如何启用特征的通知。当我尝试通常的方法时,即将 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 传感器的自定义字符):

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的权限为write notify) 我做通常的事情(在连接等之后,我没有绑定,因为它似乎对设备来说没有必要,除非 Tizen 的堆栈在引擎盖下使用 blueZ 进行某种魔术绑定......)。所以我或多或少这样做: 在连接回调中,创建客户端后我调用三重奏

bt_gatt_client_get_service()
bt_gatt_service_get_characteristic()
bt_gatt_characteristic_get_descriptor()

然后我用

将 0x01 0x00 的值设置为 char 数组
bt_gatt_set_value()

然后最后调用

bt_gatt_client_write_value()

在 bt_gatt_client_write_value() callback 我得到 write fail 错误代码 -1 并在日志中出现上述来自 bluez

的错误

我必须承认我被卡住了...除了将 x01 x00 写入 CCCD 描述符之外,Tizen 中还有其他方法可以启用特征通知吗? 也许我错过了一些先决条件或类似的东西。老实说,我只是按照 Sammys 页面上的教程进行操作,我认为它应该可以工作......就像那样...... 只是提到使用 rpi0 和 python 它正在工作...... 谢谢。 更新: 我忘了提到,基本上,我可以写入其他我没有尝试设置通知的特征,但总的来说,现在唯一的问题是 CCCD 描述符。 权限已设置。

【问题讨论】:

  • 您是否已经在您的tizen-manifest.xml 文件中设置了<privilege>http://tizen.org/privilege/bluetooth</privilege>??
  • 是的,我做了,忘了提,基本上我可以写其他我没有尝试设置通知的特征,但总的来说,现在唯一的问题是 CCCD 描述符。我会更新Q

标签: bluetooth-lowenergy tizen tizen-native-app


【解决方案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; // 全局变量(客户端句柄)

函数 { 字符 *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);

}

【讨论】:

  • 我将此标记为答案,因为它回答了问题。我昨天在查看 bluetooth-frwk 的源代码后发现了这一点;)但似乎它在特征上设置了 0x01 而不是描述符 0x2902 至少这是 nrf 嗅探器从日志中告诉我的,当我使用 python 解决方案时,我写了到描述符导致 nrf 嗅探器实际上显示对描述符的写入而不是特征。
  • 我刚刚比较了两个嗅探器输出,一个来自会话与我的 python 解决方案,另一个会话与 Gear S3 解决方案,似乎它们在数据包级别匹配,即处理、写入请求操作码和值书面比赛。我猜嗅探器脚本在解析数据包时存在一些问题,出于某种原因......原始字节匹配,所以看起来根本没有问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多