如何快速切换路由

kaisey
Posts: 78
Joined: Tue Mar 24, 2020 5:54 am

Re: 如何快速切换路由

Postby kaisey » Fri May 13, 2022 8:22 am

ESP_LJY wrote:
Thu May 12, 2022 8:01 am
是的,802.11kv 需要路由器支持。

第一次连接后保存了密钥信息,后面重连时候省略了计算时间,所以连接快。
连接新的 路由器,需要重新计算密钥,所以连接时间又变长了。
那这种情况下,我能否保存密钥,恢复密钥,加快切换路由的时间

因为在一些场景中, 就只在固定的几个路由器之间切换,

ESP_LJY
Posts: 58
Joined: Mon Sep 27, 2021 3:06 am

Re: 如何快速切换路由

Postby ESP_LJY » Fri May 13, 2022 9:03 am

kaisey wrote:
Fri May 13, 2022 8:22 am
ESP_LJY wrote:
Thu May 12, 2022 8:01 am
是的,802.11kv 需要路由器支持。

第一次连接后保存了密钥信息,后面重连时候省略了计算时间,所以连接快。
连接新的 路由器,需要重新计算密钥,所以连接时间又变长了。
那这种情况下,我能否保存密钥,恢复密钥,加快切换路由的时间

因为在一些场景中, 就只在固定的几个路由器之间切换,
底层会自动保存和恢复的,最多可以保存 5 个路由器密钥,你可以测试确认一下。

kaisey
Posts: 78
Joined: Tue Mar 24, 2020 5:54 am

Re: 如何快速切换路由

Postby kaisey » Fri May 13, 2022 9:28 am

我找不到刚才发的那帖子回复了,


我测试过了, 我吧信道和BSSID都设置好了,设置为静态IP
我先连接路由A(大概不到1秒时间),
然后断开,在连接路由B(也是大概不到1秒时间),
再断开,在连接路由A(还是大概不到1秒时间)

第2个场景
如果我连接路由A(大概1秒时间)
断开,再连接路由A(不到100MS)

这应该是没有保存了5个副本啊,如果有这个保存副本的功能保存能否让应用层做,毕竟5个太少了

ESP_LJY
Posts: 58
Joined: Mon Sep 27, 2021 3:06 am

Re: 如何快速切换路由

Postby ESP_LJY » Fri May 13, 2022 9:34 am

kaisey wrote:
Fri May 13, 2022 9:28 am
我找不到刚才发的那帖子回复了,


我测试过了, 我吧信道和BSSID都设置好了,设置为静态IP
我先连接路由A(大概不到1秒时间),
然后断开,在连接路由B(也是大概不到1秒时间),
再断开,在连接路由A(还是大概不到1秒时间)

第2个场景
如果我连接路由A(大概1秒时间)
断开,再连接路由A(不到100MS)

这应该是没有保存了5个副本啊,如果有这个保存副本的功能保存能否让应用层做,毕竟5个太少了
路由器都是加密还是不加密的?两个路由器名称一样吗?

kaisey
Posts: 78
Joined: Tue Mar 24, 2020 5:54 am

Re: 如何快速切换路由

Postby kaisey » Sat May 14, 2022 5:25 am

路由器都是加密的,账号密码什么的都不一样

ESP_LJY
Posts: 58
Joined: Mon Sep 27, 2021 3:06 am

Re: 如何快速切换路由

Postby ESP_LJY » Tue May 17, 2022 10:20 am

ESP_LJY wrote:
Fri May 13, 2022 9:34 am
kaisey wrote:
Fri May 13, 2022 9:28 am
我找不到刚才发的那帖子回复了,


我测试过了, 我吧信道和BSSID都设置好了,设置为静态IP
我先连接路由A(大概不到1秒时间),
然后断开,在连接路由B(也是大概不到1秒时间),
再断开,在连接路由A(还是大概不到1秒时间)

第2个场景
如果我连接路由A(大概1秒时间)
断开,再连接路由A(不到100MS)

这应该是没有保存了5个副本啊,如果有这个保存副本的功能保存能否让应用层做,毕竟5个太少了
路由器都是加密还是不加密的?两个路由器名称一样吗?
保存了5个副本是以前的代码设计。最新的代码我测试了一下,和你的情况一致,切到另一个路由之后需要重新计算密钥。这部分功能是底层代码支持的,稍后我们内部确认一下。

ESP_LJY
Posts: 58
Joined: Mon Sep 27, 2021 3:06 am

Re: 如何快速切换路由

Postby ESP_LJY » Wed May 18, 2022 7:42 am

ESP_LJY wrote:
Fri May 13, 2022 9:34 am
kaisey wrote:
Fri May 13, 2022 9:28 am
我找不到刚才发的那帖子回复了,


我测试过了, 我吧信道和BSSID都设置好了,设置为静态IP
我先连接路由A(大概不到1秒时间),
然后断开,在连接路由B(也是大概不到1秒时间),
再断开,在连接路由A(还是大概不到1秒时间)

