此篇博客用来分析 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 帧
  1. 详细功能可以参考 WLAN 无线网络 09 - 管理帧
  2. 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 连接异常断开原因排查分析相关推荐

  1. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  2. 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...

    Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法 腾讯视频/爱奇艺/优酷/外卖 充值4折起 win10正式版LOL无法登录,提示"服务器连接异常"的问题,这该怎么 ...

  3. 服务器连接异常系统无法登录,科技教程:Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...

    如今越来越多的小伙伴对于Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类 ...

  4. adruino uno 蓝牙小车制作及蓝牙连接频繁断开原因

    作为adruino的自学小白,我喜欢在这博客中学习提升自己.发布该博客可能会用很多前辈的影子.我本身是想把我得学习过程分享给想入门的小白借鉴. 话不多说,材料准备走起. hc05蓝牙模块一个 l911 ...

  5. sqlserver 事务日志 异常增长原因排查_小白入门学习打日志

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 记得之前写过一篇:<阿里巴巴 Java开发手册 ...

  6. netty通讯--tcp心跳异常断开问题排查

    一.netty通讯中tcp心跳维持有以下两种: 1.TCP协议自带的心跳机制来实现,默认2h心跳检测频率. 2.应用层通过协议实现心跳机制. 二.最近的一个物联网项目,整体的通讯架构如下: 服务端和客 ...

  7. java如何处理tcp异常断开_针对TCP连接异常断开的分析

    我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...

  8. elementUI中el-table每行异常高度原因排查,累死

    理论上不单独设置高度的话,表格每一个应该是默认的高度才对,我说的没错吧, 但是请看实际情况: 这是默认情况下的高度为48 还有两外一个表格,我也没有设置高度,但是但是:这个高度竟然达到了71,我真的是 ...

  9. RTSP/ONVIF协议视频平台EasyNVR级联时上级平台播放视频卡顿的原因排查分析

    EasyNVR视频融合平台是基于RTSP/ONVIF协议的视频接入.处理及分发平台,可分发的视频流包括RTSP.RTMP.WS-FLV.HTTP-FLV,HLS.Webrtc等格式,能实现全终端.全平 ...

最新文章

  1. Python的优点?
  2. 数据结构——第一章线性表:01线性表的逻辑结构
  3. NeHe OpenGL教程 第三十六课:从渲染到纹理
  4. python中时间处理去空格去冒号_Python实用日期时间处理方法汇总
  5. wxpython 可视化开发pdf_MicroPython for the Internet of Things.pdf
  6. printf格式化输出类型
  7. matlab7.0 run,新手求救啊!!!matlab7.0在win7启动后命令窗口出现大段代码!
  8. 【JEECG_3.7.1】Online树控件的使用
  9. RestAPI的进化之路,后端MVVM模式或许来临,通过观察者模式,后端收集前端的GET类请求,主动推送数据变更到前端
  10. OpenCV中的级联分类器Cascade Classifier(面部识别)
  11. 从代码到上线, 云端Docker化持续交付实践
  12. SQL2K数据库开发七之表操作添加删除和修改列
  13. 五子棋游戏代码(完整版)
  14. 深度学习基础 - 直线
  15. java中人民币的符号怎么打_打印机打印人民币符号¥
  16. 237. 删除链表中的节点
  17. logoff user in window 2008
  18. 怎么卸载mysql????如何清理干净?
  19. 如何通过ADB命令的方式关闭华为系手机的emui系统更新升级?解决:error: no devices/emulators found
  20. OUT指令时,就进入了I/O端口读写周期

热门文章

  1. 2022北京高考数学压轴题21题的一种解答
  2. 淘宝客推广的优势 推广作用提高销量、转化率、测图测款
  3. 定义一个教师类输出他的基本信息,类和静态的练习--C#
  4. 赴美生子的一些调研——诚信是拒签之本,中国的月子中心在美是非法的,医疗和教育费用高...
  5. 爬虫_西电研究生教务系统_技术文档
  6. 论项目管理与可行性分析的重要性
  7. 重置 Mac 上的系统管理控制器 (SMC)
  8. 谁在用Python弹奏一曲东风破 - 第二期 - 蜂鸣器版
  9. 炼铁技术有哪些?普锐特冶金技术告诉你!
  10. ARM系统的寻址方式