如何用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; }
关键参数说明
application参数结构
这是一个嵌套的字典数组结构,对应BlueZ的GATT对象层级:- 顶层是包含
Services键的字典,值为服务数组 - 每个服务字典包含:
UUID: 服务的完整UUID(短UUID需补全为128位标准格式)Primary: 布尔值,标记是否为主服务Characteristics: 特征数组
- 每个特征字典包含:
UUID: 特征的完整UUIDFlags: 字符串数组,指定权限(这里用read和write)
- 顶层是包含
options参数
示例中传NULL即可,该参数用于传递额外注册选项,BlueZ当前版本对GATT服务注册无强制要求的选项,空字典或NULL都能正常工作。编译命令
编译时需要链接GLib和GIO库:g++ -o gatt_server gatt_server.cpp `pkg-config --cflags --libs gio-2.0`运行要求
- 程序需要root权限运行(BlueZ D-Bus接口需要管理员权限)
- 确保树莓派的蓝牙服务正常运行:
sudo systemctl start bluetooth
内容的提问来源于stack exchange,提问作者Lalavender
相关产品推荐
相关产品推荐

