蓝牙 Mesh 照明产品 SDK 和 Demo

本文介绍了适用于蓝牙 mesh 照明类产品的相关 Demo 说明,芯片平台基于Telink TLSR825x,介绍了如何搭建调试环境以及产品开发的相关注意事项。

下图为照明类产品的开发框架:

image20201119_144947.png

注意事项

DP 介绍

蓝牙 mesh 标准命令

对于蓝牙 mesh 标准命令,涂鸦会视为自定义命令。但应用和网关与设备进行通信时,会将自定义命令转换为蓝牙 mesh 标准命令。

说明:蓝牙 mesh 标准 DP 接口函数为 void tuya_mesh_data_recv_callback(uint16_t src_addr, uint16_t dst_addr, uint32_t opcode, uint8_t *data, uint16_t data_len, uint8_t ttl)。蓝牙 mesh 标准命令的使用,请参考 Mesh Model Specification

涂鸦定义 mesh 定义 名称
1 Generic OnOff(0x0282) 开关
3 Light Lightness Actual(0x4c82) 亮度值
4 Light CTL Temperature(0x6482) 冷暖值
5 Light HSL(0x7682) 彩光

涂鸦定义命令

涂鸦定义 DP 名称 含义
2 模式 用于切换灯的工作模式,例如白光、彩光、场景、音乐律动等
6 场景 1. 涂鸦自定义场景
2. 可增加最多至8个场景
3. 每个场景至多8个单元
4. 模式:静态、渐变、跳变
7 倒计时 1. 仅支持本地倒计时开关
2. 断电或App操作开关后即失效
8 音乐律动 App依据音乐将HSV发送给设备端执行
33 断电记忆 1. 开启和关闭断电记忆
2. 开启后可选择以下三种模式
0x00 初始默认值
0x01 恢复记忆值
0x02 用户定制(HSVBT)
34 通电勿扰 1. 开启和关闭通电勿扰
2. 开启后,在关灯5s后,首次上电不会亮灯,5s内再次上电才会亮灯
3. 用于有经常断电风险的地区
100-200 自定义DP 用户自定义DP功能可在此范围内增加自己自定义功能

说明:特殊DP介绍,因为 6 场景和 8 音乐律动的原始协议过长,不适合蓝牙 mesh 使用,因此涂鸦在应用和网关层压缩了协议。当设备收到此DP后,需要进行解压协议才能使用,BLE 模组 SDK已全部实现。

场景DP

原始数据(与 Wi-Fi 通信场景数据一致):

音乐律动DP

原始数据(与 Wi-Fi 通信场景数据一致):

遥控器命令

遥控器控制DP接口函数为 void ty_light_remote_dp_data(u8 * par, int par_len)

涂鸦命令 涂鸦名称 含义
0x81 订阅遥控器 1. 将设备添加入遥控器的群组
2. 订阅完成后,遥控器可以控制该灯
0x83 亮度 遥控器控制灯的亮度
0x87 喜好收藏 1. 喜好收藏:收到该命令时设备将当前的状态记录下来,形成一个喜好组并收藏
2. 喜好执行:收到该命令时设备取出之前收藏的喜好组,并将设备状态切换为收藏的状态

文件说明

从 GitHub 获取到 SDK 和 Demo 后,tuya_smesh_sdk_tlsr825x_light 开发包中的文件及相关介绍如下:

