ESP8266开发之旅 小程序篇④ 基于UDP服务的AP配网小程序

   日期:2021-01-03     浏览:368    评论:0    
核心提示:文章目录1、前言1.1 配网原理2、具体实现2.1 ESP8266端代码(直接烧进去)2.2 小程序端2.3 具体步骤(主要是小程序端)授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。快速导航单片机菜鸟的博客快速索引(快速找到你要的)重点说一下,麻烦三连点赞,你的点赞是博主创作的前进动力。1、前言趁着2021,来撸新年的第一帖。还记得前端时间,博哥研究了微信小程序的smartconfig

文章目录

    • 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串口打印具体调试信息:


完美。。。。。。。。。。。。。。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服