TuyaOS
配网

配网是 Wi-Fi 产品特有的一个能力,他的主要目的,是通过具有配网能力的设备,对未配网的 Wi-Fi 设备进行网络连接配置。在配网过程中,具有配网能力的设备,会通过交互,把指定的Wi-Fi路由器的 SSIDPassword 以及在涂鸦 IoT 平台上申请创建出来的 Token 信息,发送给未配网设备;未配网设备拿到这些信息之后,连接Wi-Fi路由器,并通过涂鸦 IoT 平台提供的 IoT-DNS 服务获取对应区域的服务器地址,然后通过 Atop 服务进行激活,并连接到涂鸦 IoT 平台进行正常的业务交互。

目前按照交互方式,涂鸦 TuyaOS 主要支持以下配网能力。

  • smartcfg 配网

    根据涂鸦 smartcfg 规则,将 SSIDPasswordToken 进行编码到 udp 广播、组播报文中,并在Wi-Fi路由器局域网内部发送,未配网设备在接收到报文,识别特征之后,进行解码,提取出 SSIDPasswordToken,并进行后续的连接 Wi-Fi 路由器,并连接涂鸦 IoT 平台,进行激活绑定。

    smartcfg配网模式在TuyaOS 3.4.0版本之后因为安全性和兼容性问题,已经移除,不再支持,为了保持对老产品的兼容支持,配网模式依然保留,只是不再起作用。双模设备我们推荐使用蓝牙配网,单Wi-Fi设备推荐使用AP配网。

  • AP 配网

    未配网设备根据用户配置或者是默认的涂鸦 AP 配网规则,创建一个 Wi-Fi AP 热点,并启动涂鸦 AP 配网协议服务。具备配网能力的设备会连接到这个热点,并连接到该服务端口,根据涂鸦 AP 配网协议进行交互,将 SSIDPasswordToken 发送给待配网设备。待配网设备拿到 SSIDPasswordToken 之后,连接 Wi-Fi 路由器,并连接涂鸦 IoT 平台,进行激活绑定。

  • 蓝牙配网

    未配网设备发送蓝牙广播,具备配网能力的设备在接收到蓝牙广播数据之后,会对未配网设备发起配对,配对完成之后,根据涂鸦蓝牙配网协议进行交互,将 SSIDPasswordToken 发送给待配网设备。待配网设备拿到 SSIDPasswordToken 之后,连接 Wi-Fi 路由器,并连接涂鸦 IoT 平台,进行激活绑定。

  • 闪电配网

    闪电配网是一种伙伴免密配网技术,即一台支持闪电配网的已联网设备,对支持闪电配网的的设备进行配网。支持闪电配网的已联网设备通过Wi-Fi管理帧,按照涂鸦闪电配网协议的定义,发现在设备周边新出现的支持闪电配网的未配网设备,并跟涂鸦 APP 进行交互,当客户进入涂鸦 APP 主界面的时候,进行弹窗显示,只需要用户在APP上进行简单的发现、添加操作,即可将设备配网,减少了人为的输入密码操作,优化了配网体验,使得新设备可以做到上电添加之后即可使用。

  • FFS 配网

    FFS配网是 Alexa Frustration-Free Setup的缩写,也是一种伙伴免密配网技术,在amazon Alexa智能音箱的支持下,按照amazon定义的 Frustration-Free Setup流程,对支持FFS配网的设备进行配网,过程不需要人工介入,设备只要插电即可配网,优化了配网的流程和客户的使用体验。

  • 用户配网

    为了支持其他类型的配网,如屏幕输入、声波、扫二维码、局域网等任意开发者自行开发出来的获取 SSIDPasswordToken 的方式,通过这些机制拿到了 SSIDPasswordToken 并调用API设置到涂鸦 TuyaOS,待配网设备拿到 SSIDPasswordToken 之后,连接 Wi-Fi 路由器,并连接涂鸦 IoT 平台,进行激活绑定。

配网模式

