dbus api发送GATT通知,蓝色
问题描述:
有人可以告诉我如何使用DBUS api发送GATT通知。目前我正在使用bluez5.43。我正在尝试注册一项服务并发送通知。我已经拿到了工具目录下的gatt-service.c的引用。当我查看源代码时,该特性具有多种注册的特征方法。掉那些之一是dbus api发送GATT通知,蓝色
GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chr_start_notify)
但是当我浏览到chr_start_notify
,
我看到下面的
static DBusMessage *chr_start_notify(DBusConnection *conn, DBusMessage *msg, void *user_data)
{
return g_dbus_create_error(msg, DBUS_ERROR_NOT_SUPPORTED, "Not Supported");
}
谁能至少告诉我有什么DBUS的API来处理这一点,或dbus不支持GATT服务器通知?
答
我有同样的问题,我发现我的解决方法。
如果你的客户是启用通知在你的特点,以下两行会设定特征电流值和的BlueZ会处理它在堆栈,并通知所有用户
gatt_characteristic1_set_value(interface,value);
g_dbus_interface_skeleton_flush(G_DBUS_INTERFACE_SKELETON(interface));
可以,作为一个例子,运行每隔X秒调用一次该函数的线程,并且每隔X秒会通知您的客户端。
编辑:
GattCharacteristic1是C的DBus对象通过gdbus-CODEGEN从XML文件创建。 https://developer.gnome.org/gio/stable/gdbus-codegen.html
为了帮助你,这是我根据BlueZ API文档编写的xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
<interface name="org.bluez.GattCharacteristic1">
<property name="UUID" type="s" access="read" />
<property name="Service" type="o" access="read" />
<property name="Value" type="ay" access="read" />
<property name="Notifying" type="b" access="read" />
<property name="Flags" type="as" access="read" />
<method name="ReadValue">
<arg name="options" type="a{sv}" direction="in" />
<arg name="value" type="ay" direction="out" />
</method>
<method name="WriteValue">
<arg name="value" type="ay" direction="in" />
<arg name="options" type="a{sv}" direction="in" />
</method>
<method name="StartNotify"/>
<method name="StopNotify"/>
</interface>
</node>
一旦你有你的XML文件(名为org.bluez.GattCharacteristic1.xml),这说明你的BlueZ GATT对象,使用GBUS,代码生成,生成一个 “C的DBus对象”
gdbus-codegen --generate-c-code org_bluez_gatt_characteristic_interface --interface-prefix org.bluez. org.bluez.GattCharacteristic1.xml
现在添加c和h文件到您的源代码
以下行显示如何,我呼吁的DBus
const char* char_flags[] = {"read", "write", "notify", "indicate", NULL};
GattCharacteristic1* interface = gatt_characteristic1_skeleton_new();
// dbus object properties
gatt_characteristic1_set_uuid(interface,UUID);
gatt_characteristic1_set_service(interface,service_name);
gatt_characteristic1_set_value(interface,value);
gatt_characteristic1_set_notifying(interface,notifying);
gatt_characteristic1_set_flags(interface,flags);
// get handler (for example), please read doc from gdbus-codegen provide above.
g_signal_connect(interface,
"handle_read_value",
G_CALLBACK(dbus_client_on_handle_gatt_characteristic_read_value),
NULL);
// register new interface on object
g_dbus_object_skeleton_add_interface(object,G_DBUS_INTERFACE_SKELETON(interface));
// exports object on manager
g_dbus_object_manager_server_export(server_manager,object);
创建一个GATT特征的BlueZ
请根据需要编辑标志。在接口对象上保留一个指针,并使用我在第一个答案中提供的行。 GBus doc有很好的文档记录,所以我希望你能找到你需要的一切。
嘿弗朗索瓦,感谢您的信息。你能提供更多细节,我找不到gatt_characteristic1_set_value api,它的声明或定义在哪里?你在这里的界面是什么意思? –
我目前使用bluez5.43,我无法在代码中找到gatt_characteristic1_set_value声明 –