杰理 SDK 文档中心
首页
首页
  • 概述

    • SDK 概览与产品定位
    • 支持芯片平台与蓝牙认证
    • SDK 架构与目录分层
  • 快速开始

    • 环境搭建与编译工具链
    • 编译构建系统
    • 板级工程与配置
    • 烧录与固件升级工具
  • 应用工程

    • 应用选择与工程总览
    • SPP + BLE 数传应用框架
    • 透传与 AT 指令示例
    • BLE 广播/中心与定位示例
    • 2.4G 私有协议与 Dongle 示例
    • 云平台接入示例
    • HID 人机交互应用框架
    • HID 示例工程(键盘/鼠标/遥控器/手柄)
    • Bluetooth Mesh 应用框架
    • Mesh 模型与 Mesh DFU 固件升级
    • Mesh 音频编解码演示
  • 芯片平台与硬件抽象

    • 芯片平台总览与差异
    • 音频编解码与时钟管理
    • 外设驱动接口(ADC/IIC/SPI/PWM/LED/充电)
    • 芯片配置工具与下载支持
  • 蓝牙协议栈

    • 蓝牙控制器层(btctrler)
    • 蓝牙协议栈与 Profile(btstack)
    • 蓝牙模块选择与配置
  • 媒体与音频框架

    • 音频流框架
    • 音频编解码与 A2DP 媒体
    • 音频效果处理(EQ/频谱/变调/环绕/超低音)
    • 本地 TWS 与音频同步
  • 系统服务与运行时

    • 实时操作系统与任务调度
    • 消息事件机制
    • 电源管理与低功耗
    • 存储与配置系统
    • 设备驱动框架(USB/RTC)
  • 应用公共组件

    • 音频应用组件
    • 设备外设抽象(按键/触摸/传感器/存储)
    • 蓝牙公共模块与消息联动
    • 调试与配置组件
    • 杰理关键词唤醒(jl_kws)
  • 第三方协议与云平台接入

    • 杰理 RCSP 私有协议
    • 低功耗蓝牙 Mesh 方案(llsync_mesh)
    • Sig Mesh 方案
    • 涂鸦协议接入
    • 腾讯连连接入
    • 华为 HiLink 接入
  • 固件升级与维护

    • OTA 升级机制
    • 升级补丁与版本维护
    • 升级工具链(BLE OTA / USB Dongle OTA)
  • 文档与开发资源

    • 数据手册与架构文档
    • 协议与云平台开发文档
    • 常见问题与技术支持

云平台接入示例

本文档介绍 AC63 蓝牙 SDK 中内置的云平台接入示例,涵盖涂鸦(Tuya)、天猫精灵(AliGenie)、腾讯云(Tencent)三类云平台的接入方式、代码结构、控制流程与配置方法,帮助开发者快速理解并移植到自有产品。

Purpose and Scope

本页面覆盖 SDK 中与"云平台接入"相关的完整实现路径:

  • 涂鸦 Tuya 经典 BLE 接入(apps/spp_and_le/examples/tuya/ 下的 app_tuya.c、tuya_demo.c)
  • 涂鸦 Tuya Mesh 灯示例(apps/mesh/examples/TUYA_light.c,基于 Mesh Vendor Model)
  • 天猫精灵 AliGenie Mesh 示例(apps/mesh/examples/AliGenie_light.c、AliGenie_fan.c、AliGenie_socket.c)
  • 腾讯云 Mesh 示例(apps/mesh/examples/tencent_mesh.c)
  • 涂鸦协议栈依赖(apps/common/third_party_profile/tuya_protocol/,含 mbedtls 加密组件)

以下内容属于其他页面范畴,本文不展开:BLE/Mesh 协议栈底层实现、GATT 通用服务框架(gatt_common)、RCSP 私有协议、以及按键/电源管理等通用系统服务。本文聚焦于"如何把设备接入云平台"这一能力边界。

Overview