文件名 文件介绍 注意事项
app_common.c 常用功能,app初始化、运行,处理mesh网络DP数据 最主要的c文件
app_factory_test.c 产测相关程序 运行的是涂鸦标准的产测,如无特殊情况,不要改动
app_light_cmd.c 灯光功能命令设置和读取 设置(读取)灯的模式、亮度、色温等一系列功能
app_light_control.c 灯光控制及保存参数 根据模式控制灯,依据app_light_cmd.c里函数设置下来的参数控制灯的运行
app_light_prompt.c 应用程序指示灯提示 主要用于放置灯未配网的提示
app_light_uart.c 串口灯应用 对 app_uart.c 里面的数据内容进行进一步解析,主要是串口灯应用部分,具体协议参考<通用串口灯协议文档.md>
app_rssi.c 产测相关,检测 dongle 的rssi 检测 dongle 的信号强度,确认是否需要进入产测
app_uart.c 通用串口协议和产测协议数据初始化、处理 用于烧录授权信息,客户也可以用于与MCU交互
tuya_node_init.c mesh 网络参数初始化,设置或读取 mesh 相关配置值,如能力值、pid等 运行的是涂鸦标准的初始化,如无特殊情况,不要改动
ty_fifo.h fifo输入输出组件 由上层UART调用
ty_gpio_base_test.h 模块gpio测试组件
ty_light_basis_hw_timer.h 硬件定时器组件 10ms 中断处理灯的渐变
ty_light_basis_sw_timer.h 事件回调组件 由 ty_light_basis_sw_timer_start 调用
ty_light_basis_soc_gpio.h IO口的初始化,读写组件 将平台上的1、2、3等映射到正真的 GPIO 上
ty_light_basis_tools.h 常用工具组件
ty_light_cfg.h 灯类 json 数据初始化组件
ty_light_driver_set.h 灯类驱动设置:PWM 或 I2C(两款驱动芯片)组件 对外是 ty_ty_light_driver_set_rgbcw,直接控制 rgbcw 的值(0-20000)
ty_light_gradual.h 灯光渐变组件
ty_light_json.h json文件读取组件
ty_light_mdev.h 整灯产测(含老化等)组件
ty_light_remote.h 遥控器控制组件
ty_light_save.h 灯功能数据存储组件
ty_nv.h 底层flash存储组件
ty_light_sence.h 场景灯光控制组件
ty_rssi_base_test.h 底层rssi测试程序组件
ty_string_op.h 字符串、十六进制等相互转换程序组件
ty_timer_event.h 定时器任务初始化、运行、添加、删除功能程序组件 对外接口是 ty_timer_event_add
return 0:循环执行
return -1:停止执行
return 正数:更新时间后继续执行
ty_uart_cmd_sever_for_factory_test.h 产测相关协议底层处理组件

重点函数介绍

