meshlite形成组网后,路由器断电再上电则不会在形成根节点

19969954097
Posts: 5
Joined: Tue Aug 13, 2024 7:23 am

meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby 19969954097 » Fri Jan 03, 2025 6:38 am

硬件设备:esp32-s3-wroom-1
开发环境:esp-idf v5.2.2
meshlite版本:0.10.6

官方您好,我最近在使用mesh-lite形成组网时,遇到了这样的问题:
我使用了10个设备进行组网,路由器先上电后,设备再上电,会形成组网,并出现根节点与路由器进行连接,之后我进行了一些测试:
1.如果设备先上电,路由器再上电,组网同样会形成,但是路由器的路由表会出现两个根节点设备的mac
2.如果正常路由器先上电,设备再上电,正常组网并进行数据传输一段时间后,将路由器断电20分钟以上,设备的打印是有重连的行为的,之后再次将路由器上电后,设备大概率就不会去连接路由器了,路由表也没有再出现过设备的mac地址。这个时候我如果ping一下服务器,设备则会在一段时间后就可以重新连接路由器,重新进行数据传输

这些现象我在官方的代码和文档中没有找到问题的原因,也没有好的解决办法,希望您能给我一些建议

下面是路由器断电一段时间之后,又上电,设备的一些打印信息
I (975836) wifi:starting SA query procedure with AP(e8:06:90:d2:11:b1)
I (975846) wifi:Send SA Query req with transaction id 577a
I (976046) wifi:Send SA Query req with transaction id 577b
I (976246) wifi:Send SA Query req with transaction id 577c
I (976446) wifi:Send SA Query req with transaction id 577d
I (976646) wifi:Send SA Query req with transaction id 577e
I (976846) wifi:Send SA Query req with transaction id 577f
I (976866) wifi:No response to 6 SA Queries, reset connection sending disassoc
I (976866) wifi:state: run -> init (d100)
I (976866) wifi:pm stop, total sleep time: 0 us / 20713160 us

I (1618416) wifi:<ba-add>idx:0 (ifx:0, d8:3b:da:54:7a:31), tid:0, ssn:0, winSize:64
I (1624346) wifi:new:<1,1>, old:<1,1>, ap:<1,1>, sta:<1,1>, prof:1
I (1624346) wifi:station: e8:06:90:d2:10:80 join, AID=1, bgn, 40U
I (1624406) wifi:new:<1,1>, old:<1,1>, ap:<1,1>, sta:<1,1>, prof:1
I (1624416) wifi:station: e8:06:90:d2:10:44 join, AID=2, bgn, 40U
I (1624426) wifi:new:<1,1>, old:<1,1>, ap:<1,1>, sta:<1,1>, prof:1
I (1624426) wifi:station: d8:3b:da:54:6b:c8 join, AID=3, bgn, 40U
I (1624506) bridge_wifi: STA Connecting to the AP again...
I (1624506) bridge_wifi: STA Connecting to the AP again...
I (1624516) bridge_wifi: STA Connecting to the AP again...
I (1624526) esp_netif_lwip: DHCP server assigned IP to a client, IP is: 192.168.5.2
I (1624556) esp_netif_lwip: DHCP server assigned IP to a client, IP is: 192.168.5.3
I (1624556) esp_netif_lwip: DHCP server assigned IP to a client, IP is: 192.168.5.4
I (1625546) wifi:<ba-add>idx:2 (ifx:1, e8:06:90:d2:10:80), tid:0, ssn:0, winSize:64
I (1625596) wifi:new:<1,1>, old:<1,1>, ap:<1,1>, sta:<1,1>, prof:1
I (1625596) wifi:station: d8:3b:da:54:7b:08 join, AID=4, bgn, 40U
I (1625606) wifi:<ba-add>idx:3 (ifx:1, d8:3b:da:54:6b:c8), tid:0, ssn:0, winSize:64
I (1625616) wifi:<ba-add>idx:4 (ifx:1, e8:06:90:d2:10:44), tid:0, ssn:0, winSize:64
I (1625616) bridge_wifi: STA Connecting to the AP again...
I (1625656) esp_netif_lwip: DHCP server assigned IP to a client, IP is: 192.168.5.5
I (1625656) Mesh-Lite: netif network segment conflict check
I (1625656) Mesh-Lite: netif network segment conflict check
I (1626686) Mesh-Lite: netif network segment conflict check
I (1626736) wifi:<ba-add>idx:5 (ifx:1, d8:3b:da:54:7b:08), tid:0, ssn:0, winSize:64

出现了设备加入的组网信息,但是网络组好后,连接不上服务器,无法进行数据传输,而且路由器的路由表看不到有根节点设备连接到路由器上