云平台接入是智能硬件产品化的关键环节:设备通过 BLE 或 Mesh 与手机 App / 语音音箱交互,再由云端完成配网、控制与状态同步。AC63 SDK 提供了三种典型接入范式:

  1. 经典 BLE + 涂鸦云:设备以 BLE GATT Server 形态接入涂鸦 App。SDK 通过 CONFIG_APP_TUYA 开关将整个应用切换为涂鸦模式,运行独立的涂鸦协议栈(tuya_protocol),并使用 mbedtls 的 AES-CCM/SHA256 做数据加密与完整性校验。
  2. BLE Mesh + 涂鸦云:设备以 Mesh 节点形态接入,通过涂鸦 Vendor Model(0x07D00004)与涂鸦网关通信,适用于灯、插座等照明/电工类产品。
  3. BLE Mesh + 平台音箱:通过标准 Mesh Model(Generic OnOff / Light Lightness 等)对接天猫精灵(AliGenie)、腾讯云等平台音箱,实现语音控制。

选择哪种范式取决于产品品类与目标平台:涂鸦平台提供完整 App+云服务闭环,适合自有品牌快速出海;AliGenie/Tencent 侧重音箱语音入口,适合与天猫精灵/腾讯连连生态对接。

Architecture

云平台接入总体架构

flowchart TD
    subgraph sg_App["应用层 (apps)"]
        Main["app_main.c<br/>TUYA_DEMO_EN / CONFIG_APP_TUYA"]
        TuyaApp["app_tuya.c<br/>涂鸦应用状态机"]
        TuyaDemo["tuya_demo.c<br/>BLE GATT 服务"]
        MeshApp["mesh examples<br/>TUYA_light / AliGenie_* / tencent_mesh"]
    end

    subgraph sg_Proto["协议层"]
        TuyaStack["tuya_protocol<br/>涂鸦协议栈"]
        MbedTLS["mbedtls<br/>AES / CCM / SHA1 / SHA256"]
        MeshModels["Mesh Models<br/>Generic OnOff / Vendor 0x07D00004"]
    end

    subgraph sg_BT["蓝牙层 (btstack)"]
        BLE["BLE GATT Server<br/>ATT read/write"]
        Mesh["BLE Mesh Stack"]
    end

    subgraph sg_Cloud["云平台"]
        TuyaCloud["涂鸦云 + App"]
        AliGenieCloud["天猫精灵 / 腾讯云"]
    end

    Main -->|"ACTION_TUYA"| TuyaApp
    TuyaApp --> TuyaDemo
    TuyaDemo --> TuyaStack
    TuyaStack --> MbedTLS
    TuyaDemo --> BLE
    MeshApp --> MeshModels
    MeshModels --> Mesh
    BLE -->|"BLE 链路"| TuyaCloud
    Mesh -->|"Mesh 网络"| AliGenieCloud

图中展示了三条接入路径的层次关系:应用层通过 CONFIG_APP_TUYA 或 CONFIG_MESH_MODEL 编译开关选择云平台;经典 BLE 路径依赖涂鸦私有协议栈与 mbedtls 加密组件;Mesh 路径直接使用标准/厂商模型与平台网关通信。两条路径共享底层的 btstack 蓝牙协议栈,但协议数据面完全隔离——这正是 SDK 将云协议做在 third_party_profile 目录、以条件编译隔离的原因,避免不同云协议互相干扰。

涂鸦 BLE 应用内部结构

flowchart TD
    subgraph sg_TuyaApp["Tuya 应用 (CONFIG_APP_TUYA)"]
        SM["tuya_state_machine<br/>APP_STA_* 状态机"]
        Start["tuya_app_start<br/>时钟/蓝牙/按键初始化"]
        Power["tuya_set_soft_poweroff<br/>先断链再关机"]
        Hci["tuya_bt_hci_event_handler<br/>HCI 事件透传"]
        Gatt["tuya_att_read/write_callback<br/>ATT 读写回调"]
        Adv["广播/扫描应答<br/>tuya_adv_data / EIR_TAG_STRING"]
        Conn["连接参数更新<br/>tuya_connection_param_table"]
    end

    SM -->|"APP_STA_START<br/>ACTION_TUYA"| Start
    Power -->|"btstack_ble_exit(0)"| Hci
    Start --> Adv
    Start --> Conn
    Gatt -->|"数据加密/解密"| TuyaStack
    TuyaStack --> MbedTLS

