Page 1 of 1

ESP32-C3 mesh lite方案疑问

Posted: Wed Aug 30, 2023 5:51 am
by YSY65536
您好,请问当mesh-lite网络通过外网连接上服务器,服务器下发数据后,是以广播的形式发布的吗,如果是,能不能实现让服务器指定发送给mesh网络中的客户端呢

Re: ESP32-C3 mesh lite方案疑问

Posted: Thu Aug 31, 2023 6:55 am
by YSY65536
追问:在esp-mesh-lite ----local_control文件下,添加recv函数接收服务器下发信息,每次只有根节点能够接收到信息,子节点无法收到,且在根节点使用esp_mesh_lite_send_broadcast_msg_to_child()函数依旧不能将信息广播到子节点

Re: ESP32-C3 mesh lite方案疑问

Posted: Tue Sep 05, 2023 8:17 am
by ESP_TianSW
YSY65536 wrote:
Wed Aug 30, 2023 5:51 am
您好,请问当mesh-lite网络通过外网连接上服务器,服务器下发数据后,是以广播的形式发布的吗,如果是,能不能实现让服务器指定发送给mesh网络中的客户端呢
对于 mesh 中每个节点来说,其可以主动连接外部的 server,和外部的 server 发起通信,外部的 server 也可以回复子节点信息。但是外部 server 不可以在链接未建立起来时向内部节点通信,因为内部节点拿到的内网 ip(就像我们的电脑可以正常访问某个网页服务器,网页服务器也会正常返回给我们消息一样,但是网页服务器无法直接在链接未建立起来时访问我们电脑或者给我们传输数据)。同时也很难做到外部 client 直接连接内部节点的 server,涉及到 portmap ,过程将会十分复杂。

如果是外部的 sever 回复给子节点的数据,子节点将会直接收到,其上层节点或者根节点应用层是无感的。

Re: ESP32-C3 mesh lite方案疑问

Posted: Tue Sep 05, 2023 8:28 am
by ESP_TianSW
YSY65536 wrote:
Thu Aug 31, 2023 6:55 am
追问:在esp-mesh-lite ----local_control文件下,添加recv函数接收服务器下发信息,每次只有根节点能够接收到信息,子节点无法收到,且在根节点使用esp_mesh_lite_send_broadcast_msg_to_child()函数依旧不能将信息广播到子节点
esp_mesh_lite_send_broadcast_msg_to_child 是我们借助我们内部写的一套通信接口开放出来的一些实现节点间通信的 API,具体外部实现逻辑可以参考 https://github.com/espressif/esp-mesh-l ... esh_lite.c

请注意:esp_mesh_lite_send_broadcast_msg_to_child 仅会将数据发送给其下层节点,若想要根节点下面所有节点都收到该广播,需要在每层节点的接收父节点广播的 cb 里面再做一层转发。

Code: Select all

esp_err_t esp_mesh_lite_broadcast_info(void)
{
    cJSON *item = cJSON_CreateObject();
    if (item) {
        uint32_t random_number = 123456;
        printf("number: %"PRIu32"", random_number);
        cJSON_AddNumberToObject(item, "number", random_number);
        esp_mesh_lite_try_sending_msg("broadcast", NULL, MAX_RETRY, item, &esp_mesh_lite_send_broadcast_msg_to_child);
        cJSON_Delete(item);
    }

    return ESP_OK;
}

static cJSON* broadcast_process(cJSON *payload, uint32_t seq)
{
    static uint32_t last_recv_seq;

    if (last_recv_seq != seq) {

        cJSON *found = cJSON_GetObjectItem(payload, "number");
        uint32_t number = found->valueint;
        printf("number: %"PRIu32"", number);

        cJSON *item = cJSON_CreateObject();
        if (item) {
            cJSON_AddNumberToObject(item, "number", number);
            esp_mesh_lite_try_sending_msg("broadcast", NULL, MAX_RETRY, item, &esp_mesh_lite_send_broadcast_msg_to_child);
            cJSON_Delete(item);
        }

        last_recv_seq = seq;
    }
    return NULL;
}

static const esp_mesh_lite_msg_action_t node_report_action[] = {
    {"broadcast", NULL, broadcast_process},

    {NULL, NULL, NULL} /* Must be NULL terminated */
};