我这其实只是实验和搬运,还是感谢伟大的walkline群主,他弄好的,我只是负责搬运发布给新手看。
之前一大堆人问我配网的事儿,输入下wifi名称密码这么麻烦吗,好吧,有求必应,之前的配网是通过ap模式建立热点来搞定的,确实不够优雅,现在智能配网他来了!

首先纯mpy解决不了,别想了,因为mpy的network不支持混合模式,无法解析网络数据,门都给你焊死了!
所以要自己打固件,方便顾及小白,我直接上代码了:
改动地方有两处:
1 ports/esp32/main/CMakeLists.txt
${PROJECT_DIR}/machine_sdcard.c
下面一行 大约84行左右
插入一行新的

${PROJECT_DIR}/smartconfig.c

2 新建 ports/esp32/smartconfig.c
内容为

#include "py/obj.h"
#include "py/runtime.h"#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_smartconfig.h"static EventGroupHandle_t s_wifi_event_group;static const int ESPTOUCH_DONE_BIT = BIT1;
static const char *TAG = "smartconfig";static int found_ssid_and_password = false;
static uint8_t ssid[33] = {0};
static uint8_t password[65] = {0};
static uint8_t type = -1;
static uint8_t token = 0;static void smartconfig_task(void * parm);static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE) {ESP_LOGI(TAG, "Scan done");} else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL) {ESP_LOGI(TAG, "Found channel");} else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD) {ESP_LOGI(TAG, "Got SSID and password");smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data;memcpy(ssid, evt->ssid, sizeof(evt->ssid));memcpy(password, evt->password, sizeof(evt->password));type = evt->type;token = evt->token;ESP_LOGI(TAG, "SSID:%s", ssid);ESP_LOGI(TAG, "PASSWORD:%s", password);ESP_LOGI(TAG, "TYPE:%d", type);ESP_LOGI(TAG, "TOKEN:%d", token);found_ssid_and_password = true;xEventGroupSetBits(s_wifi_event_group, ESPTOUCH_DONE_BIT);}
}static void initialise_wifi(void)
{s_wifi_event_group = xEventGroupCreate();ESP_ERROR_CHECK(esp_event_loop_create_default());ESP_ERROR_CHECK(esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));xTaskCreate(smartconfig_task, "smartconfig_task", 4096, NULL, 3, NULL);
}static void smartconfig_task(void * parm)
{EventBits_t uxBits;ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS));smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_smartconfig_start(&cfg));while (1) {uxBits = xEventGroupWaitBits(s_wifi_event_group, ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY); if(uxBits & ESPTOUCH_DONE_BIT) {ESP_LOGI(TAG, "smartconfig over");ESP_ERROR_CHECK(esp_smartconfig_stop());vTaskDelete(NULL);}}
}STATIC mp_obj_t smartconfig_start(void)
{initialise_wifi();return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(smartconfig_start_obj, smartconfig_start);STATIC mp_obj_t smartconfig_success(void)
{return mp_obj_new_bool(found_ssid_and_password);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(smartconfig_success_obj, smartconfig_success);STATIC mp_obj_t smartconfig_info(void)
{mp_obj_t info[] = {mp_obj_new_str((const char *)ssid, strlen((const char *)ssid)),mp_obj_new_str((const char *)password, strlen((const char *)password)),mp_obj_new_int(type),mp_obj_new_int(token)};return mp_obj_new_tuple(4, info);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(smartconfig_info_obj, smartconfig_info);STATIC const mp_rom_map_elem_t smartconfig_module_globals_table[] = {{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_smartconfig)},{MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&smartconfig_start_obj)},{MP_ROM_QSTR(MP_QSTR_success), MP_ROM_PTR(&smartconfig_success_obj)},{MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&smartconfig_info_obj)},{MP_ROM_QSTR(MP_QSTR_TYPE_UNKNOWN), MP_ROM_INT(-1)},{MP_ROM_QSTR(MP_QSTR_TYPE_ESPTOUCH), MP_ROM_INT(SC_TYPE_ESPTOUCH)},{MP_ROM_QSTR(MP_QSTR_TYPE_AIRKISS), MP_ROM_INT(SC_TYPE_AIRKISS)},
};STATIC MP_DEFINE_CONST_DICT(smartconfig_module_globals, smartconfig_module_globals_table);const mp_obj_module_t smartconfig_user_cmodule = {.base = {&mp_type_module},.globals = (mp_obj_dict_t *)&smartconfig_module_globals,
};MP_REGISTER_MODULE(MP_QSTR_smartconfig, smartconfig_user_cmodule);

完事儿了,make吧
make好了之后就可以import smartconfig了,测试py在此:

from utime import sleep
import network
import socket
import smartconfigdef inet_pton(ip_str:str):'''convert ip address from string to bytes'''ip_bytes = b''ip_segs = ip_str.split('.')for seg in ip_segs:ip_bytes += int(seg).to_bytes(1, 'little')return ip_bytesdef send_ack(local_ip, local_mac):'''sent ack_done event to phone'''udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)data = smartconfig.info()[3].to_bytes(1, 'little') + local_macport = 10000 # airkiss portif smartconfig.info()[2] == smartconfig.TYPE_ESPTOUCH:data += inet_pton(local_ip)port = 18266 # esptouch portprint(
f"""- sending ack:type: {'esptouch' if smartconfig.info()[2] == smartconfig.TYPE_ESPTOUCH else 'airkiss'}port: {port}data: {data}length: {len(data)}
""")for _ in range(20):sleep(0.1)try:udp.sendto(data, ('255.255.255.255', port))except OSError:passprint('- ack was sent')station = network.WLAN(network.STA_IF)
station.active(True)print('- start smartconfig...')
smartconfig.start()print('- waiting for success...')
while not smartconfig.success():sleep(0.5)print('- got smartconfig info')
ssid, password, sc_type, token = smartconfig.info()
print(smartconfig.info())print('- connecting to wifi...')
station.connect(ssid, password)while not station.isconnected():sleep(0.5)
print('- wifi connected')while station.ifconfig()[0] == '0.0.0.0':sleep(0.5)
print('- got ip')
print(station.ifconfig())send_ack(station.ifconfig()[0], station.config('mac'))