状态机驱动是整个涂鸦应用的骨架:系统启动后 app_main 以 ACTION_TUYA 意图拉起应用,APP_STA_START 分支完成时钟、蓝牙、按键初始化;运行期的事件(电源、HCI、ATT 读写)通过独立回调分发。关机流程刻意设计为"先断蓝牙链路、延时再软关机",避免链路超时导致关机动作被阻塞,这是低功耗产品常见的时序坑。

涂鸦(Tuya)经典 BLE 接入详解

编译开关与工程约束

涂鸦应用以条件编译方式挂接在 spp_and_le 工程中,app_tuya.c 顶部有如下强制校验:

#if CONFIG_APP_TUYA

#if !(TCFG_USER_BLE_ENABLE && (!TCFG_USER_EDR_ENABLE))
#error "board config error, confirm!!!!!!"
#endif

来源:app_tuya.c

设计意图:涂鸦协议走 BLE GATT 通道,要求板级配置只开 BLE、关闭经典蓝牙(EDR)。该 #error 在编译期兜底,防止开发者误配导致运行时协议错乱。应用主入口 app_main.c 中,TUYA_DEMO_EN 负责创建涂鸦任务线程,CONFIG_APP_TUYA 则决定应用意图(intent):

#if (TUYA_DEMO_EN)
    {"user_deal",           2,     0,   512,   512  },//定义线程 tuya任务调度
#endif
...
#elif CONFIG_APP_TUYA
    it.name = "tuya";
    it.action = ACTION_TUYA;

来源:app_main.c、app_main.c

user_deal 线程(优先级 2,栈 512 字节)是涂鸦任务调度线程;ACTION_TUYA 意图让应用状态机知道当前应进入涂鸦模式。

应用状态机与启动流程

tuya_state_machine() 实现标准 struct application 状态机回调,覆盖创建/启动/暂停/恢复/停止/销毁六态。关键在 APP_STA_START 分支:只有收到 ACTION_TUYA 意图才真正启动涂鸦应用:

static int tuya_state_machine(struct application *app, enum app_state state, struct intent *it)
{
    switch (state) {
    case APP_STA_CREATE:
        break;
    case APP_STA_START:
        if (!it) {
            break;
        }
        switch (it->action) {
        case ACTION_TUYA:
            tuya_app_start();
            break;
        }
        break;
    ...
    return 0;
}

来源:app_tuya.c

tuya_app_start() 完成三类初始化:系统时钟切换到蓝牙正常工作频率 BT_NORMAL_HZ 并配置 PLL;启动 BLE 协议栈(btstack_ble_start_before_init + btstack_init);使能按键消息 sys_key_event_enable(),为后续配网/恢复出厂等交互做准备:

static void tuya_app_start()
{
    log_info("-----------tuya demo----------------");
    clk_set("sys", BT_NORMAL_HZ);

#if TCFG_USER_BLE_ENABLE
    u32 sys_clk =  clk_get("sys");
    bt_pll_para(TCFG_CLOCK_OSC_HZ, sys_clk, 0, 0);
    btstack_ble_start_before_init(NULL, 0);
    btstack_init();
#endif
    /* 按键消息使能 */
    sys_key_event_enable();
}

来源:app_tuya.c

电源事件与软关机时序

涂鸦设备常需要远程关机能力。tuya_set_soft_poweroff() 的实现体现了一个重要时序约束:必须先主动断开蓝牙链路,否则关机会被链路超时阻塞:

static void tuya_set_soft_poweroff(void)
{
    log_info("set_soft_poweroff\n");
    is_app_tuya_active = 1;
    //必须先主动断开蓝牙链路,否则要等链路超时断开

#if TCFG_USER_BLE_ENABLE
    btstack_ble_exit(0);
    //延时300ms,确保BT退出链路断开
    sys_timeout_add(NULL, power_set_soft_poweroff, WAIT_DISCONN_TIME_MS);
#else
    power_set_soft_poweroff();
#endif
}

来源:app_tuya.c

电源模块产生的事件通过 tuya_power_event_to_user(u8 event) 包装成 SYS_DEVICE_EVENT(DEVICE_EVENT_FROM_POWER)投递到系统事件队列,供应用层统一处理。

GATT 服务与链路参数

tuya_demo.c 是涂鸦 BLE 数据面的核心。它根据涂鸦协议版本选择 MTU:协议版本 0x04 时 ATT 本地 MTU 为 246 字节(配合 ATT_SEND_CBUF_SIZE 246 的发送缓冲),否则退回 23 字节的默认 ATT MTU:

#if (TUYA_BLE_PROTOCOL_VERSION_HIGN == 0x04)
#define ATT_LOCAL_MTU_SIZE    (246)                   //
//ATT缓存的buffer大小,  note: need >= 23,可修改
#define ATT_SEND_CBUF_SIZE        (246)                   //
#else
#define ATT_LOCAL_MTU_SIZE    (23)                   //
#define ATT_SEND_CBUF_SIZE        (246)                   //
#endif

// 广播周期 (unit:0.625ms)
#define ADV_INTERVAL_MIN          (160 * 5)//

来源:tuya_demo.c

连接参数更新是涂鸦设备保活与低功耗的平衡点,tuya_connection_param_table[] 提供三组候选参数(min_interval、max_interval、latency、timeout),按需轮换:

static const struct conn_update_param_t tuya_connection_param_table[] = {
    {16, 24, 10, 600},//11
    {12, 28, 10, 600},//3.7
    {8,  20, 10, 600},
};
#define CONN_PARAM_TABLE_CNT      (sizeof(tuya_connection_param_table)/sizeof(struct conn_update_param_t))

来源:tuya_demo.c

广播数据中包含厂商自定义标签,用于涂鸦 App 识别设备品类:

#define EIR_TAG_STRING   0xd6, 0x05, 0x08, 0x00, 'J', 'L', 'A', 'I', 'S', 'D','K'
static const char user_tag_string[] = {EIR_TAG_STRING};

来源:tuya_demo.c

数据通道通过三个回调挂接:tuya_att_read_callback(读属性)、tuya_att_write_callback(写属性)、tuya_event_packet_handler(链路事件),它们与 tuya_ble_operation 操作表一起构成完整的 GATT Server 服务端。配对安全配置 tuya_sm_init_config 默认关闭自动安全请求(slave_security_auto_req = 0),仅在 PASSKEY_ENABLE 打开时启用展示型 IO 能力。

涂鸦协议栈与加密组件

涂鸦私有协议位于 apps/common/third_party_profile/tuya_protocol/,其 extern_components/mbedtls/ 目录包含 AES、CCM、SHA1、SHA256 四个加密模块,全部以 #if (CONFIG_APP_TUYA) 包裹,仅在涂鸦应用编译时参与构建。AES-CCM 用于涂鸦协议帧的加密与完整性认证,SHA 系列用于设备认证与消息摘要,是云端安全通信的基础。

涂鸦 Mesh 灯示例(TUYA_light.c)

apps/mesh/examples/TUYA_light.c 演示 Mesh 形态的涂鸦设备,通过 CONFIG_MESH_MODEL == SIG_MESH_TUYA_LIGHT 编译开关启用。设备标识由产品 ID 与厂商类别共同构成:

#define TUYA_CATEGORY               0x1011
#define PRODUCT_ID                  'y', 'j', 'f', 's', '5', '0', '6', 'f'
...
#define BT_MESH_VENDOR_MODEL_ID_SRV             0x07D00004  // Tuya vendor model

来源:TUYA_light.c、TUYA_light.c

PRODUCT_ID 是涂鸦云后台分配的产品标识(示例值 yjfs506f),TUYA_CATEGORY 0x1011 标识产品品类。与经典 BLE 路径不同,Mesh 设备通过厂商模型 0x07D00004 与涂鸦网关通信,消息收发走 Mesh 网络而非单点 GATT 连接:

BT_MESH_MODEL_PUB_DEFINE(gen_onoff_pub_srv, tuya_update, 2 + 2);
...
static int tuya_update(struct bt_mesh_model *mod)
{
    log_info("tuya_update, mod = 0x%x", mod);
    return 0;
}

来源:TUYA_light.c、TUYA_light.c

BT_MESH_MODEL_PUB_DEFINE 定义了 Generic OnOff Server 模型的发布上下文,tuya_update 是模型状态变化时的发布回调;涂鸦厂商消息(tuya_vendor_msg)则在独立回调中解析,例如打印接收到的载荷供协议调试。

天猫精灵 AliGenie 与腾讯云 Mesh 示例

Mesh 目录下的 AliGenie_light.c、AliGenie_fan.c、AliGenie_socket.c 分别演示灯、风扇、插座三类设备的语音控制接入,tencent_mesh.c 演示腾讯云(腾讯连连)接入。这两类示例的共同点:

  • 通过标准 Mesh Model(Generic OnOff、Light Lightness 等)暴露设备能力,平台音箱/网关直接以标准模型寻址,无需私有 GATT 通道;
  • 采用"一个文件一个品类"的组织方式,方便按产品线复制改造;
  • 与 TUYA_light.c 一样受 CONFIG_MESH_MODEL 宏约束,同一 SDK 内可多工程并行。

Core Flow

涂鸦 BLE 设备完整交互时序

sequenceDiagram
    participant App as 涂鸦手机 App
    participant BLE as BLE GATT Server (tuya_demo.c)
    participant Stack as tuya_protocol 协议栈
    participant TLS as mbedtls (AES-CCM/SHA)
    participant MCU as 应用层 (app_tuya.c)

    MCU->>MCU: APP_STA_START + ACTION_TUYA
    MCU->>BLE: tuya_app_start() 初始化时钟/BT/按键
    BLE->>BLE: 组装广播数据 (EIR_TAG_STRING) 并广播
    App->>BLE: 扫描发现 → 发起连接
    BLE->>BLE: 连接参数更新 (16/24/10/600)
    App->>BLE: 写配网/控制指令 (ATT Write)
    BLE->>Stack: tuya_att_write_callback → 协议解析
    Stack->>TLS: 解密/校验 (AES-CCM)
    TLS-->>Stack: 明文指令
    Stack-->>MCU: 业务回调 (灯开关/亮度等)
    MCU-->>Stack: 状态上报
    Stack->>TLS: 加密 (AES-CCM)
    TLS-->>Stack: 密文帧
    Stack-->>BLE: 组织响应帧
    BLE-->>App: ATT Notification / Read 响应
    MCU->>MCU: 远程关机: btstack_ble_exit(0)
    MCU->>MCU: 延时 300ms 后 power_set_soft_poweroff()

时序要点:连接建立后先做连接参数协商(tuya_connection_param_table 提供多组可选参数),保证低功耗与吞吐的平衡;业务数据一律经涂鸦协议栈加密封装后才走 ATT 通道;关机路径刻意先断链再延时关机,避免链路超时阻塞软关机。

Configuration Options

云平台接入的核心配置集中在两个层面:应用级编译开关(app_config.h / 工程 makefile)与板级蓝牙配置(board config)。下表汇总涂鸦接入涉及的关键宏:

配置项类型默认/典型值说明
CONFIG_APP_TUYA宏开关0/1启用涂鸦应用;为 1 时 app_main 以 ACTION_TUYA 拉起涂鸦应用
TUYA_DEMO_EN宏开关0/1创建 user_deal 线程(优先级 2,栈 512B)用于涂鸦任务调度
TCFG_USER_BLE_ENABLE板级宏1(涂鸦必选)使能 BLE;涂鸦模式强制要求为 1
TCFG_USER_EDR_ENABLE板级宏0(涂鸦必选)关闭经典蓝牙;涂鸦模式强制要求为 0,否则编译报错
TUYA_BLE_PROTOCOL_VERSION_HIGN宏0x04涂鸦协议版本;0x04 时 ATT MTU 提升到 246 字节
ATT_LOCAL_MTU_SIZE宏246 / 23ATT 本地 MTU 大小,需 ≥ 23
ATT_SEND_CBUF_SIZE宏246ATT 发送缓冲大小
ADV_INTERVAL_MIN宏160 * 5 (0.625ms/单位)广播周期
PASSKEY_ENABLE宏0配对 passkey 使能;为 1 时使用 IO_CAPABILITY_DISPLAY_ONLY
CONFIG_MESH_MODEL宏SIG_MESH_TUYA_LIGHT 等Mesh 形态云接入:SIG_MESH_TUYA_LIGHT(涂鸦灯)、AliGenie 灯/风扇/插座、腾讯云
TUYA_CATEGORY宏0x1011涂鸦产品品类标识
PRODUCT_ID字符数组'y','j','f','s','5','0','6','f'涂鸦云后台产品 ID(示例值,需替换为实际产品)
tuya_connection_update_enable静态变量1连接参数更新使能(0=disable,1=enable)

Mesh 形态(涂鸦灯/AliGenie/腾讯云)的模型选择通过 CONFIG_MESH_MODEL 决定,各示例文件顶部均有 #if (CONFIG_MESH_MODEL == XXX) 条件编译保护,避免多模型同时编译冲突。

API Reference

以下为涂鸦 BLE 应用对外暴露的核心接口(均位于 app_tuya.c / tuya_demo.c,CONFIG_APP_TUYA 保护内)。

tuya_state_machine(struct application *app, enum app_state state, struct intent *it): int

应用状态机回调,由 application 框架驱动。APP_STA_START 且 it->action == ACTION_TUYA 时调用 tuya_app_start()。

参数:

  • app(struct application *):当前应用实例
  • state(enum app_state):目标状态,取值 APP_STA_CREATE/START/PAUSE/RESUME/STOP/DESTROY
  • it(struct intent *):启动意图,携带 ACTION_TUYA

返回: 0(成功)

tuya_app_start(void): void

涂鸦应用启动入口:设置系统时钟为 BT_NORMAL_HZ、配置蓝牙 PLL、启动 BLE 协议栈(btstack_ble_start_before_init + btstack_init)、使能按键消息。

tuya_set_soft_poweroff(void): void

软件关机。BLE 使能时先调用 btstack_ble_exit(0) 断开链路,再通过 sys_timeout_add 延时 WAIT_DISCONN_TIME_MS(300ms)后执行 power_set_soft_poweroff(),防止链路超时阻塞关机。

tuya_power_event_to_user(u8 event): void

将电源事件包装为 SYS_DEVICE_EVENT(DEVICE_EVENT_FROM_POWER)投递到系统事件队列,供应用统一处理。

tuya_att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size): uint16_t

