https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=521945102409&ns=1&abbucket=7#detail

手机一键配置esp8266上网,然后发送命令。

1 esp8266烧录代码

代码逐步添加,方便以后回看

1.1 一键自动配置连WIFI+固定IP

#include <ESP8266WiFi.h>
#define LED 2
  
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED, 0);
    delay(500);
    digitalWrite(LED, 1);
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());// WIFI 名   Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}
  
void setwifi(){ }
void setup()
{
  Serial.begin(115200);
  Serial.println("Start module");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);
setwifi();
  smartConfig(); IPAddress staticIP(192,168,1,22);
IPAddress gateway(192,168,1,22);
IPAddress subnet(255,255,255,0);
WiFi.config(staticIP, gateway, subnet);
Serial.print("Connected, IP change address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址
}
  
void loop()
{
 // delay(100);
 // Serial.println("Start module");
}

1.2 添加服务端 端口80

#include <ESP8266WiFi.h>
#define LED 2 WiFiServer server(80); void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED, 0);
    delay(500);
    digitalWrite(LED, 1);
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());// WIFI 名   Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}
  
void setwifi(){ }
void setup()
{
  Serial.begin(115200);
  Serial.println("Start module");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);
setwifi();
  smartConfig(); IPAddress staticIP(192,168,1,22);
IPAddress gateway(192,168,1,22);
IPAddress subnet(255,255,255,0);
WiFi.config(staticIP, gateway, subnet);
Serial.print("Connected, IP change address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址   server.begin();
  Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());
}
  
void loop()
{
  WiFiClient client = server.available();
 if (client)
  {
    Serial.println("\n[Client connected]");
    while (client.connected())
    {
      // read line by line what the client (web browser) is requesting
      if (client.available())
      {
        String line = client.readStringUntil('\r');
        Serial.print(line);
        // wait for end of client's request, that is marked with an empty line
        if (line.length() == 1 && line[0] == '\n')
        {
         // client.println(prepareHtmlPage());
 
           
          break;
        }
      }
    }
    delay(1); // give the web browser time to receive the data
 
    // close the connection:
    client.stop();
    Serial.println("[Client disonnected]");
  } }

  1.3 添加网页,游览器输入IP 返回网页

#include <ESP8266WiFi.h>
#define LED 2 WiFiServer server(80); void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED, 0);
    delay(500);
    digitalWrite(LED, 1);
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());// WIFI 名   Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
} // prepare a web page to be send to a client (web browser)
String prepareHtmlPage()
{
  String htmlPage =
     String("HTTP/1.1 200 OK\r\n") +
            "Content-Type: text/html\r\n" +
            "Connection: close\r\n" +  // the connection will be closed after completion of the response
            "Refresh: 5\r\n" +  // refresh the page automatically every 5 sec
            "\r\n" +
            "<!DOCTYPE HTML>" +
            "<html>" +
            "Analog input:  " + String(analogRead(A0)) +
            "</html>" +
            "\r\n";
  return htmlPage;
}
  
void setwifi(){ }
void setup()
{
  Serial.begin(115200);
  Serial.println("Start module");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);
setwifi();
  smartConfig(); IPAddress staticIP(192,168,1,22);
IPAddress gateway(192,168,1,22);
IPAddress subnet(255,255,255,0);
WiFi.config(staticIP, gateway, subnet);
Serial.print("Connected, IP change address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址   server.begin();
  Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());
}
  
void loop()
{
  WiFiClient client = server.available();
 if (client)
  {
    Serial.println("\n[Client connected]");
    while (client.connected())
    {
      // read line by line what the client (web browser) is requesting
      if (client.available())
      {
        String line = client.readStringUntil('\r');
        Serial.print(line);
        // wait for end of client's request, that is marked with an empty line
        if (line.length() == 1 && line[0] == '\n')
        {
          client.println(prepareHtmlPage());
 
           
          break;
        }
      }
    }
    delay(1); // give the web browser time to receive the data
 
    // close the connection:
    client.stop();
    Serial.println("[Client disonnected]");
  } }

  

1.4 添加 串口回传数据   电脑串口-esp-client-WIFI路由器-手机-sever

电脑串口 发送1

手机收到  49   (ASCLL码)

#include <ESP8266WiFi.h>
#define LED 2 WiFiServer server(80); void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED, 0);
    delay(500);
    digitalWrite(LED, 1);
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());// WIFI 名   Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
} // prepare a web page to be send to a client (web browser)
String prepareHtmlPage()
{
  String htmlPage =
     String("HTTP/1.1 200 OK\r\n") +
            "Content-Type: text/html\r\n" +
            "Connection: close\r\n" +  // the connection will be closed after completion of the response
            "Refresh: 5\r\n" +  // refresh the page automatically every 5 sec
            "\r\n" +
            "<!DOCTYPE HTML>" +
            "<html>" +
            "Analog input:  " + String(analogRead(A0)) +
            "</html>" +
            "\r\n";
  return htmlPage;
}
   void setup()
{
  Serial.begin(9600);
  Serial.println("Start module");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);   smartConfig(); IPAddress staticIP(192,168,1,4);
