更新时间:2024-06-25 06:02:15下载pdf
初始化是指设备上电、启动之后,调用一系列 API,完成设备硬件环境的初始化、TuyaOS 软件的初始化和应用功能初始化等工作。
TuyaOS Bluetooth Mesh SDK 提供多个初始化的接口,不同的初始化 API 被 SDK 调用的时机不同。
OPERATE_RET tuya_init_first(VOID_T);
OPERATE_RET tuya_init_second(VOID_T);
OPERATE_RET tuya_init_third(VOID_T);
OPERATE_RET tuya_init_last(VOID_T);
关于不同初始化接口的差异与使用方法详情,见下表:
API | 接口调用时机 | 适用功能 |
---|---|---|
tuya_init_first | 设备启动,MCU 初始化成功之后 | 对启动时间有要求,要求设备启动后立即做出响应。 |
tuya_init_second | 蓝牙协议栈与 Mesh 协议栈初始化之前 | 蓝牙 LE 与 Mesh 协议栈初始化。 |
tuya_init_third | 蓝牙协议栈与 Mesh 协议栈初始化之后 |
|
tuya_init_last | SDK 初始化最后的时机 | 其他功能。 |
循环任务 API 也就是常说的 loop 函数或者 run 函数,loop 函数会不断被 SDK 内的 while
循环执行。可实现较多功能,例如队列或者事件的处理、软件定时器的处理函数等。
OPERATE_RET tuya_main_loop(VOID_T);
VOID tal_firmware_infor_set(UINT8_T is_key, UINT8_T *product_id, UINT8_T *product_key, UINT16_T version, UINT16_T mesh_category, UINT8_T need_publish_addr);
VOID tal_mesh_factory_firmware_info_set(UINT8_T *firmname, UINT8_T *version);
VOID tal_mesh_gatt_ota_version_set(UINT16_T version);
product_id
与 product_key
为产品信息,通过 is_key
来决定使用 PID 还是固件 Key 来去云端注册设备。
version
:固件版本号,只允许两位版本号即 x.x
。为 ASCII 格式,参考 Demo 值。
mesh_category
:设备能力值,可参考能力地图中 Mesh Category。
need_publish_addr
:设备是否需要 Publish addr,用于本地控制,可用于遥控器或者无线开关等品类。参考能力地图中 Mesh 本地控制与遥控器控制。
firmname
:固件标志名,与涂鸦开发者平台创建时一致,使用涂鸦产测上位机授权时会校验。
typedef VOID (*TAL_LOG_OUTPUT_CB)(IN CONST CHAR_T *str);
OPERATE_RET tal_log_create_manage_and_init(CONST TAL_LOG_LEVEL_E level, CONST INT32_T buf_len, CONST TAL_LOG_OUTPUT_CB output);
支持打印标准的涂鸦日志(Log)发生的时间和位置,支持 Log 等级输出,支持字符串和数据流。
level
:用于定义 Log 输出等级,默认为 TAL_LOG_LEVEL_DEBUG
。
buf_len
:Log 缓存的最大值。
output
:Log 输出的出口函数,在应用层传入。Demo 中默认采用 UART0 串口输出日志。
包括 Element 注册与 Model 注册,Model 需要关联到指定的 Element 中。
OPERATE_RET tal_element_register(USHORT_T element_index);
OPERATE_RET tal_model_register(USHORT_T element_index, UINT_T model_id);
Model 对应的 Model ID 以及数据通信的结构体格式,参考 蓝牙官方 Model 介绍文档,在 tal_bluetooth_mesh_def.h
也有相关的定义与 ID。
照明品类配置
Element index | Model | 说明 |
---|---|---|
0 | Config Model | 用于设备配置功能 |
0 | Generic Onoff Model | 开关 |
0 | Light Lightness Model | 亮度 |
0 | Light CTL Model | 亮度 + 色温 |
0 | Light CTL Tempeture Model | 色温 |
0 | Light Hsl Model | 彩光 HSL 模型 |
0 | Tuya Vendor Model | 涂鸦自定义 Vendor Model |
电工品类配置
Element index | Model | 说明 |
---|---|---|
0 | Config Model | 用于设备配置功能 |
0 | Generic Onoff Model | 开关 1 |
1 | Generic Onoff Model | 开关 2 |
2 | Generic Onoff Model | 开关 3 |
3 | Generic Onoff Model | 开关 4 |
4 | Generic Onoff Model | 开关 5 |
5 | Generic Onoff Model | 开关 6 |
透传类与其他品类配置
Element index | Model | 说明 |
---|---|---|
0 | Config Model | 用于设备配置功能 |
0 | Generic Onoff Model | 用于兼容旧版本协议中的心跳策略 |
0 | Tuya Vendor Model | 涂鸦自定义 Vendor Model |
typedef OPERATE_RET (*tal_mesh_msg_recv_cb)(TAL_MESH_ACCESS_MSG_T *msg_raw, TAL_MESH_NET_PARAM_T *net_param);
OPERATE_RET tal_mesh_msg_recv_cb_init(tal_mesh_msg_recv_cb access_data_cb);
TuyaOS Bluetooth Mesh SDK 中对 Mesh 数据的回调做了统一处理,将多个 Model 数据统一到一个回调数据中处理。在注册的回调中,可以处理注册的所有 Model 中的 Opcode
数据。详细信息,参考 Demo 中回调实现与能力地图中 Mesh DP 控制。
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 tal_uart_init(TUYA_UART_NUM_E port_id, TAL_UART_CFG_T *cfg);
VOID_T tal_uart_rx_reg_irq_cb(TUYA_UART_NUM_E port_id, TAL_UART_IRQ_CB rx_cb);
定时任务除了使用 tal_sw_timer
软定时器外,也可以在 loop 函数中利用系统 tick 或者其他时钟接口,实现定时执行任务。存在一定误差,如果对时间要求精确则需要使用硬件定时器。Demo 示例如下:
UINT32_T time_exceed(UINT32_T ref, UINT32_T span_ms){
return ((tkl_system_get_millisecond() - ref) > span_ms);
}
VOID tuya_main_loop(VOID){
STATIC UINT32_T pre_ms = 0;
if(time_exceed(pre_ms , 1000)){
app_process(); // 定时任务执行函数
pre_ms = tkl_system_get_millisecond();
}
}
参考 Demo 中 OPERATE_RET tuya_firmware_config(VOID_T);
函数实现,通过以下 API 将固件配置写入 SDK 中。宏定义由 IDE 与脚本生成,您可以使用 IDE 配置,也可以替换成固定值。
OPERATE_RET tuya_firmware_config(VOID_T)
{
UINT8_T pid[] = PRODUCTKEY;
UINT8_T firmware_key[] = PRODUCTKEY;
UINT8_T firmware_name[] = BUILD_FIRMNAME;
UINT8_T firmware_version[] = FW_VERSION;
UINT16_T mesh_category = MESH_CATEGORY;
tal_mesh_factory_firmware_info_set(firmware_name, firmware_version);
tal_mesh_gatt_ota_version_set(FW_VERSION_HEX);
tal_firmware_infor_set(IS_FIRMWARE_KEY, pid, firmware_key, FW_VERSION_HEX, mesh_category, NEED_PUBLISH_ADDR);
return OPRT_OK;
}
此函数将固件配置设置到 SDK 中,包括配网信息、授权产测校验信息以及 OTA 版本信息等。函数中的宏定义由 IDE 配置生成。您可以在 TuyaOS IDE 中,选择对应的 application 文件夹,单击右键并选择 Config Project,然后配置固件信息。
当然,用户也可以选择不使用 IDE 配置生成的信息,而是由开发者固定写入,但固件信息的格式需要严格按照 IDE 生成的格式。
Demo 中 Log 默认是关闭的,可以在 tuya_iot_config.h
中修改实现 #define ENABLE_LOG 1
,即可以使用 tal_log
组件中接口输出日志。注意,已经打成 LIB 的组件是没有日志的。如果有问题需要调试,请联系涂鸦开发人员。
另外,原厂 SDK 底层由于是源码开放,Log 可以直接开启。
app_mesh.h
中 LOG_FW_FUNC_EN
宏定义使能,即可开启。EM_platform.h
中 PHY_LOG_EN
宏定义使能,即可开启。TAL_UART_CFG_T tal_uart_cfg = {
.rx_buffer_size = 256,
.open_mode = 0,
.base_cfg = {
#if ENABLE_LOG
.baudrate = 115200, //使用 115200 输出 log,防止 9600 波特率打印 log 阻塞应用
#else
.baudrate = 9600, //注意! 出厂时需使用 9600 波特率,授权上位机默认波特率为 9600
#endif
.parity = TUYA_UART_PARITY_TYPE_NONE,
.databits = TUYA_UART_DATA_LEN_8BIT,
.stopbits = TUYA_UART_STOP_LEN_1BIT,
.flowctrl = TUYA_UART_FLOWCTRL_NONE,
}
};
tal_uart_init(TUYA_UART_NUM_0, &tal_uart_cfg);
tal_uart_rx_reg_irq_cb(TUYA_UART_NUM_0, tuya_uart_irq_rx_cb);
涂鸦产测工具使用 UART 协议,来给设备进行授权与产测。
量产时如果使用涂鸦烧录授权工具,则必须使用 9600 波特率。
STATIC VOID_T tuya_uart_irq_rx_cb(TUYA_UART_NUM_E port_num, VOID_T *buff, UINT16_T len)
{
if(port_num == 0) {
tal_uart_receive_common_data(buff, len);
}
else {
}
}
串口接收回调数据调用 OPERATE_RET tal_uart_receive_common_data(UINT8_T *p_data, UINT16_T len)
传入 SDK 中,产测数据与 SDK 上位机测试的数据将由此进入到 SDK 的对应组件中进行处理。
TuyaOS Bluetooth Mesh SDK 支持使用 Logic 上位机测试,使用串口功能实现蓝牙、Mesh 以及外设的功能测试。
实际产品功能中,可以关闭此功能来节省代码空间,关闭方式:
将 #define TUYA_SDK_TEST 1
修改为 #define TUYA_SDK_TEST 0
,即可关闭原有的串口上位机 SDK 测试功能,将节省大量的代码空间。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