GATT 属性读回调,处理 App 对特征值的读取请求(如设备信息、状态读取)。

tuya_att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size): int

GATT 属性写回调,是控制指令(配网、开关、亮度等)进入涂鸦协议栈的入口。数据经 tuya_protocol 解密校验后分发给业务逻辑。

tuya_event_packet_handler(int event, u8 *packet, u16 size, u8 *ext_param): int

BLE 链路事件处理器(连接/断开/MTU 更新等),用于驱动连接状态机与重连逻辑。

tuya_update(struct bt_mesh_model *mod): int(Mesh 形态)

Mesh 模型发布回调,模型状态变化时触发,将最新状态发布到 Mesh 网络。

Failure Modes、边界情况与并发

板级配置错误(编译期)

app_tuya.c 顶部 #if !(TCFG_USER_BLE_ENABLE && (!TCFG_USER_EDR_ENABLE)) #error 强制涂鸦模式必须"仅 BLE、无 EDR"。若开发者在其他工程中启用 CONFIG_APP_TUYA 而板级配置不符,编译直接失败,避免运行期协议错乱。

软关机阻塞(时序依赖)

直接调用 power_set_soft_poweroff() 而不先断开 BLE 链路,系统会等待链路超时(数秒级)才完成关机,表现为"关机慢/卡死"。SDK 通过 btstack_ble_exit(0) + 300ms 延时解决,移植时不可删减该时序。

