You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++在树莓派4上实现BLE GATT服务及特征注册?

树莓派4 C++实现BLE GATT服务注册示例

下面是直接调用BlueZ D-Bus接口实现UUID 0xFFFF 主服务及UUID 0xAAAA 读写特征的代码示例,核心是构造RegisterApplication所需的application参数结构体,并通过g_dbus_proxy_call完成调用。

完整代码示例

#include <glib.h>
#include <gio/gio.h>

int main(int argc, char *argv[]) {
    GError *error = NULL;
    GDBusProxy *proxy;
    GVariant *application;
    GVariant *result;

    // 初始化GLib
    g_type_init();

    // 获取BlueZ GATT Manager代理对象
    proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
                                          G_DBUS_PROXY_FLAGS_NONE,
                                          NULL,
                                          "org.bluez",
                                          "/org/bluez/hci0",
                                          "org.bluez.GattManager1",
                                          NULL,
                                          &error);
    if (!proxy) {
        g_printerr("Failed to create proxy: %s\n", error->message);
        g_error_free(error);
        return 1;
    }

    // 构造特征(UUID 0xAAAA,读写权限)
    GVariant *char1 = g_variant_new("a{sv}",
        "UUID", g_variant_new_string("0000aaaa-0000-1000-8000-00805f9b34fb"),
        "Flags", g_variant_new_strv((const char*[]){"read", "write"}, 2)
    );

    // 构造服务(UUID 0xFFFF,主服务)
    GVariant *service1 = g_variant_new("a{sv}",
        "UUID", g_variant_new_string("0000ffff-0000-1000-8000-00805f9b34fb"),
        "Primary", g_variant_new_boolean(TRUE),
        "Characteristics", g_variant_new_array(G_VARIANT_TYPE("a{sv}"), &char1, 1)
    );

    // 构造application参数:包含服务数组的字典
    application = g_variant_new("a{sv}",
        "Services", g_variant_new_array(G_VARIANT_TYPE("a{sv}"), &service1, 1)
    );

    // 调用RegisterApplication方法
    result = g_dbus_proxy_call_sync(proxy,
                                    "RegisterApplication",
                                    g_variant_new("(oa{sv})", application, NULL),
                                    G_DBUS_CALL_FLAGS_NONE,
                                    -1,
                                    NULL,
                                    &error);
    if (!result) {
        g_printerr("RegisterApplication failed: %s\n", error->message);
        g_error_free(error);
        g_object_unref(proxy);
        return 1;
    }

    g_print("GATT Service registered successfully\n");

    // 释放资源
    g_variant_unref(result);
    g_variant_unref(application);
    g_variant_unref(service1);
    g_variant_unref(char1);
    g_object_unref(proxy);

    // 保持程序运行,避免服务被注销
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);
    g_main_loop_run(loop);

    return 0;
}

关键参数说明

  1. application参数结构
    这是一个嵌套的字典数组结构,对应BlueZ的GATT对象层级:

    • 顶层是包含Services键的字典,值为服务数组
    • 每个服务字典包含:
      • UUID: 服务的完整UUID(短UUID需补全为128位标准格式)
      • Primary: 布尔值,标记是否为主服务
      • Characteristics: 特征数组
    • 每个特征字典包含:
      • UUID: 特征的完整UUID
      • Flags: 字符串数组,指定权限(这里用read和write)
  2. options参数
    示例中传NULL即可,该参数用于传递额外注册选项,BlueZ当前版本对GATT服务注册无强制要求的选项,空字典或NULL都能正常工作。

  3. 编译命令
    编译时需要链接GLib和GIO库:

    g++ -o gatt_server gatt_server.cpp `pkg-config --cflags --libs gio-2.0`
    
  4. 运行要求

    • 程序需要root权限运行(BlueZ D-Bus接口需要管理员权限)
    • 确保树莓派的蓝牙服务正常运行:sudo systemctl start bluetooth

内容的提问来源于stack exchange,提问作者Lalavender

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:03:20