文件名 函数名 函数作用 备注
app_common.c void mesh_app_init(void) 用于应用层逻辑的初始化
app_common.c void mesh_main_run(void) 用于应用层逻辑的周期性执行
app_common.c void mesh_factory_reset(void) 设备被重置前会调用该函数,用于应用层在设备重置时清空一些应用层级别的 flash 数据
app_common.c void app_tuya_mdev_test(uint8_t is_Authorized, uint8_t rssi) 烧录授权时的产测回调函数,一般不要改,不要动
app_common.c void mesh_state_callback(mesh_state_t stat) 各种mesh状态发生变化时,会调用该函数,通知给应用层(看 mesh_state_t 可知道有哪些信息会上报)
app_common.c void tuya_mesh_data_recv_callback(uint16_t src_addr, uint16_t dst_addr, uint32_t opcode, uint8_t *data, uint16_t data_len, uint8_t ttl) 手机 -> 设备的数据回调函数(非常重要)
src_addr[in]:数据源地址
dst_addr[in]:数据目的地址
opcode[in]:命令字
data[in]:数据指针
data_len[in]:数据长度
ttl[in]:数据剩余转发次数
app_common.c void mesh_oem_config_init(void) 读取flash或json配置文件
app_light_control.c OPERATE_LIGHT app_light_ctrl_proc(void) 灯控制函数
app_light_control.c void app_light_ctrl_loop(void) 在void mesh_main_run(void)中运行,定时调度灯控任务
app_light_control.c OPERATE_LIGHT app_light_real_time_ctrl_proc(void) 实时控灯,用于音乐律动
app_light_prompt.c void app_light_ctrl_prompt_start(void) 配网时指示灯开启
app_light_prompt.c void app_light_ctrl_prompt_stop(void) 配网时指示灯关闭
app_uart.c void app_uart_init(void) 除了串口初始化,还有 FIFO 初始化、存储初始化、产测初始化、与mcu通信初始化
app_uart.c void app_uart_run(void) 是一个 loop 函数,不断执行从串口读取数据,放入 fifo 中 此外还有两个 loop 函数在这个总的 loop 中执行:
app_factory_test_run();
uart_server_run();//解析FIFO中的数据,并调用相应的处理函数
app_uart.c static void app_uart_server_run(void) 按照串口协议解析 FIFO 中的串口数据,获取有效的数据帧,根据数据帧类别,分别送到:
产测数据处理接口app_factory_test_cmd(cmd,&buf[F_DATA],len)
与MCU通信的串口对接数据处理接口ty_uart_cmd_server.receive_cmd(u8 cmd, u8 fur, u8 *para, u8 len)
HEAD中是A5 5A表示是 MCU发来的数据。是66 AA表示是产测上位机发来的数据。
app_uart.c int app_mesh_uart_write(u8 fur, u8 *params, u8 len) 将mesh网络中灯的命令或信息发送给MCU 是否发送取决于
ty_uart_cmd_server_get_txtomcu_flag()
MCU发送命令给BT设置
ty_uart_cmd_server_set_txtomcu_flag(bool flag)
app_uart.c void app_mesh_uart_upload(u8 *params, u8 len, u8 is_group) MCU透传DP数据
app_uart.c void app_mesh_uart_read(u8 fur, u8 *params, u8 len) MCU读取灯功能信息、场景ID、完整场景、倒计时、mesh状态
app_uart.c void app_mesh_uart_ctl(u8 fur, u8 *params, u8 len) MCU控制灯功能、场景ID、完整场景、倒计时,BT重置
tuya_sigmesh_hal.c void tuya_mesh_node_init(node_info_t *node_info) mesh 节点初始化,相关能力的配置,node_info[in]:节点能力设置 设备初始化流程,必须调用
tuya_sigmesh_hal.c void tuya_mesh_data_send(uint16_t src_addr, uint16_t dst_addr, uint32_t opcode, uint8_t *data, uint16_t data_len, uint16_t appkey_idx, uint8_t is_rsp) mesh 数据发送 API
src_addr[in]:数据源地址
dst_addr[in]:数据目的地址
opcode[in]:命令字
data[in]:数据指针
data_len[in]:数据长度
appkey_idx[in]:使用的app_key
is_rsp[in]:是否status回复
tuya_sigmesh_hal.c void tuya_primary_ele_addr_set(uint16_t addr, int save) 设置设备的 unicast addr
addr[in]:设备地址
save[in]:是否flash记忆
tuya_sigmesh_hal.c uint16_t get_primary_ele_addr(void) 获取设备的 unicast addr
tuya_sigmesh_hal.c void tuya_mesh_devkey_set(uint8_t *key) 主动更新设备的devkey
tuya_sigmesh_hal.c void tuya_mesh_network_reset_with_restore(uint16_t restore_time_s) 将设备移除网络并恢复到配网状态,且配置超时时间,超时后恢复到移除前的网络
tuya_sigmesh_hal.c void tuya_mesh_rf_power_set(TUYA_RF_Power level) 设置发射功率
tuya_sigmesh_hal.c void tuya_mesh_uuid_set(uint8_t *uuid) uuid 更新接口
tuya_sigmesh_hal.c void tuya_gatt_adv_beacon_enable(uint8_t enable) 广播 beacon 使能
tuya_sigmesh_hal.c uint8_t get_if_prov_success(void) 获取设备配网状态
fast_provision_model.c int mesh_reset_network(u8 provision_enable, u16 recover_time_s) 将设备移除网络并恢复到配网状态
tuya_node_init.c void tuya_pid_set(uint8_t *pid) PID 更新接口,不调用则默认用授权的PID 8字节长度的PID字符串
tuya_node_init.c void app_tuya_mesh_category_set(uint16_t mesh_category) mesh 设备能力值配置
hal_hw_timer.c OPERATE_LIGHT ty_light_basis_hw_timer_start(IN u32 uiCycleUs, IN void* pCallback) 硬件定时任务,用于灯光渐变任务
hal_hw_timer.c OPERATE_LIGHT ty_light_basis_hw_timer_stop(void) 关闭硬件定时任务,用于灯光渐变任务
ty_light_basis_sw_timer.c OPERATE_LIGHT ty_light_basis_sw_timer_start(IN u8 ucTimerID, IN u32 uiCycleMs, IN void* pCallback); 软件定时任务,用于灯光控制任务
ty_light_basis_sw_timer.c OPERATE_LIGHT ty_light_basis_sw_timer_stop(IN u8 ucTimerID); 关闭软件定时任务,用于灯光控制任务
ty_light_basis_sw_timer.c void ty_light_basis_sw_timer_handler(void); 处理定时任务
ty_light_driver_set.c OPERATE_LIGHT ty_light_driver_set_init(IN DRIVER_CONFIG_T *pLightConfig); 灯驱动初始化,有三种模式:
PwmInit
Sm2135Init
tSm16726bInit
ty_light_gradual.c void ty_light_gradual_hw_timer_handler(void); 灯光渐变定时任务
ty_light_remote.c void ty_light_remote_dp_data(u8 * par, int par_len); 遥控器DP控制处理
ty_light_scene.c void ty_light_scene_cmd_sync(u8 uint_num) 场景同步
ty_light_scene.c void ty_light_scene_ctrl_change_start(IN u32 uiChangeTimeMs) 定时时间后开始场景改变
ty_light_scene.c OPERATE_LIGHT ty_light_scene_ctrl_change(OUT bool *pCycleEnable, OUT u32 *pCycleTimeMs) 将场景控制信息转变为RGBCW所需的值

