BlueNRG-LP v3.x 协议栈 API 使用教程(基础实战版)


📦 一、初始化 BLE 协议栈

// 必须先调用 BLE_STACK_Init_nocallbacks()
// 提供 RAM buffer 和连接配置参数
BLE_STACK_InitTypeDef ble_init_params = {
    .BLEStartRamAddress = ble_ram_buffer,
    .BLEStackSize = BLE_STACK_RAM_SIZE,
    .NumAttrRecords = 100,
    .NumOfLinks = 2,
    ...
};
BLE_STACK_Init_nocallbacks(&ble_init_params);

// 初始化 GAP
aci_gap_init(GAP_PERIPHERAL_ROLE, privacy, dev_name_len, &service_handle, &name_handle, &appearance_handle);

📡 二、开启广播(Peripheral 模式)

// 1. 设置广播参数(adv_set)
aci_gap_set_advertising_configuration(
    0, GAP_MODE_GENERAL_DISCOVERABLE, ADV_IND,
    ADV_FILTER_POLICY_ALLOW_SCAN_ANY_CON_ANY,
    160, 160,
    PUBLIC_ADDR, NULL, 0,
    TX_POWER_NO_PREFERENCE,
    LE_1M_PHY, LE_1M_PHY,
    0, 0);

// 2. 设置广播数据
uint8_t adv_data[] = {
    0x02, 0x01, 0x06,
    0x0A, 0x09, 'B','L','E','_','D','E','M','O'
};
aci_gap_set_advertising_data(0, GAP_ADV_DATA_TYPE_COMPLETE_LOCAL_NAME, sizeof(adv_data), adv_data);

// 3. 启动广播
aci_gap_set_advertise_enable(ENABLE, 0, 0);

🔍 三、启动扫描(Central 模式)

// 1. 设置扫描参数
aci_gap_set_scan_configuration(
    GAP_OBSERVER_ROLE,            // 角色
    LE_1M_PHY,                    // PHY
    ACTIVE_SCAN,                  // 扫描类型
    100, 100,                     // window, interval
    PUBLIC_ADDR,                  // own address
    0                             // filter duplicates
);

// 2. 启动扫描
aci_gap_start_procedure(GAP_OBSERVER_ROLE, SCAN_INTERVAL_MS, SCAN_WINDOW_MS, SCAN_TIMEOUT_MS);
  • 扫描结果会通过 HCI_LE_ADVERTISING_REPORT_EVENT 事件上报。


🔗 四、发起连接(Central 连接 Peripheral)

// 1. 设置连接参数(可选)
aci_gap_set_connection_configuration(LE_1M_PHY, ...);  // 可调超时时间等

// 2. 创建连接
aci_gap_create_connection(
    160, 160,                     // min/max interval
    PUBLIC_ADDR,                 // peer type
    peer_addr,                   // peer address
    PUBLIC_ADDR,                 // own address
    60, 60,                      // supervision timeout
    0, 600, 0, 0                 // latency, CE length
);
  • 连接成功后会收到 HCI_LE_CONNECTION_COMPLETE_EVENT


📨 五、发送通知数据(GATT Server)

// 初始化时添加服务、特征值
aci_gatt_srv_add_service(UUID_TYPE_16, uuid, PRIMARY_SERVICE, num_handles, &service_handle);
aci_gatt_srv_add_char(service_handle, UUID_TYPE_16, char_uuid,
                      max_len, CHAR_PROP_NOTIFY, ATTR_PERMISSION_NONE, ...);

// 连接后发送 notify
aci_gatt_srv_notify(conn_handle, char_handle, len, data);

📥 六、接收 notify / indication(GATT Client)

  • 中央设备连接后,通过事件获取 notify 数据:

case ACI_GATT_CLT_NOTIFICATION_EVENT:
    // data->Attr_Handle, data->Attr_Value
  • 启用 notify 需写入 CCCD descriptor(UUID 0x2902):

aci_gatt_clt_write(conn_handle, cccd_handle, 2, (uint8_t[]){0x01, 0x00});

🛑 七、断开连接

aci_gap_terminate(conn_handle, 0x13);  // reason = user terminated

📎 八、其他常用操作

功能API
设置广播 PHYaci_gap_set_advertising_phy_configuration() //这个st还没有实现
修改广播内容aci_gap_set_advertising_data()
修改 GATT 值aci_gatt_srv_write_handle_value()
发起 MTU 交换aci_att_exchange_mtu()
设置白名单aci_gap_configure_white_and_resolving_list()

✅ 最小流程建议(用于调试验证)

// 初始化 BLE 协议栈
BLE_STACK_Init_nocallbacks(...);
aci_gap_init(...);

// 启动广播(Peripheral)
aci_gap_set_advertising_configuration(...);
aci_gap_set_advertising_data(...);
aci_gap_set_advertise_enable(ENABLE, ...);

// 主循环中处理事件
if (ble_evt_pending) {
    hci_user_evt_proc();
    ble_evt_pending = false;
}

📚 参考接口头文件

所有函数声明在:

Middlewares/ST/BLE_Stack/inc/bluenrg_lp_api.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

damo王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值