bluez glib编程 --- API 功能介绍
遍历数组
g_variant_iter_next (GVariantIter, "{sa{sv}}", &gchar, &GVariantIter) g_variant_iter_next (GVariantIter, "{sv}", &gchar, &GVariant) g_variant_iter_next (GVariantIter, "s", &gchar)
从 GVariant 变量获取子成员变量
g_variant_get(GVariant, "(sa{sv}as)", &gchar, &GVariantIter, &GVariantIter) g_variant_get(GVariant, "(oa{sa{sv}})", &gchar, &GVariantIter) g_variant_get(GVariant, "(a{oa{sa{sv}}})", &GVariantIter) g_variant_get(GVariant, "ay", &GVariantIter); g_variant_get(GVariant, "s", &gchar)
判断 path 是不是 service_path 的前缀
g_str_has_prefix(service_path, path)
把 GVariant 变量转换为字符串形式,方便打印查看
gchar *value_str = g_variant_print(manufacturerData, TRUE);
连接蓝牙设备
variant_connect = g_dbus_proxy_call_sync( device1, "Connect", // 连接成功后,服务特征对象还得等一会儿才能出现,所以连接成功后不能立马通信 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error );
注意:如果调用出现错误 le-connection-abort-by-local后,需要间隔一段时间再调用或者读取属性值 Connected,否则再调用Connect虽然没出现错误,但是还是未连接,如下:
读属性值
device1 = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.bluez", path, "org.bluez.Device1", NULL, &error); PRINT_WARN_LOG("Device1"); GVariant *flag_connected = NULL; flag_connected = g_dbus_proxy_get_cached_property(device1, "Connected");
注意:每次读属性值都得重新连接下接口,否则读取的属性不是最新的
和 bluetoothd 通信的步骤
1、连接总线
2、连接接口
3、方法调用 / 属性获取
连接总线
g_bus_get_sync
(总线+接口)连接
g_dbus_proxy_new_for_bus_sync
接口连接 + 方法调用
GVariant *managedObjects = g_dbus_connection_call_sync(
conn,
"org.bluez",
"/",
"org.freedesktop.DBus.ObjectManager",
"GetManagedObjects",
NULL,
G_VARIANT_TYPE("(a{oa{sa{sv}}})"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error
);
接口连接
g_dbus_proxy_new_sync
方法调用
GVariant *result = g_dbus_proxy_call_sync(adapter1,
"RemoveDevice",
g_variant_new("(o)", path_object),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
属性获取
g_dbus_proxy_get_cached_property