配网模式是指涂鸦 TuyaOS 根据客户需求,抽象出来的配网方案,满足不同产品、不同场景的需求。配网模式子在设备初始化的时候,调用tuya_iot_wf_mcu_dev_init 或者 tuya_iot_wf_soc_dev_init的时候提供,包括以下几种。

配网模式 描述
WF_START_AP_ONLY 仅支持 AP 配网模式。
WF_START_SMART_ONLY 仅支持smartcfg配网模式。
WF_START_AP_FIRST 支持AP配网或者smartcfg配网模式,默认AP配网模式,但是经过重置,可以切换成smartcfg配网模式。
WF_START_SMART_FIRST 支持AP配网或者smartcfg配网模式,默认smartcfg配网模式,但是经过重置,可以切换成AP配网模式。
WF_START_SMART_AP_CONCURRENT 涂鸦万能配网模式,支持APsmartcfg配网共存,同时根据产品的形态和客户的需求,自定义支持蓝牙配网、闪电配网和FFS配网。

注意,在以上几个配网模式下,用户配网方式是默认支持的,即在任意模式之下,都是可以通过接口直接设置SSIDPasswordToken进行配网操作的。

注意,在以上几个配网模式下,蓝牙配网在开启蓝牙功能的时候,是默认支持的,即在任意模式下,只要有蓝牙能力,都是可以直接使用蓝牙进行配网。

Wi-Fi工作模式

Wi-Fi工作模式是Wi-Fi产品特有的模式,在设备初始化的时候,调用tuya_iot_wf_mcu_dev_init 或者 tuya_iot_wf_soc_dev_init的时候提供,其目的是为了规范设备工作时候的具体行为,提高使用体验。

Wi-Fi工作模式 描述
GWCM_OLD 主要使用在通用对接类固件上。
设备只有在mcu发起产测的时候,才会扫描产测路由器,任意时刻都可以进入产测。
GWCM_LOW_POWER 主要使用在soc插座上。
配网前上电低功耗常亮,需要手工切换才能进入配网状态;
配网状态下,10秒内没配网成功,手工重启保持上次配网状态,10s后未配网,手工重启进入低功耗常亮状态;15分钟未配网,自动进入低功耗常亮状态,其中15分钟可以设置;
配网成功后,app移除设备自动重启,进入配网状态,默认smartcfg配网模式,擦除保存的ssidpassword;手工移除,设备自动进入配网状态,擦除保存的ssidpassword
设备只有在低功耗状态下,重启设备才会扫描产测路由,进入产测模式。
GWCM_SPCL_MODE 主要使用在soc照明上。
配网前上电低功耗常亮,需要手工切换才能进入配网状态;
配网状态下,10秒内没配网成功,手工重启保持上次配网状态,10s后未配网,手工重启进入低功耗常亮状态,15分钟未配网,自动进入低功耗常亮状态,其中15分钟可以设置;
配网成功后,app移除设备自动重启,进入配网状态,默认smartcfg配网模式,擦除保存的ssidpassword;手工移除,设备自动进入配网状态,进入防误触模式,不擦除保存的ssidpassword
设备只有在低功耗状态下,重启设备才会扫描产测路由,进入产测模式。
GWCM_OLD_PROD 主要使用在soc照明上。
上电即可进入配网状态,并且一直处于配网状态;
设备在配网状态下,重启设备都会主动扫描产测路由,进入产测模式。
GWCM_LOW_POWER_AUTOCFG 配网前上电进入smartcfg配网模式,smartcfgap模式来回切换;
配网状态下,15分钟内重启,保持,保持上次配网状态,15分钟未配网自动进入低功耗常亮状态,其中15分钟可以设置;
配网成功后,app移除设备自动重启,进入配网状态,默认smartcfg配网模式;手工移除,设备自动进入配网状态,默认smartcfg配网模式;
设备在配网状态下,重启设备都会主动扫描产测路由,进入产测模式。
GWCM_SPCL_AUTOCFG 配网前上电进入smartcfg配网模式,smartcfgap模式来回切换;
配网状态下,15分钟内重启,保持上次配网状态,15分钟未配网自动进入低功耗常亮状态,其中15分钟可以设置;
配网成功后,app移除设备自动重启,进入配网状态,默认smartcfg配网模式,擦除保存的ssidpassword,15分钟内重启,保持上次配网状态,15分钟未配网自动进入低功耗常亮状态,其中15分钟可以设置;手工移除,设备自动进入配网状态,进入防误触模式,不擦除保存的ssidpassword,10秒内重启,保持上次配网状态,10秒后重启,立即连接已经配网路由器,15分钟内重启,保持,保持上次配网状态,15分钟未配网自动进入低功耗常亮状态,其中15分钟可以设置;;
设备在配网状态下,重启设备都会主动扫描产测路由,进入产测模式。

