知方号

知方号

设备初始化

设备初始化

初始化是指设备上电、启动之后,调用一系列 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_lastSDK 初始化最后的时机其他功能。循环任务 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 为涂鸦开发者平台创建产品时生成的 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:固件标志名,与涂鸦开发者平台创建时一致,使用涂鸦产测上位机授权时会校验。

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 indexModel说明0Config Model用于设备配置功能0Generic Onoff Model开关0Light Lightness Model亮度0Light CTL Model亮度 + 色温0Light CTL Tempeture Model色温0Light Hsl Model彩光 HSL 模型0Tuya Vendor Model涂鸦自定义 Vendor Model

电工品类配置

Element indexModel说明0Config Model用于设备配置功能0Generic Onoff Model开关 11Generic Onoff Model开关 22Generic Onoff Model开关 33Generic Onoff Model开关 44Generic Onoff Model开关 55Generic Onoff Model开关 6

透传类与其他品类配置

Element indexModel说明0Config Model用于设备配置功能0Generic Onoff Model用于兼容旧版本协议中的心跳策略0Tuya Vendor Model涂鸦自定义 Vendor ModelMesh 数据接收初始化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.h 中 LOG_FW_FUNC_EN 宏定义使能,即可开启。PHY6222 平台将 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 的对应组件中进行处理。

SDK 测试功能

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。