编译第一个工程
tuyaos_demo_quickstart 为 TuyaOS 联网单品统一的 demo 工程,在体现 TuyaOS 联网单品开发的基本能力下,提供一个尽可能简单的示例,方便开发者借助此示例熟悉 TuyaOS 开发流程,开发自己的智能设备。
tuyaos_demo_quickstart 具备以下功能:
- 可配置配网按钮
- 可配置配网指示灯
- 支持蓝牙配网、热点配网模式
- 连接涂鸦云后,自动回复 APP 通过涂鸦云下发信息,用于演示app下发。
- 按钮短按触发上报功能
- 按钮长按移除设备功能
应用程序启动流程
1. 入口函数
TuyaOS 联网单品统一的入口函数为 tuya_app_main
VOID_T tuya_app_main(VOID_T)
{
THREAD_CFG_T thrd_param = {4096, 4, "tuya_app_main"};
tal_thread_create_and_start(&ty_app_thread, NULL, NULL, tuya_app_thread, NULL, &thrd_param);
}
tuya_app_main 会创建一个 ty_app_thread 线程,调用 TUYA_LwIP_Init() 函数完成 lwip 初始化,并调用 user_main() 或 app_main() 函数,进入应用层代码。
STATIC VOID_T tuya_app_thread(VOID_T *arg)
{
/* Initialization LWIP first!!! */
#if defined(ENABLE_LWIP) && (ENABLE_LWIP == 1)
TUYA_LwIP_Init();
#endif
user_main();
tal_thread_delete(ty_app_thread);
ty_app_thread = NULL;
}
2. TuyaOS 初始化
在 user_main()/app_main() 函数中,会调用 tuya_iot_init_params() 函数实现 TuyaOS 初始化。
STATIC VOID_T user_main(VOID_T)
{
OPERATE_RET rt = OPRT_OK;
/* Initialization, because DB initialization takes a long time,
* which affects the startup efficiency of some devices,
* so special processing is performed during initialization to delay initialization of DB
*/
TY_INIT_PARAMS_S init_param = {0};
init_param.init_db = TRUE;
strcpy(init_param.sys_env, TARGET_PLATFORM);
TUYA_CALL_ERR_LOG(tuya_iot_init_params(NULL, &init_param));
tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
/* Initialization device */
TAL_PR_DEBUG("device_init in");
TUYA_CALL_ERR_LOG(__soc_device_init());
return;
}
tuya_iot_init_params() 函数是 TuyaOS
的初始化接口,接口内部会对 TuyaOS
的内部基础功能进行资源分配、初始化。一般来说,这个接口会第一个调用。开发者如果有一些需要尽早启动,并且和 TuyaOS
无关的逻辑,可以在此接口调用之前执行。
/**
* @brief tuya_iot_init_params
* @desc init tuyaos framework
*
* @param[in] fs_storge_path: filesystem read write storge path
* (if os have no fs,then fs_storge_path is invalid)
* @param[in] p_param: custom init params
*
* @return OPRT_OK: success Other: fail
*/
OPERATE_RET tuya_iot_init_params(IN CONST CHAR_T *fs_storge_path, IN CONST TY_INIT_PARAMS_S *p_param);
-
CHAR_T *fs_storge_path
:数据存储路径,仅在Linux
系统下使用,如果不提供,则默认在程序当前路径下创建数据库目录tuya_db_files
。 -
TY_INIT_PARAMS_S *p_param
:初始化配置,Linux
系统可以设置为NULL
。typedef struct { BOOL_T init_db; //TuyaOS 初始化系统服务时,是否初始化 KV 数据存储服务。如果选择不初始化,则后续需要显式调用 tuya_iot_kv_flash_init_param 以使能 KV 数据存储服务。 CHAR_T sys_env[SYS_ENV_LEN]; // 系统环境变量(Linux 适用) CHAR_T log_seq_path[LOG_SEQ_PATH_LEN]; // 日志序文件存储路径(Linux 适用) }TY_INIT_PARAMS_S;
更多详细信息可点击:系统服务初始化参数
产品创建
tuyaos_demo_quickstart 示例中,默认的 PID 在 tuya_app_main.c 中通过宏定义,开发者开发自己的智能设备需替换该宏。
#define PID "uiiyltkjmkhwumga"
PID 可在 涂鸦 IoT 平台 创建产品后获取,更详细产品创建流程可参考:https://developer.tuya.com/cn/docs/iot-device-dev/application-creation?id=Kbxw7ket3aujc
设备初始化
产品相关的信息通过 tuya_iot_wf_soc_dev_init()
接口注册至 TuyaOS 。
/**
* @brief tuya_iot_wf_soc_dev_init_param
*
* @param[in] cfg
* @param[in] start_mode
* @param[in] cbs: tuya wifi sdk user callbacks,note cbs->dev_ug_cb is useless
* @param[in] firmware_key
* @param[in] product_key: product key/proudct id,get from tuya open platform
* @param[in] wf_sw_ver: wifi module software version format:xx.xx.xx (0<=x<=9)
*
* @return OPERATE_RET
*/
OPERATE_RET tuya_iot_wf_soc_dev_init_param(IN CONST GW_WF_CFG_MTHD_SEL cfg, IN CONST GW_WF_START_MODE start_mode,
IN CONST TY_IOT_CBS_S *cbs,IN CONST CHAR_T *firmware_key,
IN CONST CHAR_T *product_key,IN CONST CHAR_T *wf_sw_ver);
#define tuya_iot_wf_soc_dev_init(cfg, start_mode,cbs,product_key,wf_sw_ver) \
tuya_iot_wf_soc_dev_init_param(cfg, start_mode,cbs,NULL,product_key,wf_sw_ver)
此接口是 TuyaOS
应用产品初始化接口,通过开发者传递过来的 PID
、固件key、版本信息,到涂鸦云激活,并向云端获取对应 PID
的模型,即 schema
信息对设备进行初始化。此函数接口参数较多,下面逐一解释每个参数的含义:
-
GW_WF_CFG_MTHD_SEL cfg
:Wi-Fi
设备配网模式。更多详细使用说明参照 配网模式的定义 -
GW_WF_START_MODE start_mode
:Wi-Fi
设备配网启动方式。详细使用说明参照 配网启动方式的定义 -
TY_IOT_CBS_S *cbs
IoT 设备功能回调函数- 和设备本身相关
gw_status_cb
:通知开发者设备激活的状态发生改变。gw_reset_cb
:通知开发者设备被重置了。dev_obj_dp_cb
:通知开发者有 obj 类型 DP 指令下发。dev_raw_dp_cb
:通知开发者有 raw 类型 DP 指令下发。dev_dp_query_cb
:通知您需要查询指定 DP 当前的状态。
- 和设备带的可独立 OTA 的功能模组相关
pre_gw_ug_cb
:通知开发者,设备带的可独立 OTA 的功能模组有升级请求,开发者通过返回值告诉开发框架当前是否允许升级。gw_ug_cb
:通知开发者,设备带的可独立 OTA 的功能模组开始进入升级流程,并告知开发者拉取升级数据时所需的 URL 等必要信息。
- 和设备下挂的子设备相关
pre_dev_ug_cb
:通知开发者,设备所属的子设备有升级请求,开发者通过返回值告诉开发框架当前是否允许升级。dev_ug_cb
:通知开发者,设备所属的子设备开始进入升级流程,并告知开发者拉取升级数据时所需的 URL 等必要信息。dev_reset_cb
:通知开发者,设备所属的子设备被重置了(单品类设备无需关心)。
- 和设备本身相关
/**
* @brief Definition of gateway callback functions
*/
typedef struct {
/** status update */
GW_STATUS_CHANGED_CB gw_status_cb;
/** gateway upgrade */
GW_UG_INFORM_CB gw_ug_cb;
/** gateway reset */
GW_RESET_IFM_CB gw_reset_cb;
/** structured DP info */
DEV_OBJ_DP_CMD_CB dev_obj_dp_cb;
/** raw DP info */
DEV_RAW_DP_CMD_CB dev_raw_dp_cb;
/** DP query */
DEV_DP_QUERY_CB dev_dp_query_cb;
/** sub-device upgrade */
DEV_UG_INFORM_CB dev_ug_cb;
/** sub-device reset */
DEV_RESET_IFM_CB dev_reset_cb;
/** active short url */
ACTIVE_SHORTURL_CB active_shorturl;
/** gateway upgrade pre-condition */
GW_UG_INFORM_CB pre_gw_ug_cb;
/** sub-device upgrade pre-condition */
DEV_UG_INFORM_CB pre_dev_ug_cb;
} TY_IOT_CBS_S;
更多详细信息可点击:IoT 设备功能回调函数
注意:
您按需注册相关回调,无需注册的填 NULL 即可。
单品类设备的开发者无需关心与子设备相关的回调函数,填 NULL 即可。