接口描述

Wi-Fi 设置用户自定义AP

/**
* @brief tuya_iot_set_user_def_ap_if
*
* @param[in] ssid: user defined ssid
* @param[in] passwd: user defined passwd
*
* @return OPERATE_RET
*
* @note need call before tuya_iot_wf_xxx_init
*/
OPERATE_RET tuya_iot_set_user_def_ap_if(IN CONST CHAR_T *ssid, IN CONST CHAR_T *passwd);

此接口用于设置用户自定义的AP配网的SSIDPassword。如果用户设置自定义的AP的SSIDPassword之后,AP配网将显示该SSID,并在连接的时候使用该Password进行验证。因此,此接口必须在调用tuya_iot_wf_mcu_dev_init 或者 tuya_iot_wf_soc_dev_init之前调用。

Wi-Fi 获取用户自定义AP

/**
* @brief tuya_iot_get_dev_ap_if
*
* @param[in] ssid: the ssid of ap
* @param[in] passwd: the passwd of ap
*
* @return OPERATE_RET
*
*/
OPERATE_RET tuya_iot_get_dev_ap_if(OUT CHAR_T *ssid, OUT CHAR_T *passwd);

此接口用于查询用户设置的AP配网的SSIDPassword。如果用户没有设置返回设备烧录授权时写入的默认的SSIDPassword

Wi-Fi 用户配网

/**
* @brief tuya_iot_gw_wf_user_cfg
*
* @param[in] ssid: user config router ap ssid
* @param[in] passwd: user config router ap passwd
* @param[in] token: the token of tuya cloud
*
* @return OPERATE_RET
*
* @note device will scan and connect to the router ap, and try to active on tuya cloud use the token
*/
OPERATE_RET tuya_iot_gw_wf_user_cfg(IN CONST CHAR_T *ssid, IN CONST CHAR_T *passwd, IN CONST CHAR_T *token);

此接口用于配置设备Wi-Fi网络配置,除了通过涂鸦提供的配网能力去获取Wi-Fi网络配置之外,还可以通过用户自己的方式去获取SSIDPasswordToken,然后通过此接口设置,进行连接路由器、绑定激活等工作。

Wi-Fi 配网超时时间设置

/**
* @brief tuya_iot_wf_timeout_set
* @desc set wifi timeout
*
* @param[in] timeout: time in sec
*
* @return none
*
* @note must call befor tuya_iot_wf_xxx_init
*/
VOID tuya_iot_wf_timeout_set(IN CONST UINT_T timeout);

Wi-Fi配网超时是指设备进入配网状态之后,一段时间没有完成配网,则退出配网模式的行为。设备配网的过程是一个设备和涂鸦智能APP、路由器频繁交互的一个阶段,功耗很高,长时间处于配网状态会造成设备消耗较多的电力,提高设备的使用成本,也可能会导致设备不稳定。因此涂鸦TuyaOS默认进入配网状态15分钟之后,配网超时退出配网,这个时间是可设置的,通过tuya_iot_wf_timeout_set可以修改超时时间。

示例代码

Wi-Fi配网主要是在初始化的时候指定了配网模式,其主要的工作是初始化的时候进行的,以下是一端示例代码,在初始化的时候设置了ap_ssidap_passwd,并以GWCM_SPCL_AUTOCFG工作模式和WF_START_AP_FIRST配网模式启动设备。