MTU 与协议版本不匹配

TUYA_BLE_PROTOCOL_VERSION_HIGN == 0x04 时 MTU 提升到 246;若涂鸦云/App 端协议升级而固件未同步,或对端设备不支持长包,可能出现写入分片/丢帧。ATT_SEND_CBUF_SIZE 需保持 ≥ MTU 且 ≥ 23。

连接参数协商失败

tuya_connection_param_table 提供三组参数(如 {16,24,10,600}),若对端拒绝全部参数,tuya_connection_update_enable 可置 0 关闭更新请求,退回链路默认参数;此时功耗与吞吐可能劣化,属可接受的降级路径。

并发与任务隔离

涂鸦任务调度运行在 user_deal 线程(优先级 2,栈 512B),与蓝牙协议栈任务、系统事件任务并行。ATT 回调(tuya_att_read/write_callback)运行在蓝牙栈上下文,不能在其中执行阻塞操作或直接调用协议栈重入函数;业务处理应投递到 user_deal 线程串行执行,避免栈溢出与竞态。tuya_sm_init_config 默认关闭自动安全请求,规避配对流程对链路的抢占式打断。

多模型编译冲突(Mesh 形态)

各 Mesh 云示例均以 CONFIG_MESH_MODEL == XXX 条件编译隔离,同时使能多个模型会导致模型 ID 冲突或内存膨胀;一个工程应只选一个目标平台的模型配置。

