自定义 Beacon 遥控器控制

更新时间:2023-12-12 03:01:50下载pdf

Mesh 设备除了可以接收 Mesh 遥控器的控制命令,也可以接收普通的蓝牙 LE 广播包。这就为蓝牙 LE Beacon 遥控器控制提供了基础。

蓝牙 LE Beacon 遥控器控制原理为,蓝牙 LE 遥控器发送蓝牙 LE Beacon,Mesh 设备扫描蓝牙 LE Beacon,收到数据后对数据进行解密与响应。

数据结构

TAL_BLE_ADDR_T

typedef struct {
    TAL_BLE_ADDR_TYPE_E     type;                       /**< Mac Address Type, Refer to @ TAL_BLE_ADDR_TYPE_E */
    UCHAR_T                 addr[6];                    /**< GAP Address, Address size, 6 bytes */
} TAL_BLE_ADDR_T;
  • type:MAC 地址类型,分为 public address 与 random address。

  • addr:MAC 地址。

TAL_BLE_ADV_DATA_TYPE_E

 typedef enum {
    TAL_BLE_ADV_DATA,                                   /**< Adv Data - Only */
    TAL_BLE_RSP_DATA,                                   /**< Scan Response Data - Only */
    TAL_BLE_ADV_RSP_DATA,                               /**< Adv Data + Scan Response Data */
} TAL_BLE_ADV_DATA_TYPE_E;

广播数据类型:

  • TAL_BLE_ADV_DATA:广播数据

  • TAL_BLE_RSP_DATA:scan response 数据

TAL_BLE_ADV_REPORT_T

typedef struct {
    TAL_BLE_ADDR_T          peer_addr;                  /**< After scan Adv, we can get peer mac and mac type */
    TAL_BLE_ADV_DATA_TYPE_E adv_type;                   /**< Point the advertising type, refer to @ TAL_BLE_ADV_DATA_TYPE_E */

    CHAR_T                  rssi;                       /**< After scan Adv, we can get advertising's rssi */
    UCHAR_T                 *p_data;                    /**< After scan Adv, we can get advertising's data*/
    UCHAR_T                 data_len;                   /**< advertising data length */
} TAL_BLE_ADV_REPORT_T;
  • peer_addr:广播数据来源地址

  • adv_type:广播数据类型

  • rssi:信号强度

  • p_data:数据指针

  • data_len:数据长度

TAL_BLE_EVT_PARAMS_T

typedef struct {
    TAL_BLE_EVT_TYPE_E              type;

    union {
        UCHAR_T                     init;               /**< Show init states */
        TAL_BLE_CONNECT_EVT_T       connect;            /**< Receive connect callback, This value can be used with TAL_BLE_EVT_PERIPHERAL_CONNECT and TAL_BLE_EVT_CENTRAL_CONNECT_DISCOVERY */
        TAL_BLE_DISCONNECT_EVT_T    disconnect;         /**< Receive disconnect callback */
        TAL_BLE_ADV_REPORT_T        adv_report;         /**< Receive Adv and Respond report */
        TAL_BLE_CONN_PARAM_EVT_T    conn_param;         /**< We will update connect parameters.This value can be used with TAL_BLE_EVT_CONN_PARAM_REQ and TAL_BLE_EVT_CONN_PARAM_UPDATE */
        TAL_BLE_EXCHANGE_MTU_EVT_T  exchange_mtu;       /**< This value can be used with TAL_BLE_EVT_MTU_REQUEST and TAL_BLE_EVT_MTU_RSP */
        TAL_BLE_CONN_RSSI_EVT_T     link_rssi;          /**< Peer device RSSI value */
        TAL_BLE_NOTIFY_TX_EVT_T     notify_result;      /**< [Bluetooth LE Peripheral] This value can be used with TAL_BLE_EVT_NOTIFY_TX after Bluetooth LE Peripheral send a notification to peer. */
        TAL_BLE_DATA_REPORT_T       write_report;       /**< This value can be used with TAL_BLE_EVT_WRITE_REQ */
        TAL_BLE_DATA_REPORT_T       data_report;        /**< This value can be used with TAL_BLE_EVT_NOTIFY_RX */
        TAL_BLE_DATA_REPORT_T       data_read;          /**< After we do read attr in central mode, we will get the callback from bluetooth Kernel */
    }ble_event;
} TAL_BLE_EVT_PARAMS_T;
  • type:蓝牙 LE 事件类型

  • connect:连接事件参数

  • disconnect:断开连接事件参数

  • adv_report:广播数据

  • write_report:写数据事件参数