运行后提示等待配网,这时打开微信——小程序——搜airkiss配网 有个esp模组airkiss配网那个,或者关注乐鑫公众号——产品资源——airkiss设备
配网吧 然后会发现esp32 自动获取wifi密码并连接了

emmm。。。肯定还有人问我固件,我打了个esp32的,需要的自己来拿吧
esp32自动配网固件

伟大的micropython smartconfig 配网它来了!!!相关推荐

  1. ESP_12S模块-SmartConfig配网

    SmartConfig配网 常见配网方式 1.目标设备设置为AP模式,移动设备连上目标设备AP之后,移动设备通过HTTP协议将室内WiFi账号与密码发送给目标设备,最后目标设备连上室内WIFI 2.S ...

  2. 验证可用的ESP32/8266配网方式,开源代码,web配网,smartconfig配网

    web配网 设备内做了个小web服务器通过网页交换SSID和PWD.这个方式比较友好,不依赖外部app或小程序,保密性更好,产品可用性更好(苹果等个别手机不能打开配网页面可直接浏览器登陆192.168 ...

  3. SmartConfig配网之微信AirKiss配网——AT指令

    文章目录 前言 第一章 介绍 第二章 固件烧录 第三章 操作步骤 微信AirKiss配网 总结 联系我们 前言 上一篇文章我们介绍了乐鑫的ESP-Touch软件完成SmartConfig配网功能,本篇 ...

  4. 微信小程序Smartconfig配网实现

    SmartConfig配网小程序开发 操作场景 基本原理 设备进入 Wi-Fi 混杂模式(promiscuous mode)以监听捕获周围的 Wi-Fi 报文.由于设备暂未联网,且 Wi-Fi 网络的 ...

  5. 微信小程序 airkiss 配网,SmartConfig配网,ap配网教程

    第一步,下载配网程序到esp8266 arduinoIDE开发: esp8266程序下载可参考:https://bemfa.blog.csdn.net/article/details/11771752 ...

  6. ESP8266 SmartConfig一键配网

    ESP8266 SmartConfig一键配网   Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指定的热点或路由器,并加入后者所建立的 ...

  7. stm32 esp8266配网-smartConfig和BT串口方式配网

    stm32 esp8266 ota系列文章: stm32 esp8266 ota-快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级-tcp模拟http ...

  8. ESP32 SmartConfig 微信扫码配网

    ESP32 SmartConfig 微信扫码配网 刚接触esp32时,自己写过用esp内置web界面进行无线账号密码的设置,为了简化开发流程,本次研究SmartConfig这东西,ESP系列的smar ...

  9. ESP8266-01模块接入巴法云,SmartConfig智能配网,设置断电记忆模式,可以使用米家控制和普通开关控制

    文章目录 前言 Demo下载地址 一.项目介绍 1.开关控制方式: 2.SmartConfig配网: 3.重置配网: 4.断电记忆模式切换: 5.通过MQTT设备云方式接入网络 二.使用步骤 1.文件 ...

  10. ESP32一键配网------smartconfig

    本文内容 使用smart_config例程,使用乐鑫ESPTouch APP或者微信公众号配网. 主流WiFi配网方式介绍 1) SoftAP配网 ESP32 会建立一个 WiFi 热点(AP模式), ...

最新文章

  1. 求二维数组最大子数组
  2. [转]Webkit内核探究【2】——Webkit CSS实现
  3. php变量与数据类型,php中变量与数据类型讲解
  4. 提高数据中心空间使用率,助力数字新基建
  5. [Embeding-1]Efficient Estimation of Word Representations in Vector Space 译文
  6. 【网址收藏】win10 VirtualBox安装CentOS 7教程
  7. java文件比较_Java 比较两个任意文件是否相同
  8. 智能优化算法:黄金正弦算法 -附代码
  9. 转:Scrapy(爬虫框架)入门教程
  10. Delphi接入科大讯飞语音合成SDK
  11. C语言中判断素数的几种方法
  12. 基于二叉链表的树结构相等的判断
  13. docker部署java项目_JAVA项目如何通过Docker实现持续部署
  14. 数学建模——主成分分析入门及SPSS使用
  15. 输入你的密码来连接到_手机无线网络可以连接但上不了网如何解决【详解】
  16. 软件缺陷定位☞西门子数据集介绍
  17. 云控系统php源码,xrkmontor字符云监控系统php源码 v2.5
  18. 贴片电解电容正负极区分
  19. python namedtuple默认值_python 使用 namedtuple
  20. HADOOP HA之NameNode HA集群配置与应用

热门文章

  1. HTML 边框和背景设置
  2. 解决Linux中Ubuntu16.04声音一直静音的方法
  3. 用java输出一个心型图案_开发工程师的浪漫--java打印心形图案
  4. 浏览器被hao123篡改怎么办?
  5. STM32时钟--基于正点原子STM32视频教程
  6. ESXi 6.7 封装驱动(Intel-I219V使用非vib的离线包驱动格式)
  7. 【洛谷P2000】拯救世界
  8. 图片rar 加密文件
  9. 用js判断图片地址是否有效
  10. 漫漫Java学习路,第十四天