ESP_TianSW
Posts: 61
Joined: Wed Sep 23, 2020 12:19 pm

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby ESP_TianSW » Mon Jan 13, 2025 3:14 am

针对于问题 1.如果设备先上电,路由器再上电,组网同样会形成,但是路由器的路由表会出现两个根节点设备的mac。某段时刻存在多个根节点是有可能的,一般存在多个设备同时上电或者你说的这种情况,但是 mesh 内部的融合机制会在后续的运行中将这个 mesh 网络融合成一个根节点。

后面的日志建议提供一份完整的,从上电开始到出现问题的日志文件,仅截取一段日志看不出来问题原因。

19969954097
Posts: 5
Joined: Tue Aug 13, 2024 7:23 am

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby 19969954097 » Wed Jan 15, 2025 10:00 am

您好,感谢您的回复,下面是我复现我所述问题的过程和日志文件:
复现过程:
第一次复现:
1.首先将路由器第一次上电,等待网络形成
2.先上电一个设备作为根节点连接路由器,并开始打印日志
3.上电剩余9个设备,形成meshlite组网
4.组网形成5分钟后,第一次断电路由器,复现问题
5.路由器断电30分钟后,路由器第二次上电,设备在路由器第二次上电20分钟后能够重连路由器,问题复现失败

第二次复现:
6.在设备形成组网后,路由器进行第二次断电,断电时间为3小时
7.三小时后路由器第三次上电,设备等待四小时,并未实现meshlite组网,问题复现成功

补充:在第二次复现时,设备在4小时组网时,路由表内并未发现根节点连接路由器的情况
logs.txt
(3.13 MiB) Downloaded 41 times
logs.txt
(3.13 MiB) Downloaded 41 times
Attachments
路由器显示图片.png
路由器显示图片.png (168.35 KiB) Viewed 3152 times

ESP_TianSW
Posts: 61
Joined: Wed Sep 23, 2020 12:19 pm

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby ESP_TianSW » Fri Jan 17, 2025 2:49 am

我在日志中有观察到几点:
- 日志中有较为频繁的设置 wifi mode 信息,比如从 APSTA 模式变成 STA 模式,再变回为 APSTA 模式,这是应用层的某些操作吗?对于 mesh lite 方案来讲,每个设备都应时刻处于 APSTA mode,除非设置为叶子节点,或者达到最高层级。
- 我看设备运行过程中开着 blufi,mesh lite 方案因为要更多的依赖 softap,所以应该避免蓝牙在运行过程中使用,造成和 softap 的一些共存问题。

19969954097
Posts: 5
Joined: Tue Aug 13, 2024 7:23 am

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby 19969954097 » Fri Jan 17, 2025 3:46 am

感谢您的回复
-关于日志中的蓝牙打印,是mqtt上报时重连的打印函数使用错误,meshlite在运行时蓝牙并没有在运行
-meshlite应用层没有关于sta和apsta切换的操作,我的meshlite回调函数有读取当前工作模式的函数,但并没有更改当前的工作模式