API 说明

蓝牙 LE 数据回调注册

typedef VOID(*TAL_BLE_EVT_FUNC_CB)(TAL_BLE_EVT_PARAMS_T *p_event);
OPERATE_RET tal_mesh_ble_recv_cb_init(TAL_BLE_EVT_FUNC_CB ble_event);

蓝牙 LE 数据回调中可以收到蓝牙 LE 连接、断开连接、广播以及 GATT(涂鸦蓝牙 LE 服务) 数据,具体可以参考 Demo 中回调实现。

扫描使能

OPERATE_RET tkl_ble_gap_scan_start(TKL_BLE_GAP_SCAN_PARAMS_T CONST *p_scan_params);

前文已经有说明,Bluetooth Mesh SDK Scan 是默认常开启的,且 Scan 参数由 SDK 内默认配置。所以此 API 中入参的扫描参数对于 Mesh SDK 是无效的,会被忽略。

扫描关闭

OPERATE_RET tkl_ble_gap_scan_stop(VOID);

使用说明

以下为蓝牙 LE 数据接收函数示例与初始化注册流程:

VOID app_ble_data_recv(TAL_BLE_EVT_PARAMS_T *p_event)
{
    switch (p_event->type) {
        case TAL_BLE_EVT_ADV_REPORT:
            // adv_data_process(p_event);
            tal_rssi_test_ble_adv_recv(p_event->ble_event.adv_report.p_data, p_event->ble_event.adv_report.data_len,
                                            p_event->ble_event.adv_report.peer_addr.addr, p_event->ble_event.adv_report.rssi);
        break;
        default:
        break;
    }
}
OPERATE_RET tuya_init_third(VOID_T)
{
    // other init process

    tal_mesh_ble_recv_cb_init(app_ble_data_recv); // callback register
    tkl_ble_gap_scan_start(NULL); // start ble scan
    return OPRT_OK;
}

Demo 中 ADV 扫描数据会输入到 RSSI 测试组件接口,此为涂鸦生产测试工具中 RSSI 测试步骤中的功能。如果不使用涂鸦生产测试工具,则可以删除此 API 调用。

注意事项

蓝牙 LE Scan 使能

Mesh SDK 默认开启 ADV Scan,因为 Mesh 的数据包也是蓝牙 LE 广播的一种类型,所以 Mesh 设备在 Scan 接收回调中会对数据进行过滤,仅允许 Mesh 数据接收与处理,其他类型数据则不处理。因此,在使能蓝牙 LE 广播接收功能后,SDK 即可通过注册的蓝牙 LE 回调函数将普通蓝牙 LE ADV 数据上报到应用层。

TLSR825x 平台过滤规则

由于原厂的实现不同,不同芯片平台 Scan 的过滤规则不同。对于 TLSR825x 平台,默认情况下 SDK 内过滤掉所有 可连接广播。如果设备要接收 不可连接广播 数据时,无需调用扫描使能接口,而要接收 可连接广播 时则必须调用扫描使能接口。如果您很熟悉 TLSR825x 原厂 SDK,也可以改动原厂底层接口过滤规则,来达到最优的性能,也就是将不需要的数据尽早过滤而不要占用更多的消息队列资源。