ESP Wi-Fi 连接异常断开原因排查分析
此篇博客用来分析 ESP Wi-Fi 连接异常断开的现象。
1 Wi-Fi 连接的过程
以下是一段 Wi-Fi 顺利连接过程的 log。其中可以清晰的看出 state 的转移(init-> auth -> assoc -> run)。进入 run 状态后,立刻就是 4 way handshake 过程。这其中每个过程出问题,都会让 state 直接转移到 init 状态。并且给出对应的原因。
[2020-06-16 20:52:41] I (18074) wifi:new:<13,2>, old:<13,2>, ap:<13,2>, sta:<13,0>, prof:13
[2020-06-16 20:52:41] I (18075) wifi:state: init -> auth (b0)
[2020-06-16 20:52:41] I (18084) wifi:state: auth -> assoc (0)
[2020-06-16 20:52:41] I (18091) wifi:state: assoc -> run (10)
[2020-06-16 20:52:41] I (18096) wpa: <EAPOL>state:6
[2020-06-16 20:52:41] I (18097) wpa: <EAPOL>receiving the 1/4 EAPOL-Key, state:6
[2020-06-16 20:52:41] I (18105) wpa: <EAPOL>state:7
[2020-06-16 20:52:41] I (18106) wpa: <EAPOL>receiving the 3/4 EAPOL-Key, state:7
[2020-06-16 20:52:41] I (18106) wifi:connected with HUAWEI-B311-62AD, aid = 2, channel 13, BW20, bssid = 44:55:c4:3a:62:ad
2 Wi-Fi 连接 & 运行中出错分析
Wi-Fi 连接 & 运行中出错都会让状态转移到 init,并且 log 里会有 16 进制数表示,后两位表示收到的管理帧的类型代码,前两位表示 Reason。举例如下:
wifi:state: run -> init (c800)
此时错误原因是 c8,对应收到的管理帧是 00。错误原因也可以在代码中实现打印。ESP-IDF 里的 station 示例 改动如下:
static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {wifi_event_sta_disconnected_t *disconnected = (wifi_event_sta_disconnected_t*) event_data;ESP_LOGE(TAG, "Disconnect reason : %d", disconnected->reason);if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {esp_wifi_connect();s_retry_num++;ESP_LOGI(TAG, "retry to connect to the AP");} else {xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}ESP_LOGI(TAG,"connect to the AP fail");} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));s_retry_num = 0;xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);}
}
其中以下两行为添加(改动)的部分:
wifi_event_sta_disconnected_t *disconnected = (wifi_event_sta_disconnected_t*) event_data;ESP_LOGE(TAG, "Disconnect reason : %d", disconnected->reason);
Wi-Fi 连接异常打印的原因 log 如下:
I (11062) wifi station: retry to connect to the AP
I (11062) wifi station: connect to the AP fail
E (13112) wifi station: Disconnect reason : 201
常见的帧类型代码有 00 (什么都没收到,表示超时)、A0(disassoc)、B0(auth)和 C0(deauth)。前两位的原因可以从 Wi-Fi Reason Code 里查看。后两位可以直接从管理帧代码里查看。
常见管理帧如下:
名称 | 代码 | 功能 |
---|---|---|
ASSOC_REQ | 0X00 | 关联请求帧 |
ASSOC_RESP | 0X10 | 关联请求回复帧 |
REASSOC_REQ | 0X20 | 再关联请求帧 |
REASSOC_RESP | 0X30 | 再关联请求回复帧 |
PROBE_REQ | 0X40 | 探测请求帧 |
PROBE_RESP | 0X50 | 探测请求回复帧 |
BEACON | 0X80 | 信标帧 |
ATIM | 0X90 | |
DISASSOC | 0XA0 | 解关联帧 |
AUTH | 0XB0 | 认证帧 |
DEAUTH | 0XC0 | 解认证帧 |
ACTION | 0XD0 | 不需要 ack 的 Action 帧 |
- 详细功能可以参考 WLAN 无线网络 09 - 管理帧
- ASSOC_REQ 的代码是 00 ,但是 ASSOC_REQ 不会从 STA 上发出,所以 00 被用来当作超时的代码
3 实例分析
3.1 Auth 过程出错
这里有一段 Auth 过程出错的 log。
I (15211) wifi:new:<13,2>, old:<13,0>, ap:<13,2>, sta:<13,0>, prof:13
I (15212) wifi:state: init -> auth (b0)
W (15275) [main, 288]: device login is not ready.
W (15775) [main, 288]: device login is not ready.
I (16213) wifi:state: auth -> init (200)
I (16213) wifi:new:<13,0>, old:<13,2>, ap:<13,2>, sta:<13,0>, prof:13
I (16214) [mwifi, 176]: Parent is disconnected, reason: 2
可以看出,Auth 过程失败了,状态转移到了 init,并且括号里给出数字 200。根据上述过程分析,后两位 00 表示超时,前两位是 02(0 被省略了),表示 AUTH_EXPIRE。合起来就是 Auth 超时。
3.2 Assoc 过程出错
这里是一段 Assoc 过程出错的 log。
I (11562) wifi:new:<13,2>, old:<13,2>, ap:<13,2>, sta:<13,0>, prof:13
I (11562) wifi:state: init -> auth (b0)
I (11568) wifi:state: auth -> assoc (0)
W (11773) [main, 288]: device login is not ready.
W (12273) [main, 288]: device login is not ready.
I (12569) wifi:state: assoc -> init (400)
I (12570) wifi:new:<13,0>, old:<13,2>, ap:<13,2>, sta:<13,0>, prof:13
I (12570) [mwifi, 176]: Parent is disconnected, reason: 4
可以看出,状态转移到 init 后括号里给出的数字是(400),同理,4 表示 ASSOC_EXPIRE,意味着 Assoc 超时。
3.3 其他常见数字示例(log 略)
- (6c0): c0 是 deauth,6 表示 not_authed。当时 ESP32 处于 STA 模式,意味着收到了来自 AP 的 deauth 帧。AP 告诉 STA 还没有 auth。
- (c800): 00 是超时,c8 十进制数是 200,表示 beacon timeout。合起来就是 STA 侧收不到来自 AP 的 beacon 帧了。
3 总结
通过以上的过程分析,就可以通过 Wi-Fi 的 log 看出断开的原因,即使应用层没有在事件处理函数里打印 disconnected 里的 reason。但是这也不是万能的,想要找出更深层次的原因,例如数字(200、400)出现的原因,就只能抓取空中的 802.11 无线帧来看了,对应的抓包教程参考如下:
- Ubuntu 下的 wireshark 安装与使用(使用无线网卡)
- 乐鑫 Wireshark 使用指南
注:抓包是最好不要设置 Wi-Fi 的密码,这样方便后续分析。
ESP Wi-Fi 连接异常断开原因排查分析相关推荐
- java如何处理tcp异常断开_(转)TCP连接异常断开检测
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法 腾讯视频/爱奇艺/优酷/外卖 充值4折起 win10正式版LOL无法登录,提示"服务器连接异常"的问题,这该怎么 ...
- 服务器连接异常系统无法登录,科技教程:Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
如今越来越多的小伙伴对于Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类 ...
- adruino uno 蓝牙小车制作及蓝牙连接频繁断开原因
作为adruino的自学小白,我喜欢在这博客中学习提升自己.发布该博客可能会用很多前辈的影子.我本身是想把我得学习过程分享给想入门的小白借鉴. 话不多说,材料准备走起. hc05蓝牙模块一个 l911 ...
- sqlserver 事务日志 异常增长原因排查_小白入门学习打日志
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 记得之前写过一篇:<阿里巴巴 Java开发手册 ...
- netty通讯--tcp心跳异常断开问题排查
一.netty通讯中tcp心跳维持有以下两种: 1.TCP协议自带的心跳机制来实现,默认2h心跳检测频率. 2.应用层通过协议实现心跳机制. 二.最近的一个物联网项目,整体的通讯架构如下: 服务端和客 ...
- java如何处理tcp异常断开_针对TCP连接异常断开的分析
我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...
- elementUI中el-table每行异常高度原因排查,累死
理论上不单独设置高度的话,表格每一个应该是默认的高度才对,我说的没错吧, 但是请看实际情况: 这是默认情况下的高度为48 还有两外一个表格,我也没有设置高度,但是但是:这个高度竟然达到了71,我真的是 ...
- RTSP/ONVIF协议视频平台EasyNVR级联时上级平台播放视频卡顿的原因排查分析
EasyNVR视频融合平台是基于RTSP/ONVIF协议的视频接入.处理及分发平台,可分发的视频流包括RTSP.RTMP.WS-FLV.HTTP-FLV,HLS.Webrtc等格式,能实现全终端.全平 ...
最新文章
- Python的优点?
- 数据结构——第一章线性表:01线性表的逻辑结构
- NeHe OpenGL教程 第三十六课:从渲染到纹理
- python中时间处理去空格去冒号_Python实用日期时间处理方法汇总
- wxpython 可视化开发pdf_MicroPython for the Internet of Things.pdf
- printf格式化输出类型
- matlab7.0 run,新手求救啊!!!matlab7.0在win7启动后命令窗口出现大段代码!
- 【JEECG_3.7.1】Online树控件的使用
- RestAPI的进化之路,后端MVVM模式或许来临,通过观察者模式,后端收集前端的GET类请求,主动推送数据变更到前端
- OpenCV中的级联分类器Cascade Classifier(面部识别)
- 从代码到上线, 云端Docker化持续交付实践
- SQL2K数据库开发七之表操作添加删除和修改列
- 五子棋游戏代码(完整版)
- 深度学习基础 - 直线
- java中人民币的符号怎么打_打印机打印人民币符号¥
- 237. 删除链表中的节点
- logoff user in window 2008
- 怎么卸载mysql????如何清理干净?
- 如何通过ADB命令的方式关闭华为系手机的emui系统更新升级?解决:error: no devices/emulators found
- OUT指令时,就进入了I/O端口读写周期