JSON 使用介绍

涂鸦已提供基础 JSON 模板参考:

类别 JSON 名 名称 客户需改动 含义
json head name 固件标识名 1.首先在涂鸦平台创建固件标识名
2.上传的固件名称与涂鸦平台一致
json head description 配置功能 仅用于描述该固件
json head version 固件版本 形式x.x
json head ic 芯片型号 tlsr825x
json head hardware 硬件模块 TYBT3L
json head log 打印调试信息 1.调试是可以为1,将log信息输出
2.成品固件必须设置为0
json head oem 固件形式 必须为0
json head json_config JSON 可配 必须为0
json head kind 设备能力 默认即可
json head pid pid名称 填写产品pid
json head vendorid 品类信息 1.一路灯:1011
2.两路灯:1012
3.三路灯:1013
4.四路灯:1014
5.五路灯:1015
power_reset_cnt 复位次数 默认即可,因为灯不采用此位置的值,而是采用rstnum
power_reset_time 重置时间 上电后N久断电,判断为一次通断电,默认设置为5s
power_reset_recover_time 网络恢复时间 通断电重置之后,在不重新配网或不通断电的情况下,多久恢复网络,默认为600s
local_control 本地控制 默认即可
功能宏 light_cfg_init_param_check 初始化参数检验 默认即可,默认为0
功能宏 light_cfg_prod_driver_need_init 产测参数重新初始化 默认即可,默认为0
功能宏 light_cfg_3in1_save 保存方式 默认即可,默认为0
功能宏 light_cfg_remote_enable 是否支持mesh遥控器 0:不支持
1:支持
功能宏 light_cfg_uart_enable 是否支持灯型串口 0:不支持
1:支持
具体协议参考<通用串口灯协议文档.md>
Jsonver JSON 配置版本 默认即可
category 设备类型 与vendorid保持一致
module 模块选型 1,BT8C
2.非BT8C模块填BT3L
cmod 方案选型 1.一路灯:c
2.两路灯:cw
3.三路灯:rgb
4.四路灯:rgbc
5.五路灯:rgbcw
dmod 产品驱动方式 0:PWM驱动
1:SM16726B
2:SM2135E
cwtype 色温调节驱动方式 0:CW - 冷光、暖光
1:CCT - 亮度、色温
onoffmode 开关渐变 0:开关时有渐变
1:开关时无渐变
pmemory 断电记忆 0:无断电记忆
1:有断电记忆
defcolor 常亮默认颜色 彩光可选:r、g、b
白光可选:c
defbright 常亮默认亮度 范围:10~100
deftemp 常亮默认色温 defcolor为c时有效
范围:0~100
cwmaxp 冷暖混色最大功率 默认为100
范围:100~200,间距:10
brightmin 白光亮度最小值 范围:1~100,间距:1
brightmax 白光亮度最大值 范围:1~100,间距:1
colormin 彩光亮度最小值 范围:1~100,间距:1
colormax 彩光亮度最大值 范围:1~100,间距:1
wfcfg 首次配网触发方式 spcl:手动切换后闪烁
spcl_auto:上电闪烁后常亮
remdmode 配网提醒方式 0:呼吸提醒
1:闪烁提醒
rstmode 触发配网方式 默认为0
rstnum 通断电复位次数 范围:3~10,间距:1
rstcor 配网时提醒颜色 彩光可选:r、g、b
白光可选:c
rstbr 配网时提醒亮度 范围:10~100
rsttemp 配网时提醒色温 rstcor为c时有效
范围:0~100
pairt 配网提醒的时间 范围:6~600
注:呼吸提醒时,时间建议为6
注:呼吸提醒时,时间建议为6,呼吸期间会暂停配网
prodagain 重复进入产测1 0:不支持
1:支持
cagt 产测1白光老化时间 单位分钟
wt 产测1暖光老化时间 单位分钟
rgbt 产测1彩光老化时间 单位分钟
colorpfun 彩光混光功率限制 0:不限制
1:限制
colormaxp 彩光混光最大功率 范围:100-200
notdisturb 勿扰模式 0:关闭
1:开启
PWM pmwhz PWM 频率 范围:500~20000;间距:100
PWM r_pin/g_pin/
b_pin/c_pin/
w_pin
rgbcw引脚 填写0~14,引脚对应关系如下
0:GPIO_PB1
1:GPIO_PB7
2:GPIO_PB5
3:GPIO_PB4
4:GPIO_PA0
6:GPIO_PC0
7:GPIO_PC2
8:GPIO_PC3
9:GPIO_PD2
10:GPIO_PD7
11:GPIO_PC4
12:GPIO_PB0
13:GPIO_PC5
14:GPIO_PC1
PWM r_lv/g_lv/
b_lv/c_lv/
w_lv
有效电平 默认为1
所有引脚必须保持一致
1:高电平点亮
0:低电平点亮
IIC芯片驱动 iicr/iicg/iicb
/iicc/iicw
rgbcw通道 配置为01234
IIC芯片驱动 iicscl I2C SCL 管脚号 IIC驱动必填
IIC芯片驱动 iicsda I2C SDA 管脚号 IIC驱动必填
IIC芯片驱动 ctrl_pin 控制引脚 SM16726B必填
IIC芯片驱动 ctrl_lv 电平控制配置 SM16726B必填
1:高电平有效
0:低电平有效
IIC芯片驱动 campere SM2135彩光输出最大电流 sm2135E驱动必填
范围:10~45,间距:5,默认值:20
IIC芯片驱动 wampere SM2135白光输出最大电流 sm2135E驱动必填
范围:10~80,间距:5,默认值:30
crc 校验 无需改动,不校验

