蓝牙配网

更新时间:2024-01-15 07:15:15下载pdf

本文介绍 TuyaOS Bluetooth LE Peripheral。关于蓝牙配网流程和 API 说明,详见 蓝牙配网

概述

为了更快导入并使用 TuyaOS 蓝牙服务,涂鸦规范了一套跨多端的蓝牙接口。通过实现该接口,可以注册指定涂鸦服务,并进行数据通道安全加密交互。通过实现 TKL 蓝牙 LE Peripheral 接口,将所需服务进行注册并正确广播,通过读写接口以及数据回调,实现加密数据交互等。

实现蓝牙 LE Peripheral 所需的接口

//【必要】注册 GAP 回调,使用 Peripheral 时需要将 TKL_BLE_EVT_STACK_INIT、TKL_BLE_GAP_EVT_CONNECT、TKL_BLE_GAP_EVT_DISCONNECT、TKL_BLE_GAP_EVT_CONN_PARAM_UPDATE 等事件上报,不同的事件上报描述可参考 tkl_bluetooth_def.h 中的 TKL_BLE_GAP_EVT_TYPE_E
OPERATE_RET tkl_ble_gap_callback_register(CONST TKL_BLE_GAP_EVT_FUNC_CB gap_evt);

//【必要】注册 GATT 回调,使用 Peripheral 时需要将 TKL_BLE_GATT_EVT_MTU_RSP、TKL_BLE_GATT_EVT_WRITE_REQ 等事件上报,不同的事件上报描述可参考 tkl_bluetooth_def.h 中的 TKL_BLE_GATT_EVT_TYPE_E
OPERATE_RET tkl_ble_gatt_callback_register(CONST TKL_BLE_GATT_EVT_FUNC_CB gatt_evt);

//【必要】初始化蓝牙协议栈,可按需进行不同平台实现
OPERATE_RET tkl_ble_stack_init(UCHAR_T role);

//【必要】服务规则列表可参考开放文件 tal_bluetooth.c 中的 tal_ble_bt_init 接口,涉及涂鸦使用的多类服务,按照服务->特征值->描述符规则实现即可。
OPERATE_RET tkl_ble_gatts_service_add(TKL_BLE_GATTS_PARAMS_T *p_service);

//【必要】广播接口,使用 Peripheral 时需将如下广播接口进行实现,广播接口主要是将子设备的信息进行广播,便于终端设备可发现且可连接上
OPERATE_RET tkl_ble_gap_adv_stop(VOID);
OPERATE_RET tkl_ble_gap_adv_start(TKL_BLE_GAP_ADV_PARAMS_T CONST *p_adv_params);
OPERATE_RET tkl_ble_gap_adv_rsp_data_set(TKL_BLE_DATA_T CONST *p_adv, TKL_BLE_DATA_T CONST *p_scan_rsp);
//【注意】需说明该 update 接口,update 是否开启广播由上一次开启状态决定,若实现平台有该接口,可直接对接。若无,可记录开启广播状态。
// 除特殊类产品外,在连接后 update 将不开启广播,仅作数据更新。
OPERATE_RET tkl_ble_gap_adv_rsp_data_update(TKL_BLE_DATA_T CONST *p_adv, TKL_BLE_DATA_T CONST *p_scan_rsp);

//【必要】最大传输单元协商接口,使用 Peripheral 时会进行最大传输单元的协商行为,此时通过如下接口进行请求 MTU,且最终协商后的 MTU 将通过 TAL_BLE_EVT_MTU_RSP 进行上报至业务端
OPERATE_RET tkl_ble_gattc_exchange_mtu_request(USHORT_T conn_handle, USHORT_T client_rx_mtu);

//【必要】数据交互接口,使用 Peripheral 时会进行子设备数据上报,即通过 notification 方式进行数据上报至终端,此时将采用如下接口进行发送。
OPERATE_RET tkl_ble_gatts_value_notify(USHORT_T conn_handle, USHORT_T char_handle, UCHAR_T *p_data, USHORT_T length);

//【按需】数据交互接口,使用 Peripheral 时会进行 Read 属性特征值进行数据更新,此时将采用 value set 方式进行设定。
// 如果仅仅是配网需求,可按需实现该接口
OPERATE_RET tkl_ble_gatts_value_set(USHORT_T conn_handle, USHORT_T char_handle, UCHAR_T *p_data, USHORT_T length);

//【按需】连接参数更新接口,使用 Peripheral 时将按需进行连接参数更新以达到功耗要求。针对 OTA 等大数据量交互时,将缩短连接间隔以达到更大的吞吐效果。
// 如果仅仅是配网需求,可按需实现该接口。
OPERATE_RET tkl_ble_gap_conn_param_update(USHORT_T conn_handle, TKL_BLE_GAP_CONN_PARAMS_T CONST *p_conn_params);

//【按需】需要提及扫描接口。如果采用涂鸦产测或蓝牙 LE Beacon 等方案,需要将扫描接口进行实现,对应上报事件为 TKL_BLE_GAP_EVT_ADV_REPORT。
// 如果仅仅是配网需求,可按需实现该接口。
OPERATE_RET tkl_ble_gap_scan_start(TKL_BLE_GAP_SCAN_PARAMS_T CONST *p_scan_params);
OPERATE_RET tkl_ble_gap_scan_stop(VOID);

接口实现方法

实现 TuyaOS TKL 上述接口不限于 Linux、FreeRTOS 和 None-OS 等等。对于不同平台,可按照具体规则进行实现。

  • 对于单片机端和 FreeRTOS 端,参考开放 SDK 中 Nordic 蓝牙 LE。
  • 对于 Linux 端,参考 BlueZ 中 btgatt-server 实现方式或采用 dbus-bluetoothd 方式进行 Peripheral 实现。

涉及平台类导入问题,可咨询原厂或在 TuyaOS 论坛提出相关逻辑性问题。

实现一个简单的 Peripheral

基于 TuyaOS TKL 蓝牙 LE 接口实现一个简单的 Peripheral。具体信息,参考 tuyaos_tkl_ble_peripheral_test.c

验证 Peripheral 通道可行性

验证方法

本章节采用 Nordic 推出的 nRF Connect for Mobile

建议采用安卓手机下载并验证,iOS 受限于安全规则,无法展示需要的所有信息。

【必要】验证广播与扫描响应包

蓝牙配网

必须确认两笔数据和实际发送一致,特别是校验长度 LEN。其次便是广播扫描响应数据是否有发出。这里的展示数据从 RAW 处单击进入。

【必要】验证服务注册

蓝牙配网

【必要】验证数据交互

蓝牙配网

后续工作

Peripheral 通道可行性验证成功后,将 tkl_bluetooth.c 合入 IPC 开发框架,再设置连接模式为蓝牙连接,即可完成蓝牙配网的开发。

    TUYA_IPC_LINK_TYPE_E link_type = TUYA_IPC_LINK_BT;
    ipc_sdk_run_var.net_info.link_type = link_type;