这是我的代码
void get_wifimeshlite_info(void)
{
esp_err_t err;
// 获取网络信息
wifimeshlite_info.mesh_lite_level = esp_mesh_lite_get_level();
wifimeshlite_info.mesh_lite_id = esp_mesh_lite_get_mesh_id();
err = esp_mesh_lite_get_networking_mode(&wifimeshlite_info.mode);
if (err == ESP_OK)
{
// 成功获取到模式,可以根据 mode 的值进行处理
if (wifimeshlite_info.mode == ESP_MESH_LITE_ROUTER)
{
ESP_LOGI(TAG, "当前处于路由器模式");
}
else if (wifimeshlite_info.mode == ESP_MESH_LITE_MESH)
{
ESP_LOGI(TAG, "当前处于Mesh模式");
}
}
else
{
ESP_LOGE(TAG, "获取网络模式失败, 错误代码: %d", err);
}
wifimeshlite_info.child_node_number = esp_mesh_lite_get_child_node_number();
wifimeshlite_info.allowed_level = esp_mesh_lite_get_allowed_level();
wifimeshlite_info.disallowed_level = esp_mesh_lite_get_disallowed_level();
wifimeshlite_info.argot_number = esp_mesh_lite_get_argot();
wifimeshlite_info.Leaf_Node = esp_mesh_lite_is_leaf_node();
const char *category = esp_mesh_lite_get_device_category();
if (category != NULL)
{
// 使用 strncpy 并确保最后一位是 '\0'
strncpy(wifimeshlite_info.device_category, category, sizeof(wifimeshlite_info.device_category) - 1);
wifimeshlite_info.device_category[sizeof(wifimeshlite_info.device_category) - 1] = '\0'; // 确保字符串以空字符结尾
}
else
{
ESP_LOGE(TAG, "无法获取设备类别");
}

esp_ip_addr_t root_ip_addr;
char root_ip[16] = {0}; // 存储IP地址字符串

// 获取根节点的 IPv4 地址
err = esp_mesh_lite_get_root_ip(IPADDR_TYPE_V4, &root_ip_addr);

if (err == ESP_OK)
{
// 将 IP 地址转换为字符串形式
ip4addr_ntoa_r(&root_ip_addr.u_addr.ip4, root_ip, sizeof(root_ip));
ESP_LOGI(TAG, "Root node IP: %s", root_ip);

// 将 root_ip 保存到结构体中
strncpy(wifimeshlite_info.root_ip, root_ip, sizeof(wifimeshlite_info.root_ip) - 1);
wifimeshlite_info.root_ip[sizeof(wifimeshlite_info.root_ip) - 1] = '\0'; // 确保字符串以空字符结尾
}
else
{
ESP_LOGE(TAG, "Failed to get root IP");
}

ESP_LOGI(TAG, "level: %d", wifimeshlite_info.mesh_lite_level);
ESP_LOGI(TAG, "id: %d", wifimeshlite_info.mesh_lite_id);
ESP_LOGI(TAG, "mode: %d dBm", wifimeshlite_info.mode);
ESP_LOGI(TAG, "child_node_number: %d", wifimeshlite_info.child_node_number);
ESP_LOGI(TAG, "allowed_level: %d", wifimeshlite_info.allowed_level);
ESP_LOGI(TAG, "disallowed_level: %d", wifimeshlite_info.disallowed_level);
ESP_LOGI(TAG, "argot_number: %ld", wifimeshlite_info.argot_number);
ESP_LOGI(TAG, "root_ip: %s", wifimeshlite_info.root_ip);
ESP_LOGI(TAG, "Leaf_Node: %s", wifimeshlite_info.Leaf_Node ? "true" : "false");
ESP_LOGI(TAG, "device_category: %s", wifimeshlite_info.device_category);
}
static void wifimeshlite_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
wifi_event_sta_connected_t *event;
wifi_mode_t mode;
int password_fail = 0;
esp_err_t err;
int8_t tx_power;
switch (event_id)
{
case WIFI_EVENT_STA_START:
break;
case WIFI_EVENT_STA_CONNECTED:
get_wifimeshlite_info(); // 获取连接到的mesh——lite信息
mqtt_app_start(); // 启动MQTT服务
break;
case WIFI_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "meshlite掉线重连");
esp_mesh_lite_connect();
break;

case WIFI_EVENT_STA_BEACON_TIMEOUT:
esp_mesh_lite_disconnect();
break;

// case WIFI_EVENT_SCAN_DONE:
// break;
// case WIFI_EVENT_AP_STACONNECTED:
// break;
// case WIFI_EVENT_AP_STADISCONNECTED:
// break;
case WIFI_EVENT_STA_BSS_RSSI_LOW:
break;
case MESH_EVENT_ROOT_ADDRESS:
ESP_LOGI(TAG, "Device is root, configuring static IP.");
break;

case MESH_EVENT_PARENT_CONNECTED:
ESP_LOGI(TAG, "Device is connected to a parent node.");
break;

case MESH_EVENT_PARENT_DISCONNECTED:
break;
break;
default:
break;
}
return;
}

ESP_TianSW
Posts: 61
Joined: Wed Sep 23, 2020 12:19 pm

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby ESP_TianSW » Fri Jan 17, 2025 11:01 am

case WIFI_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "meshlite掉线重连");
esp_mesh_lite_connect();
break;

case WIFI_EVENT_STA_BEACON_TIMEOUT:
esp_mesh_lite_disconnect();
break;


需要注意一点的是,mesh 内部在 wifi 断开之后会执行重连逻辑,所以收到 WIFI_EVENT_STA_DISCONNECTED 不要执行 esp_mesh_lite_connect(); 去重连,,这样会和 mesh 内部造成冲突,从而影响正常功能。

另外 esp_mesh_lite_disconnect(); 也不要随便去调用,这个 API 将会断开当前的 sta wifi 连接,同时禁用掉 mesh 内部的重连逻辑,设备将会处于一个游离节点,除非再次主动调用 esp_mesh_lite_connect();

19969954097
Posts: 5
Joined: Tue Aug 13, 2024 7:23 am

Re: meshlite形成组网后,路由器断电再上电则不会在形成根节点

Postby 19969954097 » Mon Jan 20, 2025 3:02 am

好的,感谢您的回复,我再测试一下

Who is online

Users browsing this forum: No registered users and 10 guests