IPAddress gateway(192,168,1,4 );
IPAddress subnet(255,255,255,0);
WiFi.config(staticIP, gateway, subnet);
Serial.print("Connected, IP change address: ");
  Serial.println(WiFi.localIP());   // 分配的动态地址&自己设置的静态地址   server.begin();
  Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());
}
  
void loop()
{
  WiFiClient client = server.available();
 if (client)
  {
    Serial.println("\n[Client connected]");
    while (client.connected())
    {  if (Serial.available()) {
   Serial.print("1");
client.println(Serial.read());
  }
      // read line by line what the client (web browser) is requesting
      if (client.available())
      {         String line = client.readStringUntil('\r');
        Serial.print(line);
        // wait for end of client's request, that is marked with an empty line
        if (line.length() == 1 && line[0] == '\n')
        {
          client.println(prepareHtmlPage());
 
           
          break;
        }
      }
    }
    delay(1); // give the web browser time to receive the data
 
    // close the connection:
    client.stop();
    Serial.println("[Client disonnected]");
  } }

  

1.5被用一段代码 用于分割收到的命令,提取我们想要的数据

// First line of HTTP request looks like "GET /path HTTP/1.1"  // 收到的命令格式(可修改),解析跟着改
// Retrieve the "/path" part by finding the spaces
int addr_start = req.indexOf(' ');// 找到第一个空格
int addr_end = req.indexOf(' ', addr_start + 1); // 找到第二个空格
if (addr_start == -1 || addr_end == -1) {
Serial.print("Invalid request: ");
Serial.println(req);
return;
}
req = req.substring(addr_start + 1, addr_end);// 截取两个空格间字符
Serial.print("Request: ");
Serial.println(req);

 自动保存WIFI信息自渎取 http://blog.csdn.net/sadshen/article/details/47832551

1. 路由器参数的保存和查询

在DEMO中,设置完STATION模式后,就直接smartconfig。我们应当在smartconfig之前做一个参数判断,判断是否有保存的路由器信息。有保存,就连接路由器。没保存,才smartconfig。

void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version()); wifi_set_opmode(STATION_MODE);
smartconfig_start(smartconfig_done);
}

关于这个路由器参数存储,查了下官方手册,发现SDK还是很贴心的,已经有API可以直接保存和查询了,而不需要我们再去做flash参数存储。

两个关键API摆出来。

保存

wifi_station_set_config
功能:设置 WiFi station 接口的配置参数,并保存到 flash

查询

wifi_station_get_config_default
功能:查询 WiFi station 接口保存在 flash 中的配置参数。

三、代码操作

1.初始化时判断FLASH中是否存有有效的路由器参数。

void user_init(void)
{
wifi_set_opmode(STATION_MODE); wifi_station_get_config_default(&s_staconf);
if (os_strlen(s_staconf.ssid) != 0) {
os_printf("user_scan\n");
system_init_done_cb(user_scan);
} else {
os_printf("smartcfg\n");
smartconfig_start(smartconfig_done);
}
}

2.已存有路由器参数,去搜索看看AP当前是否存在。

void ICACHE_FLASH_ATTR
user_scan(void)
{
struct scan_config config; os_memset(&config, 0, sizeof(config)); config.ssid = s_staconf.ssid; wifi_station_scan(&config, user_scan_done); }

3.之后的操作就看个人处理了。

规范的处理是要开启一个线程,周期性检测AP的连接状态,处理不同的错误状态。我就不展开了。

1.6烧录程序

淘宝;https://detail.tmall.com/item.htm?id=536504922008&spm=a1z09.2.0.0.5e160c66c76b3g&_u=e1qf7bf52e27

产品资料:http://www.kbgogo.com/forum.php?mod=viewthread&tid=64&extra=

烧录时版型和参数选择

2 手机一键配置上网软件

2.1 网页资料

https://www.espressif.com/zh-hans/products/software/esp-touch/resources

 

下载ESPTOUCH软件:https://github.com/EspressifApp/IOT-Espressif-Apk
ESPTOUCH的源码:https://github.com/EspressifApp/EsptouchForAndroid

2.2 使用过程

2.1 手机连接路由器wifi,打开ESPTOUCH软件

自动读出WIFI名,手动输入密码,确认。

esp8266会自动接收这个信息存下,然后自动连接这个路由器wif.

至此,手机和esp8266都连在同一个WIFI下,在一个局域网内。

点击确认后,esp将连接信息打印给电脑串口。

