org.bluez.GattCharacteristic1 WriteValue 方法

Posted

技术标签:

【中文标题】org.bluez.GattCharacteristic1 WriteValue 方法【英文标题】:org.bluez.GattCharacteristic1 WriteValue method 【发布时间】:2017-10-23 10:41:04 【问题描述】:

我正在使用 Bluez-5.43,并且正在使用 dbus API。

尝试使用 WriteValue 方法将值写入特征时出现以下错误:

GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: Method "WriteValue" with signature "ay" on interface "org.bluez.GattCharacteristic1" doesn't exist.

如果有人帮我解决这个问题,我将不胜感激:)

这是导致此问题的代码:

GVariant *char_value = g_variant_new_from_data(G_VARIANT_TYPE ("ay"), buffer, *buffer_len, TRUE, NULL, NULL);
if (char_value == NULL)
    printf("converting value error\n");
    return -1;

else
    printf("converting value succeed\n");
    g_dbus_proxy_call_sync (char_write_proxy, "WriteValue", g_variant_new ("(@ay)", char_value), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
    printf("lign 154\n");
    if (error != NULL)
        printf("write failed:    %s\n", error->message);
        return -1;
    
    else
        break;
    

【问题讨论】:

造成这个问题的代码在哪里? 你应该在你的帖子中发布它 【参考方案1】:

WriteValue() 签名实际上是“ayasv”,换句话说,您需要一个(通常为空的)字典作为第二个参数。

文档非常好:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/gatt-api.txt

有多种方法可以构建字典,我更喜欢 Variantbuilder。像这样的:

GVariantBuilder builder;
g_variant_builder_init (&builder, G_VARIANT_TYPE("asv"));
write_value_argument = g_variant_new ("(@ayasv)", char_value, &builder);

【讨论】:

感谢您的回复 :) 您能帮我在使用 g_dbus_proxy_call_sync 调用 WriteValue 方法时如何传递这些参数 我添加了一个 untested 示例——我认为这是正确的,但这些可能很棘手……developer.gnome.org/glib/stable/gvariant-format-strings.html 是一个很好的资源,当你试图做到这一点时—— - 它还解释了“builder as g_variant_new() argument”技巧。 对我来说也是非常有用的答案。我测试了你的例子并且它有效。 @JussiKukkonen

以上是关于org.bluez.GattCharacteristic1 WriteValue 方法的主要内容,如果未能解决你的问题,请参考以下文章