调试指南

第一步:环境搭建

本小节以泰凌(Telink)蓝牙芯片为例,介绍如何在 Windows 系统上搭建调试环境。

  1. 访问 Telink 官方文档 IDE for TLSR8 Chips,根据教程安装 Telink IDE。

  2. doc\tools\jq-win64.exe 放入 C:\TelinkSDK\bin\

  3. 将以下路径加入系统环境变量中:

  4. 访问 Telink 官方文档 烧录工具,下载和安装 BDT 烧录工具。

  5. (可选)安装 git-for-win

    注意:如果您不熟悉 Git 的版本控制流程,建议您全部采用默认安装,如果电脑上已经有 git-bash 等可以运行 Shell 脚本的软件,则可以不用安装。

build

  1. (可选)如无 _build 文件,您可以在 common/tools 路径中运行 bash cmake.sh mesh_light tlsr825x_smesh 生成 _build 文件,其中您需要自定义文件名称。

  2. 利用 app/mesh_common/_build 中的 run.sh 脚本,可以实现编译、烧录。

    bash run.sh build/flash [demo.json]

    该脚本会依据 [demo.json] 转变为 _build/base_oem_config.h,其中有大量的宏定义,用于让同一个应用代码,能生成不同的应用程序。例如,您只需要改动生成固件的名字、版本号、PID等信息时,不需要改动代码,只需要改动该 json 配置文件。

$ cd app/mesh_common/_build $ bash run.sh build 5rgbcw_bt3l_pwm_V1.0.json

flash

  1. 将烧写器的SWM引脚与开发板的SWS引脚相连,烧写器通过 USB 连接到电脑上,开发板单独供电并保持共地。

    telink_flash_tools.jpg

  2. 打开 Telink 烧写调试助手 (BTD),选择 8258 芯片,单击 SWS 初始配置烧写器。

    让烧写器可以烧录 8258 型号芯片,往往只需要 SWS 一次即可。

    telink_btd.png

  3. 上面准备工作做好后,可以直接利用 run.sh 将 bin 文件烧录到开发板。

    $ bash run.sh flash 5rgbcw_bt3l_pwm_V1.0.json

    说明run.sh 提供多种能力:build(编译)、flash(烧录)、flash_all(全部擦除后烧录)、clean(清除编译信息)。

申请照明 PID 和授权码

授权码找对应的产品经理,所有设备必须授权才能配网使用。

按以下步骤在涂鸦 IoT 平台上创建产品并获得 PID。完成以下步骤后,PID 的功能才完全实现,否则会出现产品功能不完善的故障。

  1. 登录 涂鸦 IoT 平台,参考 选品类创建产品 创建一款照明产品。

    例如选择光源、蓝牙 Mesh(SIG) 、彩灯五路 (RGBCW)_SIG,输入产品名称,创建产品。

    image.png

  2. 添加功能,确定,App面板配置,选择模板。

    image.png

  3. 硬件调试,选择相应开发模组。

    image.png

  4. 完成产品配置。