Files
2026-08-13 16:50:52 +08:00
..

LISA Bluetooth 组件
===================

简介
----

LISA Bluetooth 是一个蓝牙初始化和管理组件,封装了 BLE 协议栈的初始化流程,提供统一的 API 接口,支持自定义广播数据、扫描响应数据以及 GAP 配置。

主要特性
--------

- **统一初始化**:提供 ``lisa_bluetooth_init()`` 接口,简化协议栈启动流程。
- **自定义广播数据**:支持通过弱符号覆盖机制自定义广播数据。
- **自定义扫描响应**:支持通过弱符号覆盖机制自定义扫描响应数据。
- **自定义 GAP 配置**:支持自定义 MAC 地址、设备名称等 GAP 参数。
- **广播控制**:提供简单的广播开启和停止接口。

API 参考
--------

核心函数
~~~~~~~~

.. c:function:: int lisa_bluetooth_init(void)

   初始化蓝牙协议栈。

   :return: 0 成功,非 0 失败。

.. c:function:: uint8_t app_ble_adv_start(uint8_t adv_id, uint8_t adv_type)

   开启 BLE 广播。

   :param adv_id: 广播 ID。
   :param adv_type: 广播类型 (参考 ``enum app_adv_type``)。
   :return: 状态码。

.. c:function:: uint8_t app_ble_adv_stop(uint8_t adv_id)

   停止 BLE 广播。

   :param adv_id: 广播 ID。
   :return: 状态码。

自定义接口 (Weak Symbols)
~~~~~~~~~~~~~~~~~~~~~~~~~

用户可以在应用程序中实现以下函数来覆盖默认行为。

.. c:function:: const uint8_t* lisa_bt_get_adv_data(uint8_t *len)

   获取自定义广播数据。

   :param len: [输出] 数据长度指针。
   :return: 指向广播数据的指针。

.. c:function:: const uint8_t* lisa_bt_get_scan_rsp_data(uint8_t *len)

   获取自定义扫描响应数据。

   :param len: [输出] 数据长度指针。
   :return: 指向扫描响应数据的指针。

.. c:function:: void lisa_bt_gap_config(ble_gap_cfg_t *cfg)

   配置 GAP 参数(如 MAC 地址、设备名称)。

   :param cfg: [输入/输出] GAP 配置结构体指针。

使用示例
--------

自定义广播数据和 GAP 配置
~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: c

    #include "lisa_bluetooth.h"
    #include "bt_app_if.h"
    #include <string.h>

    // 自定义广播数据
    static const uint8_t user_adv_data[] = {
        0x02, 0x01, 0x06, // Flags
        0x09, 0x09, 'M', 'Y', '_', 'B', 'L', 'E', // Local Name
    };

    const uint8_t* lisa_bt_get_adv_data(uint8_t *len)
    {
        *len = sizeof(user_adv_data);
        return user_adv_data;
    }

    // 自定义 GAP 配置
    void lisa_bt_gap_config(ble_gap_cfg_t *cfg)
    {
        // 设置自定义 MAC 地址
        uint8_t mac[6] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
        memcpy(cfg->addr.addr, mac, 6);
        
        // 设置设备名称
        const char *name = "MY_DEVICE";
        cfg->name_len = strlen(name);
        if (cfg->name_len > sizeof(cfg->name)) {
            cfg->name_len = sizeof(cfg->name);
        }
        memcpy(cfg->name, name, cfg->name_len);
    }

    int main(void)
    {
        // 初始化蓝牙
        lisa_bluetooth_init();

        // 开启广播
        app_ble_adv_start(0, BLE_ADV_GEN);

        // ...
    }