2017-05-23 28 views
0

我正在使用Bluez-5.43,并使用dbus API。org.bluez.GattCharacteristic1 WriteValue方法

当尝试使用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; 
    } 
} 
+0

你的代码在哪里产生这个问题? –

+0

你应该张贴在你的文章 –

回答

1

WriteValue()的签名居然是“绫{} SV”,换句话说,你需要一个(通常是空的)的字典作为塞康d论证。

该文档是相当不错: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("a{sv}")); 
write_value_argument = g_variant_new ("(@aya{sv})", char_value, &builder); 
+0

谢谢你的回应:)你可以请帮助我如何在调用WriteValue方法时使用g_dbus_proxy_call_sync传递这些参数 –

+0

我已经添加了_untested_例子 - 我认为这是正确的,但这些可以是棘手... https://developer.gnome.org/glib/stable/gvariant-format-strings.html是一个很好的资源,当试图得到这个权利 - 它也解释了“建设者作为g_variant_new()参数”的伎俩。 – jku

相关问题