#define UUID "f2*******b0"
#define AUTHKEY "6P***************MX"
#define PRODUCT_KEY "U0********Zy" //DP控制开关
#define USER_SW_VER "1.0.0"
#define AP_SSID "SmartLife"
#define AP_PASSWD "tuya_wf_sample"
#define CFG_STORAGE_PATH "./tuya_db_files/"
#define WIFI_NETCFG_TIMEOUT 3
STATIC VOID __soc_dev_rev_upgrade_info_cb(IN CONST FW_UG_S *fw);// SOC设备升级入口
STATIC VOID __soc_dev_status_changed_cb(IN CONST GW_STATUS_E status);// SOC设备云端状态变更回调
STATIC VOID __soc_dev_dp_query_cb(IN CONST TY_DP_QUERY_S *dp_qry);// SOC设备特定数据查询入口
STATIC VOID __soc_dev_obj_dp_cmd_cb(IN CONST TY_RECV_OBJ_DP_S *dp);// SOC设备格式化指令数据下发入口
STATIC VOID __soc_dev_raw_dp_cmd_cb(IN CONST TY_RECV_RAW_DP_S *dp);// SOC设备透传指令数据下发入口
STATIC VOID __soc_dev_restart_req_cb(GW_RESET_TYPE_E type);// SOC设备进程重启请求入口
STATIC VOID __soc_dev_net_status_cb(IN CONST GW_BASE_NW_STAT_T stat);// SOC外网状态变动回调
STATIC VOID __soc_dev_reset_cb(event_raw_data_t *data);
int main(int argc, char *argv[])
{
int rt = OPRT_OK;
// 此处为涂鸦TuyaOS初始化之前的一些特殊工作,代码每一个应用场景可能不同,按需实现
TUYA_CALL_ERR_RETURN(tuya_iot_wf_timeout_set(WIFI_NETCFG_TIMEOUT));
TUYA_CALL_ERR_RETURN(tuya_iot_set_user_def_ap_if("test_ap", "test_passwd"));
// 此处为涂鸦TuyaOS基础功能初始化,为TuyaOS分配资源,并启动一些最基础的能力
TUYA_CALL_ERR_RETURN(tuya_iot_init_param(CFG_STORAGE_PATH, NULL));
// 此处为涂鸦TuyaOS授权信息写入,仅在Linux Demo代码使用,因为正式产品是在生产测试的时候写入授权信息
WF_GW_PROD_INFO_S prod_info = {UUID, AUTHKEY, AP_SSID, AP_PASSWD};
TUYA_CALL_ERR_RETURN(tuya_iot_set_wf_gw_prod_info(&prod_info));
// 此处为设备初始化,实现了一些基础的回调功能,满足一个设备的基本能力需求,并注册获取连接状态回调函数
TY_IOT_CBS_S iot_cbs = {0};
iot_cbs.gw_status_cb = __soc_dev_status_changed_cb;
iot_cbs.gw_ug_cb = __soc_dev_rev_upgrade_info_cb;
iot_cbs.gw_reset_cb = __soc_dev_restart_req_cb;
iot_cbs.dev_obj_dp_cb = __soc_dev_obj_dp_cmd_cb;
iot_cbs.dev_raw_dp_cb = __soc_dev_raw_dp_cmd_cb;
iot_cbs.dev_dp_query_cb = __soc_dev_dp_query_cb; TUYA_CALL_ERR_RETURN(tuya_iot_wf_soc_dev_init_param(GWCM_SPCL_AUTOCFG,WF_START_AP_FIRST,&iot_cbs,NULL,PRODUCT_KEY,DEV_SW_VERSION));
TUYA_CALL_ERR_RETURN(tuya_iot_reg_get_nw_stat_cb_params(__soc_dev_net_status_cb, 1));
// 此处为设备初始化后的一些设备应用功能初始化,,代码每一个应用场景可能不同,按需实现
// TBD
// demo状态监控
while (1)
{
sleep(10);
// 监控设备状态,打印状态提示
ty_devos_monitor();
}
return 0;
}