路由器管理

更新时间:2024-03-01 07:40:34下载pdf

本文描述如何通过 App 对路由器进行管理,例如 Wi-Fi 设置、访客 Wi-Fi、家长控制、路由器 Mesh 组网、端口映射以及路由器下设备管理等功能。

路由器配网

通过 App 选择网关中控、路由器以及路由器配网方式,根据 App 引导,选择路由器 Wi-Fi 热点。当发现路由器设备后,需要配置路由器链接 WAN 的方式,当前支持 PPPOE、DHCP 以及静态 IP 地址设置三种方式。配置完毕后,路由器会链接到外网,路由器激活到涂鸦平台。

  1. 通过函数 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);
        ...
    }
    
  2. 当 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);
    }
    
  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);
        ...
    }
    

路由器下设备管理

对路由器下设备进行控制管理,例如展示路由器下设备列表、网络信息、以及控制设备上传以及下载的速率。

  1. 通过 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);
        }
        ...
    }
    
  2. 通过 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;
        }
    }
    
  3. 通过 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 的黑白名单,以及允许访问外网的时间段。

设置家长控制

  1. 家长控制设备列表通过 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);
    }
    
  2. 通过 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);
        ...
    }
    
  3. 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"
    }]
    
    • enable1 表示该条规则开启,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 组网

路由器之间可以组成 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);
}

主从路由器 OTA 升级

通过 App 可以给 Mesh 主从路由器进行升级。

OTA 升级

  1. 注册主从路由器 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);
        ...
    }
    
  2. 当 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);
    }
    

    主从路由器固件需上传到涂鸦 IoT 开发平台。

  3. 如果有新固件可以更新,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 上报。

固件 HMAC 校验

主从路由器从 URL 地址拉取固件到设备本地。

  1. 校验 file_size 匹配文件大小是否合法。
  2. 计算拉取固件的 SHA256 值,转换成大写。
  3. 使用设备 UUID 作为密钥,计算 HMAC-SHA256 值,将该值与 HMAC 对比,确认固件是否合法。

参考的 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 对路由器进行端口映射的设置。

  1. 通过函数 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);
        ...
    }
    
  2. 新增端口映射规则,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);
    }
    
  3. (可选)某条端口映射规则被删除时,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);
    }
    
  4. (可选)某条规则被修改时,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);
}

路由器功能点说明

在涂鸦 IoT 开发平台上创建路由器产品,一些功能是通过 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 字段有效。
    • 立即重启与定时重启可同时存在,互不影响。当立即重启执行时,如果已存在定时重启,则定时重启功能继续执行。