云平台接入示例
本文档介绍 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 提供了三种典型接入范式:
- 经典 BLE + 涂鸦云:设备以 BLE GATT Server 形态接入涂鸦 App。SDK 通过
CONFIG_APP_TUYA开关将整个应用切换为涂鸦模式,运行独立的涂鸦协议栈(tuya_protocol),并使用 mbedtls 的 AES-CCM/SHA256 做数据加密与完整性校验。 - BLE Mesh + 涂鸦云:设备以 Mesh 节点形态接入,通过涂鸦 Vendor Model(
0x07D00004)与涂鸦网关通信,适用于灯、插座等照明/电工类产品。 - 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;
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
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;
}
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 / 23 | ATT 本地 MTU 大小,需 ≥ 23 |
ATT_SEND_CBUF_SIZE | 宏 | 246 | ATT 发送缓冲大小 |
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/DESTROYit(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 工程为模板,完成以下三步即可将设备接入涂鸦云:
- 板级配置:确保
TCFG_USER_BLE_ENABLE = 1且TCFG_USER_EDR_ENABLE = 0; - 应用开关:
CONFIG_APP_TUYA = 1、TUYA_DEMO_EN = 1; - 产品信息:将
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
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/。