设备初始化

更新时间:2023-12-11 03:22:40下载pdf

初始化是指设备上电、启动之后,调用一系列 API,完成设备硬件环境的初始化、TuyaOS 软件的初始化和应用功能初始化等工作。

API 说明

初始化 API

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 协议栈初始化之后
  • 对于 Mesh 协议栈的状态有依赖,需要获取协议栈内的状态才能初始化的功能。
  • Mesh model 注册。
  • 主要业务功能初始化。
tuya_init_last SDK 初始化最后的时机 其他功能。

循环任务 API

循环任务 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 来去云端注册设备。

    • PID 为涂鸦 IoT 开发平台创建产品时生成的 Product ID。建议使用 Product ID 方式来配置固件。
    • 固件 Key 为创建固件时生成的 8 个字符长度的字符串。使用固件 Key 方式注册可以实现 OEM 方式,但相对较为复杂。即同一个 Key 可以绑定多个 PID,而设备使用哪个 PID 则是由下单时授权码中绑定的 PID 决定的。通用授权码中无 PID 信息,无法使用 Key 注册方式。
  • version :固件版本号,只允许两位版本号即 x.x。为 ASCII 格式,参考 Demo 值。

  • mesh_category:设备能力值,可参考能力地图中 Mesh Category

  • need_publish_addr:设备是否需要 Publish addr,用于本地控制,可用于遥控器或者无线开关等品类。参考能力地图中 Mesh 本地控制与遥控器控制

  • firmname:固件标志名,与涂鸦 IoT 开发平台创建时一致,使用涂鸦产测上位机授权时会校验。

LOG 初始化

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 串口输出日志。

Mesh 节点初始化

包括 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

Mesh 数据接收初始化

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 控制。

蓝牙 LE 数据回调注册

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);

使用说明

循环 API 定时执行任务

定时任务除了使用 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;
}

设备固件信息 IDE 配置

此函数将固件配置设置到 SDK 中,包括配网信息、授权产测校验信息以及 OTA 版本信息等。函数中的宏定义由 IDE 配置生成。您可以在 TuyaOS IDE 中,选择对应的 application 文件夹,单击右键并选择 Config Project,然后配置固件信息。

设备初始化

设备初始化

当然,用户也可以选择不使用 IDE 配置生成的信息,而是由开发者固定写入,但固件信息的格式需要严格按照 IDE 生成的格式。

Log 开启与关闭

Demo 中 Log 默认是关闭的,可以在 tuya_iot_config.h 中修改实现 #define ENABLE_LOG 1,即可以使用 tal_log 组件中接口输出日志。注意,已经打成 LIB 的组件是没有日志的。如果有问题需要调试,请联系涂鸦开发人员。

另外,原厂 SDK 底层由于是源码开放,Log 可以直接开启。

  • TLSR825x 平台将 app_mesh.hLOG_FW_FUNC_EN 宏定义使能,即可开启。
  • PHY6222 平台将 EM_platform.hPHY_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 的对应组件中进行处理。

SDK 测试功能

TuyaOS Bluetooth Mesh SDK 支持使用 Logic 上位机测试,使用串口功能实现蓝牙、Mesh 以及外设的功能测试。

实际产品功能中,可以关闭此功能来节省代码空间,关闭方式:

#define TUYA_SDK_TEST 1 修改为 #define TUYA_SDK_TEST 0,即可关闭原有的串口上位机 SDK 测试功能,将节省大量的代码空间。