以下是一个基于C/C++的蓝牙通信示例,使用Linux BlueZ栈实现Peripheral(外设)和Central(中心设备)之间的通信。由于代码较长且需要多文件配合,这里提供核心功能的简化示例:
Peripheral设备代码(广播数据并等待连接)
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/gatt.h>
#include <bluetooth/gatt-server.h>
// 初始化GATT服务(简化示例)
static struct bt_gatt_server *server;
// 特征值读写回调
static ssize_t read_value_cb(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, uint16_t len, uint16_t offset) {
const char *value = "Hello from Peripheral!";
return bt_gatt_attr_read(conn, attr, buf, len, offset, value, strlen(value));
}
static ssize_t write_value_cb(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *buf, uint16_t len, uint16_t offset, uint8_t flags) {
printf("Received data: %s\n", (char*)buf);
return len;
}
// GATT服务定义
static struct bt_gatt_attr attrs[] = {
BT_GATT_PRIMARY_SERVICE(BT_UUID_GATT),
BT_GATT_CHARACTERISTIC(BT_UUID_GATT_CHRC, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE),
BT_GATT_DESCRIPTOR(BT_UUID_GATT_DESC, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE, read_value_cb, write_value_cb, NULL),
};
static struct bt_gatt_service gatt_svc = BT_GATT_SERVICE(attrs);
int main() {
// 初始化蓝牙适配器
int dev_id = hci_get_route(NULL);
int sock = hci_open_dev(dev_id);
// 启用LE广播
le_set_advertise_enable(sock, 1);
// 注册GATT服务
server = bt_gatt_server_new();
bt_gatt_server_add_service(server, &gatt_svc);
printf("Peripheral is advertising...\n");
while (1) { sleep(1); }
close(sock);
return 0;
}
Central设备代码(扫描并连接Peripheral)
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/gatt.h>
// 发现服务回调
static void discover_services_cb(int err, struct bt_gatt_discover_list *list) {
if (err) {
printf("Service discovery failed: %d\n", err);
return;
}
printf("Services discovered successfully!\n");
}
// 连接建立回调
static void connect_cb(int err, struct bt_conn *conn) {
if (err) {
printf("Connection failed: %d\n", err);
return;
}
// 发现服务
struct bt_gatt_discover_params params = {
.start_handle = BT_ATT_FIRST_ATTR_HANDLE,
.end_handle = BT_ATT_LAST_ATTR_HANDLE,
.callback = discover_services_cb,
};
bt_gatt_discover_services(conn, ¶ms);
}
int main() {
// 扫描周边设备
int dev_id = hci_get_route(NULL);
int sock = hci_open_dev(dev_id);
// 开始LE扫描(需实现扫描结果解析)
le_set_scan_parameters(sock);
le_set_scan_enable(sock, 1);
// 假设找到目标设备地址(实际需从扫描结果获取)
bdaddr_t target_addr = {{0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}};
// 发起连接
struct bt_conn *conn = bt_conn_create_le(&target_addr);
bt_conn_set_callback(conn, connect_cb);
printf("Central connecting...\n");
while (1) { sleep(1); }
close(sock);
return 0;
}
编译与运行说明
依赖库:
- Linux系统需安装BlueZ开发库:
sudo apt-get install libbluetooth-dev
- 编译时链接蓝牙库:
gcc -o peripheral peripheral.c -lbluetooth
- Linux系统需安装BlueZ开发库:
权限要求:
- 需要以root权限运行或授予CAP_NET_ADMIN能力:
sudo setcap cap-net_admin+ep ./peripheral
- 需要以root权限运行或授予CAP_NET_ADMIN能力:
实际开发注意事项:
- BlueZ提供了DBus API,实际开发建议使用dbus-c++或bluepy等高级封装库
- Peripheral需实现完整的GATT Profile(参考BlueZ的
tools/btgatt-server.c
) - Central需处理扫描响应、连接状态机、数据读写异步回调等
跨平台替代方案:
- Windows/macOS可使用官方SDK(Windows WinRT APIs或Apple CoreBluetooth)
- 跨平台库推荐:SimpleBLE(C++17)或QtBluetooth(QML集成)
建议参考BlueZ官方示例:
如需完整工程示例或特定功能细节,可进一步说明具体需求!
内容由零声教学AI助手提供,问题来源于学员提问