ESP32 Micropython进行Smargconfig配网

AP手机连接热地点神烦。记得乐鑫有smartconfig,可以用微信配网优先选择这个,在使用过程中遇到一些坑,记录下来:

实现的步骤:

1)编译带smartconfig的固件:

参考三十大叔的文章:伟大的micropython smartconfig 配网它来了!!!_esp32 micropython 智能配网_三十岁开始学编程的大叔的博客-CSDN博客

有2个要注意的点

a) 配网代码没有重置状态,会导致如果密码出错,除了reset没其他办法,其实修改一下启动命令就好,把状态清理一下就可以重复配网了

STATIC mp_obj_t smartconfig_start(void)
{
	found_ssid_and_password = false;	// 标记为未获取
	ESP_ERROR_CHECK(esp_smartconfig_stop());	// 先停止
    initialise_wifi();
    return mp_const_none;
}

b) 固件编译适用于micropython 1.20及以下的版本,以上的版本Makefile位置不对了,要改一下,另外1.20以上是使用idf5.0.2以上版本,目前稳定性还不确定
 

2)micropython配网部分:
micropython配网可以直接参考大叔的文章,但是有几个要注意的点:
a) 如果采用协程开发,部分代码要修改,主要是sleep部分的
b) 要获取wifi状态时,必须先disconnect()断开才能获取到正确的状态,注意disconnect是一个过程,需要监测状态,提供一个状态监测代码(协程版)
 

async def wait_for(func: func_type, *, timeout_ms=10000, sleep_ms=100) -> bool:
    """
    一般性检查状态超时,使用方法例如:
    await wait_for(lambda: station.isconnected())
    :param func: 执行表达式,返回True终止检测,返回False继续检测
    :param sleep_ms: 检测间隔
    :param timeout_ms: 总超时毫秒
    :return: False为超时,True为func成功
    """
    start = utime.ticks_ms()
    while not func():
        if utime.ticks_diff(utime.ticks_ms(), start) > timeout_ms:
            return False
        await asyncio.sleep_ms(sleep_ms)
    return True

连接的过程:

            is_success = await wait_for(lambda: station.isconnected() and self.stop_falg == NO_STOP, sleep_ms=500)
            if not is_success:
                station.disconnect()   # 没连上,断开,断开
                await wait_for(lambda: not station.isconnected())   # 等断开
                if self.stop_falg == USER_STOP:  # 被点停止按钮终止的
                    self.log_it('用户停止配网')
                elif station.status() == network.STAT_WRONG_PASSWORD:   # 这个状态没法收到
                    self.log_it('密码错误')
                    self.stop_falg = ERROR_STOP
                elif station.status() == network.STAT_NO_AP_FOUND:
                    self.log_it(f'没找到 {ssid}')
                    self.stop_falg = ERROR_STOP
                elif station.status() == network.STAT_HANDSHAKE_TIMEOUT:
                    self.log_it(f'握手超时')
                    self.stop_falg = ERROR_STOP
                elif station.status() == network.STAT_BEACON_TIMEOUT:
                    self.log_it(f'连接超时')
                    self.stop_falg = ERROR_STOP
                elif station.status() in (8, 15):
                    self.log_it(f'密码鉴权失败')
                    self.stop_falg = ERROR_STOP
                elif station.status() == network.STAT_ASSOC_FAIL:
                    self.log_it(f'未知错误')
                    self.stop_falg = ERROR_STOP
                else:
                    self.log_it(f'连接失败 {station.status()}')    # 例如密码长度不够
                self.log_it(f'连接已终止')
                self.wifi_stat_img.set_file(f'/icons/cancel.bmp', True)

            # 连接成功后的动作


 

在最新的固件测试时,发现鉴权错并没有返回官方的STAT_WRONG_PASSWORD,而是返回的8或15,不知道为什么,所以就有上面的代码

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
esp32micropython是为ESP32系列微控制器提供的Micropython文档。Micropython是一种精简的Python编程语言版本,专门针对嵌入式系统而设计。ESP32是一款功能强大的微控制器,可用于物联网设备、嵌入式系统和机器人等应用。 esp32micropython文档详细介绍了如何在ESP32上使用Micropython进行开发。它涵盖了Micropython的基础知识、语法和语言特性,以及ESP32的硬件特性和功能。文档包括以下主题: 1. 安装和设置:文档详细说明了如何安装Micropython固件和开发环境,以及如何将固件烧录到ESP32微控制器上。 2. Micropython语法:文档提供了Micropython的语法和语言特性的详细介绍,包括变量、数据类型、条件语句、循环语句和函数等。 3. ESP32硬件功能:文档介绍了ESP32的硬件特性和功能,包括GPIO、串口通信、WiFi和蓝牙等。 4. Micropython库:文档介绍了可以在ESP32上使用的各种Micropython库,包括用于GPIO控制、网络通信和传感器读取等功能。 5. 示例和项目:文档提供了许多实际的示例和项目,展示了如何在ESP32上使用Micropython进行各种应用开发,例如控制LED灯、读取温湿度传感器和连接到云平台等。 通过阅读esp32micropython文档,开发人员可以快速了解如何使用MicropythonESP32进行开发,并利用ESP32的强大功能去构建各种物联网应用和嵌入式系统。该文档提供了全面的资源和指导,为开发者提供了一个良好的起点,以便探索和开发基于ESP32的项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值