Usage Examples

接入涂鸦云的最小工程配置

以 spp_and_le 工程为模板,完成以下三步即可将设备接入涂鸦云:

  1. 板级配置:确保 TCFG_USER_BLE_ENABLE = 1 且 TCFG_USER_EDR_ENABLE = 0;
  2. 应用开关:CONFIG_APP_TUYA = 1、TUYA_DEMO_EN = 1;
  3. 产品信息:将 PRODUCT_ID 替换为涂鸦 IoT 平台为产品分配的 ID。

应用启动后,app_main.c 根据 CONFIG_APP_TUYA 生成涂鸦意图:

#elif CONFIG_APP_TUYA
    it.name = "tuya";
    it.action = ACTION_TUYA;

来源:app_main.c

定制连接参数

设备对功耗敏感时,可调整 tuya_connection_param_table 的候选参数组(单位:连接间隔 1.25ms、超时 10ms):

static const struct conn_update_param_t tuya_connection_param_table[] = {
    {16, 24, 10, 600},//11
    {12, 28, 10, 600},//3.7
    {8,  20, 10, 600},
};

来源:tuya_demo.c

三组参数由 tuya_connection_update_enable 与连接状态共同驱动轮换:第一组适合活跃交互(间隔小、吞吐高),后两组逐步放宽间隔降低功耗。修改时需保证 min_interval ≤ max_interval,且超时满足蓝牙规范(timeout > max_interval 的若干倍)。

远程关机调用

应用收到云端关机指令后,调用软关机接口即可安全断电:

static void tuya_set_soft_poweroff(void)
{
    log_info("set_soft_poweroff\n");
    is_app_tuya_active = 1;
    //必须先主动断开蓝牙链路,否则要等链路超时断开
#if TCFG_USER_BLE_ENABLE
    btstack_ble_exit(0);
    sys_timeout_add(NULL, power_set_soft_poweroff, WAIT_DISCONN_TIME_MS);
#else
    power_set_soft_poweroff();
#endif
}