第2个场景
如果我连接路由A(大概1秒时间)
断开,再连接路由A(不到100MS)

这应该是没有保存了5个副本啊,如果有这个保存副本的功能保存能否让应用层做,毕竟5个太少了
路由器都是加密还是不加密的?两个路由器名称一样吗?
确认了底层只保存一个路由器信息。可以自己修改 wpa_set_passphrase() 代码来保存多个路由器的 ssid 和 password 到 flash。
1. 保存路由器的 ssid 和 password 和 pmk(esp_wifi_sta_get_ap_info_prof_pmk_internal)到 flash.
2. 密钥计算耗时主要在pbkdf2_sha1(): https://github.com/espressif/esp-idf/bl ... pa.c#L2377 . 这里判断如果是保存过的路由器信息(ssid 和 password 相同),就不重新计算 pmk. 从保存的信息中获取 pmk.
3. flash 保存和读取可以参考 https://github.com/espressif/esp-idf/tr ... vs_rw_blob

kaisey
Posts: 78
Joined: Tue Mar 24, 2020 5:54 am

Re: 如何快速切换路由

Postby kaisey » Thu May 19, 2022 1:28 am

谢谢,我看了你说的那段代码,PMK应该是保存在一个esp_wifi_sta_get_prof_password_internal()的HEX字符串里,我在修改SSID和PASSWORD的时候修改这个缓冲区就OK了

但是这段代码还是有些不解的地方
1,if (esp_wifi_sta_get_reset_param_internal() != 0) {
esp_wifi_sta_get_reset_param_internal()是在什么时候为0,是没有重新设置SSID和PASSWORD的时候为0吗?
2,if (strlen((char *)esp_wifi_sta_get_prof_password_internal()) == 64) {
这句判断不是会一直正确吗?因为PMK我看都是32字节,这里不就是64吗,是在设置SSID和PASSWORD的时候这里会清空吗?

ESP_LJY
Posts: 58
Joined: Mon Sep 27, 2021 3:06 am

Re: 如何快速切换路由

Postby ESP_LJY » Thu May 19, 2022 10:01 am

kaisey wrote:
Thu May 19, 2022 1:28 am
谢谢,我看了你说的那段代码,PMK应该是保存在一个esp_wifi_sta_get_prof_password_internal()的HEX字符串里,我在修改SSID和PASSWORD的时候修改这个缓冲区就OK了

但是这段代码还是有些不解的地方
1,if (esp_wifi_sta_get_reset_param_internal() != 0) {
esp_wifi_sta_get_reset_param_internal()是在什么时候为0,是没有重新设置SSID和PASSWORD的时候为0吗?
2,if (strlen((char *)esp_wifi_sta_get_prof_password_internal()) == 64) {
这句判断不是会一直正确吗?因为PMK我看都是32字节,这里不就是64吗,是在设置SSID和PASSWORD的时候这里会清空吗?
纠正一下,PMK 保存在 esp_wifi_sta_get_ap_info_prof_pmk_internal() ,不是 esp_wifi_sta_get_prof_password_internal()。
1,if (esp_wifi_sta_get_reset_param_internal() != 0) {
esp_wifi_sta_get_reset_param_internal()是在什么时候为0,是没有重新设置SSID和PASSWORD的时候为0吗?
==> 对的
2,if (strlen((char *)esp_wifi_sta_get_prof_password_internal()) == 64) {
这句判断不是会一直正确吗?因为PMK我看都是32字节,这里不就是64吗,是在设置SSID和PASSWORD的时候这里会清空吗?
==> 这里是针对 password 是 64 位的情况,这种情况下也不会执行 pbkdf2_sha1。

最后,你只要关注 pbkdf2_sha1 执行的地方就可以,保存 ssid, password, pmk,并且判断是否需要执行 pbkdf2_sha1
1. 判断当前 ssid, password 是否已保存,如果已保存,就读取保存的 pmk,拷贝到 esp_wifi_sta_get_ap_info_prof_pmk_internal() 指向的缓冲区。不需要计算 pbkdf2_sha1
2. 如果当前 ssid, password 未保存,计算 pbkdf2_sha1,保存当前 ssid, password, 和计算后的 pmk,pmk从 esp_wifi_sta_get_ap_info_prof_pmk_internal() 指向的缓冲区读取。

当前的 ssid : 入参 ssid, sta_ssid->ssid, 都可以,是一样的
当前的 password: 入参 passphrase,或者 esp_wifi_sta_get_prof_password_internal() 都可以,是一样的
你也可以再确认一下。

kaisey
Posts: 78
Joined: Tue Mar 24, 2020 5:54 am

Re: 如何快速切换路由

Postby kaisey » Fri May 20, 2022 12:27 am

OK,明白了,谢谢解答,

Who is online

Users browsing this forum: GalaxyNeo, shiyu1024 and 29 guests