更新时间:2024-06-25 03:08:34下载pdf
本文描述如何通过 App 对路由器进行管理,例如 Wi-Fi 设置、访客 Wi-Fi、家长控制、路由器 Mesh 组网、端口映射以及路由器下设备管理等功能。
通过 App 选择网关中控、路由器以及路由器配网方式,根据 App 引导,选择路由器 Wi-Fi 热点。当发现路由器设备后,需要配置路由器链接 WAN 的方式,当前支持 PPPOE、DHCP 以及静态 IP 地址设置三种方式。配置完毕后,路由器会链接到外网,路由器激活到涂鸦平台。
通过函数 tuya_router_reg_wan_setting_cb
注册 WAN 设置回调。
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
...
UINT_T timeout= 20;
tuya_router_wan_setting_report_net_stat(FALSE);
TUYA_ROUTER_WAN_SETTING_CBS_S wan_setting_cbs = {
.wan_conn_query_cb = wan_setting_query_cb,
.wan_conn_set_cb = wan_setting_set_cb
};
tuya_router_reg_wan_setting_cb(timeout, &wan_setting_cbs);
...
}
当 App 发现路由器设备后,会向路由器发起查询支持 WAN 配置类型,触发 wan_conn_query_cb
回调。需要调用函数 tuya_router_wan_setting_query_resp
,告知路由器支持的 WAN 设置种类,调用示例如下:
VOID wan_setting_query_cb(VOID)
{
CHAR_T *wan_type[3] = {
"PPPOE",
"DHCP",
"STATIC_IP"
};
tuya_router_wan_setting_query_resp(0, &wan_type, 3);
}
回调 wan_conn_set_cb
中处理来自 App 的 WAN 设置,示例如下:
VOID wan_setting_set_cb(IN CONST WAN_CONN_SETTING_INFO *setting)
{
WAN_CONN_ERR_CODE_T error_code = WAN_CONN_ERR_CODE_OK;
switch (setting->wan_conn_type) {
case WAN_CONN_TYPE_PPPOE:
PR_DEBUG("<pppoe: account:%s, password: %s>", setting->pppoe_info.account, setting->pppoe_info.pwd);
memcpy(&wan_setting, setting, sizeof(WAN_CONN_SETTING_INFO));
break;
case WAN_CONN_TYPE_DHCP:
PR_DEBUG("dhcp:");
memcpy(&wan_setting, setting, sizeof(WAN_CONN_SETTING_INFO));
break;
case WAN_CONN_TYPE_STATIC_IP:
PR_DEBUG("static ip");
PR_DEBUG("ip: %s", setting->static_ip_info.ip);
PR_DEBUG("mask:%s", setting->static_ip_info.mask);
PR_DEBUG("gw:%s", setting->static_ip_info.gw);
PR_DEBUG("pr dns:%s", setting->static_ip_info.primary_dns);
PR_DEBUG("sec dns:%s", setting->static_ip_info.secondary_dns);
memcpy(&wan_setting, setting, sizeof(WAN_CONN_SETTING_INFO));
break;
default:
PR_DEBUG("not support");
break;
}
...
tuya_router_wan_setting_set_resp(wan_setting.wan_conn_type, 0);
...
}
对路由器下设备进行控制管理,例如展示路由器下设备列表、网络信息、以及控制设备上传以及下载的速率。
通过 tuya_router_svc_init
函数注册回调函数。示例如下:
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
TUYA_ROUTER_CBS_S router_cbs = {
.cmd_handle_cb = ty_router_cmd_handle_cb,
.get_source_cb = ty_router_get_source_cb,
.set_source_cb = ty_router_set_source_cb,
.get_hotspot_cb = ty_router_get_hotspot_cb,
.set_hotspot_cb = ty_router_set_hotspot_cb,
.router_query_pwd_cb = ty_router_query_pwd_cb,
.router_set_pwd_cb = ty_router_set_pwd_cb,
};
TUYA_ROUTER_STA_CBS_S sta_cbs = {
.sta_cmd_cb = ty_router_sta_cmd_cb
};
op_ret = tuya_router_svc_init(&router_cbs, &sta_cbs);
if (op_ret != OPRT_OK) {
PR_ERR("tuya_router_svc_init faild, [%d]", op_ret);
}
...
}
通过 cmd_handle_cb
回调,App 向路由器查询当前支持的 Wi-Fi 热点信息,以及路由器下在线设备信息列表。示例如下:
VOID ty_router_cmd_handle_cb(IN CONST TY_ROUTER_CMD_E cmd)
{
TUYA_ROUTER_WIFI_LIST_S wifi_list[3] = {0x0};
TUYA_ROUTER_DEV_LIST_S dev_list[256] = {0x0};
int i = 0;
switch (cmd) {
case TY_ROUTER_CMD_GET_WIFI_LIST:
strcpy(wifi_list[0].ssid, "netcore");
wifi_list[0].b_encrypted = TRUE;
wifi_list[0].signal_strength = TY_WIFI_SIG_HIGH;
strcpy(wifi_list[1].ssid, "HUA-SAN");
wifi_list[1].b_encrypted = TRUE;
wifi_list[1].signal_strength = TY_WIFI_SIG_LOW;
strcpy(wifi_list[2].ssid, "HUA-WEI");
tuya_router_rept_wifi_list(2, wifi_list);
break;
case TY_ROUTER_CMD_GET_ONLINE_LIST:
for (i = 0; i < 250; i++) {
char buf[100] = {0};
snprintf(buf, sizeof(buf),"Myphone-%d", i);
strcpy(dev_list[i].dev_name, buf);
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),"77:22:33:44:55:%02x", i);
strcpy(dev_list[i].mac, buf);
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),"192.168.10.%d", i);
strcpy(dev_list[i].ip_addr, buf);
memset(dev_list[i].upper_router_name, 0, sizeof(dev_list[i].upper_router_name));
strcpy(dev_list[i].upper_router_name, "Main");
dev_list[i].wifi_types = TY_WIFI_TYPE_5G;
}
tuya_router_rept_online_list(250, dev_list);
break;
default:
break;
}
}
通过 sta_cmd_cb
配置路由器下设备的上传以及下载速率。示例如下:
OPERATE_RET ty_router_sta_cmd_cb(IN CONST TY_ROUTER_STA_CMD_E cmd, IN CONST CHAR_T *mac,
IN CONST TUYA_ROUTER_STA_CONF_S *cfg_value)
{
OPERATE_RET ret = OPRT_OK;
PR_DEBUG("cmd:%d mac:%s\n", cmd, mac);
switch (cmd) {
case TY_STA_CMD_ALLOW_NET:
config.allow = cfg_value->allow;
PR_DEBUG("allow_network: %d", config.allow);
tuya_router_rept_sta_allow_net(mac, config.allow, STA_DPID);
break;
case TY_STA_CMD_SPEED_LIMIT:
config.limit = cfg_value->limit;
PR_DEBUG("network speed limit: %d", config.limit);
tuya_router_rept_sta_limit(mac, config.limit, STA_DPID);
break;
case TY_STA_CMD_UP_LIMIT:
config.up_limit = cfg_value->up_limit;
strcpy(config.rate_unit, cfg_value->rate_unit);
PR_DEBUG("max upload speed: %d", config.up_limit);
tuya_router_rept_sta_up_limit(mac, config.up_limit, STA_DPID);
break;
case TY_STA_CMD_DOWN_LIMIT:
config.down_limit = cfg_value->down_limit;
strcpy(config.rate_unit, cfg_value->rate_unit);
PR_DEBUG("max down speed: %d", config.down_limit);
tuya_router_rept_sta_down_limit(mac, config.down_limit, STA_DPID);
break;
case TY_STA_CMD_RATE_UNIT:
strcpy(config.rate_unit, cfg_value->rate_unit);
PR_DEBUG("rate unit: %s", config.rate_unit);
tuya_router_rept_sta_rate_unit(mac, config.rate_unit, STA_DPID);
break;
...
default:
break;
}
}
把路由器下设备通过设置组的方式,设置该组内的设备访问 URL 的黑白名单,以及允许访问外网的时间段。
家长控制设备列表通过 tuya_router_family_ctrl_report_dev_list
接口上报设备列表信息,App 会呈现这些设备到待加入家长控制设备列表中。上报示例如下:
VOID router_family_ctrl_report_dev_list(VOID)
{
FAMILY_CTRL_DEV_LIST_T list[3] = {
{"11:22:33:44:55:68", "hello_world9"},
{"66:55:44:33:22:19", "hello_world10"},
{"66:55:44:33:22:1a", "hello_world11"},
};
tuya_router_family_ctrl_report_dev_list(list, 3);
}
通过 tuya_router_reg_family_ctrl_cb
注册家长控制处理。示例如下:
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
...
TUYA_ROUTER_FAMILY_CTRL_CBS_S family_ctrl_cbs = {
.cfg_cb = family_ctrl_cfg_cb,
.del_cb = family_ctrl_del_cb
};
tuya_router_reg_family_ctrl_cb(&family_ctrl_cbs);
...
}
在 cfg_cb
中,路由器设备接收来自 App 对家长控制的设置。
VOID family_ctrl_cfg_cb(IN UINT_T id, IN CONST CHAR_T **mac_list, INT_T mac_num, IN FACTORY_CTRL_URL_T *ctrl_url, IN FACTORY_CTRL_LIMIT_TIME_T *ctrl_time)
{
UINT_T i = 0;
PR_DEBUG("%s, group id:%d, list type:%d", __func__, id, ctrl_url->url_list_type);
for (i = 0; i < mac_num; i++)
PR_DEBUG("mac num:%d, mac: %s", mac_num, mac_list[i]);
if (ctrl_url != NULL) {
PR_DEBUG("web filter enable:%d", ctrl_url->web_filter_enable);
if (ctrl_url->url_list_type == URL_WHITE_LIST)
PR_DEBUG("white list");
else
PR_DEBUG("black list");
for (i = 0; i < ctrl_url->url_num; i++)
PR_DEBUG("URL: %s, %d", ctrl_url->url_list[i], ctrl_url->url_num);
}
if (ctrl_time != NULL) {
PR_DEBUG("time: %s", ctrl_time->limit_time);
}
}
其中 ctrl_time
为 JSON 字符串,列表中对应 App 家中控制中一条时间段控制规则,格式如下:
[{
"enable": 1,
"start_time": "21:30",
"stop_time": "07:00",
"weekdays": "0100000"
}]
enable
:1
表示该条规则开启,0
表示关闭。
start_time
:格式为 HH:MM
,24 小时制。
stop_time
:格式为 HH:MM
,24 小时制。
weekdays
:第一位表示周日,第二位表示周一,以次类推。
del_cb
回调函数,可以删除一组家长控制。
VOID family_ctrl_del_cb(UINT_T id)
{
PR_DEBUG("group id:%d will be deleted", id);
/* TODO:*/
}
路由器之间可以组成 Mesh 网络,App 端发起 Mesh 组网请求。路由器收到后,搜集周边路由器信息列表,上报给 App。App 上用户选择可以组成 Mesh 的路由器设备,等待 Mesh 组网完成。
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
OPERATE_RET op_ret = OPRT_OK;
...
/* wifi mesh */
TUYA_ROUTER_WIFI_MESH_CBS_S mesh_cbs = {
.enable_cb = mesh_enable_cb,
.confirm_slave_routers_cb = confirm_mesh_salve_routers_cb,
.query_cb = mesh_query_cb,
.chg_router_name_cb = mesh_chg_name
};
tuya_router_reg_wifi_mesh_cb(&mesh_cbs);
...
}
回调中 enable_cb
为是否开启 Mesh 组网。
VOID mesh_enable_cb(IN BOOL_T enable)
{
PR_DEBUG("wifi mesh enable:%d", enable);
}
路由器设备通过函数 tuya_router_wifi_mesh_cmd_enable_resp
回复使能结果,并开始扫描周边路由器信息。通过函数 tuya_router_wifi_mesh_report_scanned_routers_list
上报 App 搜集到的路由器信息列表。
当 App 选择可以组成 Mesh 的从路由器设备后,confirm_slave_routers_cb
回调会被调用。示例如下:
VOID confirm_mesh_salve_routers_cb(IN UINT_T *id_list, IN UINT_T num)
{
UINT_T i = 0;
router_id_list.router_id_num = num;
for (i = 0; i < num; i++) {
router_id_list.list[i] = id_list[i];
}
}
需要注意的是,为了减少数据的传输,回复 ID 编号代表设备,需与上报路由器 ID 编号一致。
当用户在 App 修改主从路由器设备名称时,mesh_chg_name
回调会被调用。
VOID mesh_chg_name(CHAR_T *mac, CHAR_T *router_name)
{
PR_DEBUG("mac: %s, router name:%s", mac, router_name);
}
通过 App 可以给 Mesh 主从路由器进行升级。
注册主从路由器 OTA 回调接口函数。
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
OPERATE_RET op_ret = OPRT_OK;
...
/* master router & slave routers ota info*/
TUYA_ROUTER_OTA_CBS_S ota_cbs = {
.query_cb = routers_ota_query_cb,
.notify_ota_cb = routers_notify_cb
};
tuya_router_reg_ota_cb(&ota_cbs);
...
}
当 App 上查询主从路由器版本信息时,会触发 query_cb
回调,主路由器搜集主从路由器版本等信息,通过接口 tuya_router_report_ota_info
上报。
VOID routers_mesh_ver_info_report(int st)
{
strcpy(master_ota_info.dev_name, "master");
master_ota_info.ota_info[0].tp = 0;
master_ota_info.ota_info[0].upg_status = st;
strcpy(master_ota_info.ota_info[0].fw_ver, "1.2.0");
slave_ota_info_list[0].dev_id = 1;
strcpy(slave_ota_info_list[0].pid, "xxxx");
strcpy(slave_ota_info_list[0].uuid, "uuidd39baaba17575011");
strcpy(slave_ota_info_list[0].dev_name, "slave-1");
slave_ota_info_list[0].ota_info[0].tp = 0;
slave_ota_info_list[0].ota_info[0].upg_status = st;
strcpy(slave_ota_info_list[0].ota_info[0].fw_ver, "1.2.0");
strcpy(slave_ota_info_list[0].ota_info[0].fw_key, "yyyyyyyy");
strcpy(slave_ota_info_list[1].pid, "xxxx");
strcpy(slave_ota_info_list[1].uuid, "uuidda80b094a42cd083");
strcpy(slave_ota_info_list[1].dev_name, "slave-2");
slave_ota_info_list[1].dev_id = 2;
slave_ota_info_list[1].ota_info[0].tp = 0;
slave_ota_info_list[1].ota_info[0].upg_status = st;
strcpy(slave_ota_info_list[1].ota_info[0].fw_ver, "1.2.0");
strcpy(slave_ota_info_list[1].ota_info[0].fw_key, "yyyyyyyy");
tuya_router_report_ota_info(0, &master_ota_info, &slave_ota_info_list, 2);
}
主从路由器固件需上传到涂鸦开发者平台。
如果有新固件可以更新,App 会下发更新通知,此时触发 notify_ota_cb
回调。
VOID routers_notify_cb(IN ROUTERS_OTA_INFO_T *master_ota_info, IN ROUTERS_OTA_INFO_T *slave_ota_info_list, IN UINT_T slave_ota_info_num)
{
PR_DEBUG("master router ota info:");
PR_DEBUG("pid: %s", master_ota_info->pid);
PR_DEBUG("uuid: %s", master_ota_info->uuid);
PR_DEBUG("fw_key: %s", master_ota_info->ota_info[0].fw_key);
PR_DEBUG("sw_ver: %s", master_ota_info->ota_info[0].fw_ver);
PR_DEBUG("fw_url: %s", master_ota_info->ota_info[0].fw_url);
PR_DEBUG("fw_hmac: %s", master_ota_info->ota_info[0].fw_hmac);
PR_DEBUG("file size: %d", master_ota_info->ota_info[0].file_size);
PR_DEBUG("slave router ota info:");
int i = 0;
for (i = 0; i < slave_ota_info_num; i++) {
PR_DEBUG("#%d", i);
PR_DEBUG("pid: %s", slave_ota_info_list[i].pid);
PR_DEBUG("uuid: %s", slave_ota_info_list[i].uuid);
PR_DEBUG("dev_id: %d", slave_ota_info_list[i].dev_id);
PR_DEBUG("fw_key: %s", slave_ota_info_list[i].ota_info[0].fw_key);
PR_DEBUG("sw_ver: %s", slave_ota_info_list[i].ota_info[0].fw_ver);
PR_DEBUG("fw_url: %s", slave_ota_info_list[i].ota_info[0].fw_url);
PR_DEBUG("fw_hmac: %s", slave_ota_info_list[i].ota_info[0].fw_hmac);
PR_DEBUG("file size: %d", slave_ota_info_list[i].ota_info[0].file_size);
}
}
主路由器在该回调中,获取到主从路由器固件的 URL 地址、版本、文件大小和 HMAC 等信息。主路由器把这些信息分发给从路由器。从路由器通过 URL 拉取固件,进行文件大小以及 HMAC 校验后,并进行升级。在 App 等待的时间内,主路由器需上报主从路由器升级结果,通过接口 tuya_router_report_ota_info
上报。
主从路由器从 URL 地址拉取固件到设备本地。
file_size
匹配文件大小是否合法。参考的 HMAC 计算脚本:
#!/bin/sh
[ ! $# -eq 2 ] && {
echo "$0 [file] [uuid]"
exit -1
}
sum=$(sha256sum $1 | cut -d ' ' -f 1 | tr [:lower:] [:upper:])
echo -n "$sum" | openssl dgst -sha256 -hmac "$2" | cut -d ' ' -f 2
用户可以在 App 对路由器进行端口映射的设置。
通过函数 tuya_router_reg_port_forwards_cb
注册端口转发处理函数的回调。示例如下:
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
OPERATE_RET op_ret = OPRT_OK;
...
/* port forward */
TUYA_ROUTER_PORT_FORWARDS_CBS_S port_forwards_cbs = {
.cmd_add_cb = port_forwards_add_cb,
.cmd_del_cb = port_forwards_del_cb,
.cmd_query_cb = port_forwards_query_cb,
.cmd_change_cb = port_forwards_change_cb
};
tuya_router_reg_port_forwards_cb(&port_forwards_cbs);
...
}
新增端口映射规则,cmd_add_cb
回调会被触发。
VOID port_forwards_add_cb(CONST PORT_FORWARDS_RULE_T *rule_list)
{
PR_DEBUG("ruld_id:%d", rule_list->rule_id);
PR_DEBUG("dev_name:%s", rule_list->dev_name);
PR_DEBUG("ip_addr:%s", rule_list->ip_addr);
PR_DEBUG("rule_name:%s", rule_list->rule_name);
PR_DEBUG("dst_port:%d", rule_list->dst_port);
PR_DEBUG("src_port:%d", rule_list->src_port);
PR_DEBUG("proto:%s", rule_list->proto);
UINT_T num = get_rule_num();
port_forward_rule_node_t *new_node = (port_forward_rule_node_t *)malloc(sizeof(port_forward_rule_node_t));
memset(new_node, 0, sizeof(port_forward_rule_node_t));
memcpy(&new_node->rule, rule_list, sizeof(PORT_FORWARDS_RULE_T));
new_node->rule.rule_id = num;
tuya_list_add_tail(&new_node->node, &port_forward_rule_list);
PR_DEBUG("this is new, rule_id:%d!!!!", new_node->rule.rule_id);
}
(可选)某条端口映射规则被删除时,cmd_del_cb
回调会被触发。
VOID port_forwards_del_cb(CONST UINT_T id)
{
port_forward_rule_node_t *one_rule_node = NULL;
struct tuya_list_head *p = NULL;
struct tuya_list_head *n = NULL;
tuya_list_for_each_safe(p, n, &port_forward_rule_list) {
one_rule_node = tuya_list_entry(p, port_forward_rule_node_t, node);
if (one_rule_node->rule.rule_id == id) {
PR_DEBUG("deleted %d", id);
tuya_list_del(&one_rule_node->node);
free(one_rule_node);
port_forward_del = TRUE;
return;
}
}
PR_DEBUG("not found %d", id);
}
(可选)某条规则被修改时,cmd_chg_cb
回调会被触发。
VOID port_forwards_change_cb(CONST PORT_FORWARDS_RULE_T *rule_list)
{
PR_DEBUG("ruld_id:%d", rule_list->rule_id);
PR_DEBUG("dev_name:%s", rule_list->dev_name);
PR_DEBUG("ip_addr:%s", rule_list->ip_addr);
PR_DEBUG("rule_name:%s", rule_list->rule_name);
PR_DEBUG("dst_port:%d", rule_list->dst_port);
PR_DEBUG("src_port:%d", rule_list->src_port);
PR_DEBUG("proto:%s", rule_list->proto);
port_forward_change = TRUE;
port_forward_rule_node_t *one_rule_node = NULL;
struct tuya_list_head *p = NULL;
struct tuya_list_head *n = NULL;
tuya_list_for_each_safe(p, n, &port_forward_rule_list) {
one_rule_node = tuya_list_entry(p, port_forward_rule_node_t, node);
if (one_rule_node->rule.rule_id == rule_list->rule_id) {
memcpy(&one_rule_node->rule, rule_list, sizeof(PORT_FORWARDS_RULE_T));
strcpy(one_rule_node->rule.proto, rule_list->proto);
strcpy(one_rule_node->rule.rule_name, rule_list->rule_name);
PR_DEBUG("this is changed!, %d", one_rule_node->rule.rule_id);
return;
}
}
}
路由器上需要保存这些规则。
路由器设备为防止家庭 Wi-Fi 信息泄露,专门设置 Wi-Fi 为访客使用。
注册访客回调函数。示例如下:
OPERATE_RET user_router_srv_start(IN ty_cJSON *cfg)
{
OPERATE_RET op_ret = OPRT_OK;
...
/* guest network*/
TUYA_ROUTER_GEUST_NETWORK_CBS_S guest_network_cbs = {
.cfg_cb = guest_network_cfg_cb,
.query_cb = guest_network_query_cb
};
op_ret = tuya_router_reg_guest_network_cb(&guest_network_cbs);
...
}
其中 cfg_cb
处理 App 下发访客网络配置,在该回调中获取设置信息,示例如下:
VOID guest_network_cfg_cb(CONST GUEST_NETWORK_CFG_T *cfg)
{
PR_DEBUG("enable: %d", cfg->enable);
PR_DEBUG("ssid: %s", cfg->ssid);
PR_DEBUG("password: %s", cfg->password);
PR_DEBUG("period: %d", cfg->period_time);
}
其中 query_cb
为查询访客网络设置回调。收到该回调后,路由器需把访客网络信息上报,示例如下:
VOID guest_network_cfg_report(VOID)
{
GUEST_NETWORK_CFG_T guest_network_cfg = {
.enable = 1, /* enable:1 表示开启,0 表示关闭 */
.ssid = "test_ssid",
.password = "test_password",
.period_time = 0 /* 单位:小时 */
};
tuya_router_guest_network_query_resp(0, &guest_network_cfg);
}
在涂鸦开发者平台上创建路由器产品,一些功能是通过 DP 来实现的,说明如下:
DP ID | 代号 | 名称 | 数据说明 |
---|---|---|---|
1 | master_information | 主机设备信息 | - |
2 | upload_rate | 上传速率 | value 类型 DP 需上报。 |
3 | download_rate | 下载速率 | - |
4 | speed_test | 网速测试 | enum 类型 DP 需上报。 |
5 | name_24g | Wi-Fi 2.4G 名称,即设置 SSID | 设置完成后,string 类型 DP 需上报。 |
6 | signal_strength_24g | 2.4G 信号强度 | enum 类型 ("low","medium","high") DP 需上报。 |
7 | route_auth_24g | 2.4G 加密方式 | enum 类型 (none","wpa2psk","wpa_wpa2psk","wpa3_sae") 设置完成后,DP 需上报。 |
8 | switch_24g | Wi-Fi 2.4G 开关 | 设置完成后,DP 数据需上报。 |
9 | hide_24g | Wi-Fi 隐藏 2.4G 开关 | 设置完成后,DP 数据需上报。 |
10 | name_5G | Wi-Fi 5G 名称,即设置 SSID | 设置完成后,DP 数据需上报。 |
11 | signal_strength_5g | Wi-Fi 5G 信号强度 | enum 类型 ("low","medium","high") 设置完成后,DP 数据需上报。 |
12 | route_auth_5g | Wi-Fi 5G 加密方式 | enum 类型(none","wpa2psk","wpa_wpa2psk","wpa3_sae") ,设置完成后,DP 数据需上报。 |
13 | switch_5g | Wi-Fi 5G 开关 | 设置完成后,DP 数据需上报。 |
14 | hide_5g | Wi-Fi 隐藏 5G 开关 | 设置完成后,DP 数据需上报。 |
15 | Station_data | Station 数据 | 需调用 tuya_router_sta_data_parse 解析,具体可参考 Demo。 |
16 | switch_speed_limit | 限速开关 | 设置完成后,DP 数据需上报。 |
18 | internet_disc_switch | 断网开关 | 设置完成后,DP 数据需上报。 |
19 | access_ctrl_switch | 访问开关 | 设置完成后,DP 数据需上报。 |
20 | guest_ctrl_switch | 访客网络开关 | 设置完成后,DP 数据需上报。 |
23 | reboot_data | 重启开关 | JSON 字符串数据(数据格式见下方 reboot 说明),设置完毕后上报该 DP 。 |
24 | wps_switch | WPS 开关 | 设置完成后,DP 数据需上报。 |
25 | qos_set | QoS 设置 | JSON 字符串数据(数据格式见下方 QoS 说明),设置完毕后上报该 DP。 |
26 | fast_roaming_switch | 快速漫游开关 | 设置完成后,DP 数据需上报。 |
27 | port_forward_switch | 端口映射开关 | 设置完成后,DP 数据需上报。 |
28 | upnp_switch | UPNP 开关 | 设置完成后,DP 数据需上报。 |
29 | dhcp_set | DHCP 设置 | JSON 字符串数据(数据格式见下方 DHCP 说明),设置完毕后上报该 DP。 |
30 | dns_set | DNS 设置 | JSON 字符串数据(数据格式见下方 DNS 说明),设置完毕后上报该 DP。 |
31 | indicator | 指示状态灯 | 设置完成后,DP 数据需上报。 |
47 | dual_band | Wi-Fi 双频合一 | 设置完成后,DP 数据需上报。 |
QoS 设置,DP 类型为 string,接收到该 DP 数据后,需要 JSON 解析。格式如下:
{
"enable": 1,
"upload_speed": 112,
"down_speed": 789,
"rate_unit":"kb/s"
}
DHCP 设置,DP 类型为 JSON 字符串,接收到该 DP 数据后,需要 JSON 解析。格式如下:
{
dhcpset: "10.0.11.3"
}
DNS 设置,DP 类型为 JSON 字符串,格式如下:
{
"auto_mode": false,
"primary_dns_server": "8.8.8.8",
"secondary_dns_server": "4.4.4.4"
}
Reboot 重启设置,可通过 App 上设置路由器定时重启。该数据类型为 raw 类型,接收到该 DP 数据后,需要 JSON 解析。格式如下:
{
"immediate_restart": false,
"reboot_timers": [{
"enable": 1,
"weekdays": "0100000",
"time": "18:27"
}]
}
其中 weekdays
的第一位表示周日,第二位表示周一,以次类推。
其中 immediate_restart
表示是否立即重启。
true
:表示立即重启。false
:表示设置定时重启,reboot_timers
字段有效。该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