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

 

posted @   流水灯  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-07-17 STM32F103 ------ DMA 与 串口
2017-07-17 TCP ------ TCP创建服务器中出现的套接字
点击右上角即可分享
微信分享提示