来源:app_tuya.c

Mesh 涂鸦灯模型定义

Mesh 形态下,用标准宏声明模型与发布上下文,并绑定更新回调:

#define TUYA_CATEGORY               0x1011
#define PRODUCT_ID                  'y', 'j', 'f', 's', '5', '0', '6', 'f'
...
BT_MESH_MODEL_PUB_DEFINE(gen_onoff_pub_srv, tuya_update, 2 + 2);
...
#define BT_MESH_VENDOR_MODEL_ID_SRV             0x07D00004  // Tuya vendor model

来源:TUYA_light.c、TUYA_light.c、TUYA_light.c

BT_MESH_MODEL_PUB_DEFINE 的第三个参数(2 + 2)是发布消息缓冲区大小(字节),需按实际消息负载调整。

Performance 与运维建议

  • 广播与扫描应答:tuya_adv_data / tuya_scan_rsp_data 各 31 字节上限,广播周期 ADV_INTERVAL_MIN = 160*5(单位 0.625ms,约 500ms 周期),兼顾被发现速度与功耗;需要更快配网时可缩短周期,代价是平均电流上升。
  • MTU 与吞吐:协议版本 0x04 下 246 字节 MTU 显著减少 OTA/大数据上报的分片次数;ATT_SEND_CBUF_SIZE 必须 ≥ MTU。
  • 加密开销:涂鸦协议每帧经 AES-CCM 加解密,CPU 负载与帧长成正比;clk_set("sys", BT_NORMAL_HZ) 保证蓝牙工作频率,避免低速时钟下加密超时。
  • 日志分级:app_tuya.c 启用 LOG_ERROR/DEBUG/INFO_ENABLE,量产固件建议关闭 LOG_DEBUG_ENABLE 与 LOG_DUMP_ENABLE 以减小镜像与日志输出开销。
  • Mesh 选型:灯/插座等节点密集场景优先 Mesh 形态(一个网关管理多设备);单设备直连场景用经典 BLE 形态,协议栈更轻、无 Mesh 配网依赖。

Extension Points

  • 新增云平台:在 apps/common/third_party_profile/ 下按 tuya_protocol 的结构新建协议目录,并在 app_main.c 意图分发处追加 #elif CONFIG_APP_XXX 分支,与应用状态机(仿 tuya_state_machine)对接。
  • 自定义 GATT 服务:修改 tuya_demo.c 中的 tuya_att_read/write_callback 与 tuya_ble_operation 操作表,可增减特征值、调整 UUID 与权限;注意保持与涂鸦协议帧格式兼容。
  • 连接参数自适应:根据 RSSI/电量动态切换 tuya_connection_param_table 组号,可实现"强信号低延迟、弱信号保连接"的自适应策略。
  • Mesh 品类扩展:复制 AliGenie_light.c 模板,替换 Mesh 模型(如增加 Light CTL、Sensor 模型)与 CONFIG_MESH_MODEL 判定即可生成新品类示例。

Related Links

  • 涂鸦 Mesh 灯示例源码 TUYA_light.c
  • 天猫精灵灯示例源码 AliGenie_light.c
  • 天猫精灵风扇示例源码 AliGenie_fan.c
  • 天猫精灵插座示例源码 AliGenie_socket.c
  • 腾讯云 Mesh 示例源码 tencent_mesh.c
  • 涂鸦 BLE 应用入口 app_tuya.c
  • 涂鸦 BLE GATT Demo tuya_demo.c
  • 应用主入口 app_main.c
  • 涂鸦协议栈目录 tuya_protocol

相关能力说明:BLE/Mesh 协议栈底层、GATT 通用服务框架与 RCSP 私有协议请参见对应目录的专项文档;涂鸦加密组件(mbedtls AES/CCM/SHA)的实现细节见 apps/common/third_party_profile/tuya_protocol/extern_components/mbedtls/。

Prev
2.4G 私有协议与 Dongle 示例
Next
HID 人机交互应用框架