文章目录
-
- 1、前言
-
- 1.1 配网原理
- 2、具体实现
-
- 2.1 ESP8266端代码(直接烧进去)
- 2.2 小程序端
- 2.3 具体步骤(主要是小程序端)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
快速导航
单片机菜鸟的博客快速索引(快速找到你要的)
重点说一下,麻烦三连点赞,你的点赞是博主创作的前进动力
。
1、前言
趁着2021,来撸新年的第一帖。
还记得前端时间,博哥研究了微信小程序的smartconfig,那么这次我们来继续深造一下,研究一下基于UDP服务的AP配网小程序(具体原理可以参考AP Web配网)。
理论知识必备:
- ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
- ESP8266开发之旅 网络篇⑩ UDP服务
- 深入学习ArduinoJson库 V5版本
1.1 配网原理
这里分为两个端,小程序端以及esp8266设备端。
- 设备端8266处于
AP-STA
方式,开启UDP服务
,服务IP默认为192.168.4.1
,端口号为8266
- 小程序端通过UDP请求把SSID和PWD发送到ESP8266,8266解析到参数之后连接到路由器。
2、具体实现
2.1 ESP8266端代码(直接烧进去)
此代码仅仅作为demo使用,仅供学习
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
char *ssid; //wifi名称
char *password = ""; //wifi密码
WiFiUDP Udp;
unsigned int localUdpPort = 8266; // 本地端口号
char incomingPacket[255]; // 接收缓冲区
#define AP_SSID "UDP_8266" //这里改成你的AP名字
#define AP_PSW "12345678" //这里改成你的AP密码 8位以上
//以下三个定义为调试定义
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
IPAddress local_IP(192,168,4,1);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);
void setup()
{
//以下为基本功能初始化,初始化串口和网络和LED
pinMode(LED_BUILTIN, OUTPUT);
//设置串口波特率,以便打印信息
DebugBegin(115200);
//延时2s 为了演示效果
delay(2000);
DebugPrint("Setting soft-AP configuration ... ");
//配置AP信息
WiFi.mode(WIFI_AP_STA);
DebugPrintln(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
//启动AP模式,并设置账号和密码
DebugPrint("Setting soft-AP ... ");
boolean result = WiFi.softAP(AP_SSID, AP_PSW);
if(result){
DebugPrintln("Ready");
//输出 soft-ap ip地址
DebugPrintln(String("Soft-AP IP address = ") + WiFi.softAPIP().toString());
//输出 soft-ap mac地址
DebugPrintln(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
}else{
DebugPrintln("Failed!");
}
DebugPrintln("Setup End");
//以下开启UDP监听并打印输出信息
Udp.begin(localUdpPort);
Serial.printf("Now listening UDP port %d\n", localUdpPort);
}
void loop()
{
int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
if (packetSize) // 有数据可用
{
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255); // 读取数据到incomingPacket
if (len > 0) // 如果正确读取
{
sendCallBack("{\"code\":0}"); //设备成功收到信息
delay(2000);
incomingPacket[len] = 0; //末尾补0结束字符串
Serial.printf("UDP packet contents: %s\n", incomingPacket);
DebugPrintln(F("parseMqttResponse"));
StaticJsonBuffer<100> jsonBuffer;
// StaticJsonBuffer 在栈区分配内存 它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替
// DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(incomingPacket);
if(!root.success()){
DebugPrintln(F("parse failed"));
return;
}else{
#ifdef DEBUG
// 格式化打印json
root.prettyPrintTo(Serial);
#endif
DebugPrintln(F("parse success"));
sendCallBack("{\"code\":1}");
delay(500);
String ssid = root["ssid"];
unsigned int port = root["port"];
String pwd = root["password"];
//启动STA模式,并连接到wifi网络
DebugPrint(F("ssid:"));
DebugPrintln(ssid);
DebugPrint(F("pwd:"));
DebugPrintln(pwd);
WiFi.begin(ssid, pwd);
DebugPrint(String("Connecting to ")+ssid);
//判断网络状态是否连接上,没连接上就延时1s,并且打出一个点,模拟连接过程
unsigned int retry = 0;
while (WiFi.status() != WL_CONNECTED){
delay(1000);
DebugPrint(".");
retry++;
if (retry == 60) {
// basically die and wait for WDT to reset me
sendCallBack("{\"code\":3}");
while(1);
}
ESP.wdtFeed();
yield();
}
sendCallBack("{\"code\":2}");
DebugPrintln("");
DebugPrint("Connected, IP address: ");
//输出station IP地址,这里的IP地址由DHCP分配
DebugPrintln(WiFi.localIP());
}
}
}
}
void sendCallBack(const char *buffer){
DebugPrint(F("send rsp:"));
DebugPrintln(buffer);
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(buffer); //回复内容
Udp.endPacket();
}
这里需要注意几个点:
- 必须是STA-AP模式,AP模式下固定了IP地址
- UDP服务的端口 8266
2.2 小程序端
博主这里直接提供源码(群文件也有),麻烦给个start,谢谢。
Github源码地址 https://gitee.com/wubo1/wx-apconfig
直接把源码导入小程序开发者工具即可使用。。。
2.3 具体步骤(主要是小程序端)
-
先来一个注意简介
-
输入你想8266要连接的wifi热点
-
输入8266开启的热点,也就是设备端代码AP热点
-
等待配网结果
这里涉及到小程序与8266设备端的交互,需要返回一些code给到小程序来更新进程。这些code包括:
{ \"code\":0} 表示 8266收到了UDP连接信息
{ \"code\":1} 表示 8266解析到SSID和PWD
{ \"code\":2} 表示连接路由成功
{ \"code\":3} 表示连接路由失败
如果没有任何意外,理论上可以看到8266串口打印具体调试信息:
完美。。。。。。。。。。。。。。