3 手机测试软件

上个软件使得esp8266一键连上网,这个软件开始和esp通信发命令。

(两个软件可以合并在一个里面,再加上美化界面,此为调试阶段,故没有合并,能用就行。)

此时手机也连接在WIFI上,和esp在同个WIFI上,这个软件建立客户端请求访问。

IP 我们已经在esp的程序里固定,手机可以写死,用户不用自己输入。端口也是。

3.1 esp通过wifi接收到数据后,串口打印给电脑

之后的开发

1命令直接控制esp8266自身引脚,LED pwm,,,

2命令串口给另一个单片机,由它来执行任务。

样例: arduino 软串口收命令执行任务  http://www.cnblogs.com/kekeoutlook/default.html?page=2

3.2 手机网页打开地址192.168.1.22

之后的开发

可以开发网页控制,使用互联网远程控制,上述都只在一个局域网内。

Arduino IDE for ESP8266 项目云盒子(2)一键自配置+网页服务器的更多相关文章

  1. Arduino IDE for ESP8266 项目云盒子(3)外网访问

    互联网访问esp8266 https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=521945102409&ns=1& ...

  2. Arduino IDE for ESP8266 项目云盒子 (1)AP直接模式

    手机直接连接esp8266辐射的WIFI,通信. https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=5219451024 ...

  3. Arduino IDE for ESP8266 项目云盒子(4)组网

  4. Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端

    Arduio for esp8266  官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html 很有 ...

  5. Arduino IDE for ESP8266 项目(1) 点亮灯+按键LED+pwm

    官方文档 http://esp8266.github.io/Arduino/versions/2.1.0/doc/libraries.html 引脚口说明 http://yfrobot.com/thr ...

  6. Arduino IDE for ESP8266 项目(3)创建AP+STA

    官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html STA (客户端)手机连接路由器 S1 *简 ...

  7. Arduino IDE for ESP8266 项目(2)wifi扫描

    #include "ESP8266WiFi.h" void setup() { Serial.begin(115200); //设定WiFi为STA模式,如果先前已连接上AP,则与 ...

  8. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. Arduino IDE for ESP8266教程(0)配置IDE

    淘宝链接 https://detail.tmall.com/item.htm?id=540067174120&spm=a1z09.2.0.0.6f7c6509ujAvQs&_u=71q ...

随机推荐

  1. 内置函数二(lambda函数,sorted(),filter(),map(),递归函数,二分法查找)

    一,匿名函数 lambda表⽰示的是匿名函数. 不需要⽤用def来声明, ⼀一句句话就可以声明出⼀一个函数 语法:    函数名 = lambda 参数: 返回值 注意: 1. 函数的参数可以有多个. ...

  2. 学会4种备份MySQL数据库(基本备份方面没问题了)

    前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么 ...

  3. asp.net mvc5轻松实现插件式开发

    在研究Nopcommece项目代码的时候,发现Nop.Admin是作为独立项目开发的,但是部署的时候却是合在一起的,感觉挺好 这里把他这个部分单独抽离出来, 主要关键点: 确保你的项目是MVC5 而不 ...

  4. 如何对付运行时可能为 null 的 Record Type

    在 F# 中,Record Type 是无法表达 null 语义的,例如,一个 Record 变量不能够使用 null 字面量赋值,接收 nullable(这里并不是指 BCL 中的 Nullable ...

  5. 初学HTML-6

    表单:专门用来收集用户信息 表单元素:在HTML中,标签/标记/元素都是指HTML中的标签. eg:<a>a标签/a标记/a元素 浏览器中所以得表单标签都有特殊的外观和默认的功能. 格式: ...

  6. Android学习笔记----Java字符串MD5加密

    代码如下: /** * MD5单向加密,32位,用于加密密码,因为明文密码在信道中传输不安全,明文保存在本地也不安全 * * @param str * @return */ public static ...

  7. PyCharm实现高效远程调试代码

      PyCharm实现高效远程调试代码   (薛刚强)    为方便Python代码学习和项目开发,目前选择专业的 IDE 开发工具 ,如 PyCham.针对个人使用的技巧做个笔记,分享给大家,有描述 ...

  8. linux上部署engineercms、docker和onlyoffice实现文档协作

    等了好久,这次终于下决心在局域网部署了linux系统,并安装docker和load了onlyoffice,利用engineercms进行资料管理和文档协作. 我整理了完整文档,见我的网盘. engin ...

  9. recovery 恢复出厂设置失败Data wipe failed

    最近客户反馈,编译32位的android系统,在recovery中执行恢复出厂设置的时候失败了,失败的打印提升信息如下. Formatting /data... [ 2.191404] E:get_f ...

  10. HTTP的Referrer和Referrer Policy设置

    Referrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytics非常重要,可以 ...