智能家居系列

  • 1 目标
  • 2 代码演示
  • 2.1网页点亮LED
  • 2.2 给服务器发送消息
  • 3 效果展示


1 目标

本文将展示如何以WiFi作为联网方式,ESP8266WiFi模组作为客户端,网络调试助手作为TCP服务器,以TCP协议为基础,使用AT指令连接到网络调试助手。

  • 确保ESP8266可以连接至服务器(网络调试助手);
  • 可以正确的进行数据的收发。

2 代码演示

2.1网页点亮LED

/**********************************************************************
项目名称/Project          : 基本的服务器
程序名称/Program name     : Web_Server
程序目的/Purpose          : 搭建一个简单的网页,控制ESP8266点亮熄灭LED
***********************************************************************/
#include <ESP8266WiFi.h>      // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h> //  ESP8266WiFiMulti库
#include <ESP8266WebServer.h> //  ESP8266WebServer库

ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'

ESP8266WebServer esp8266_server(8080); // 建立ESP8266WebServer对象,对象名称为esp8266_server
                                     // 括号中的数字是网路服务器响应http请求的端口号
                                     // 网络服务器标准http端口号为80,因此这里使用80为端口号

// 添加几个可用的ap,WiFi重启后,自动连接信号最强的
void add_user_AP(void)
{
    //通过addAp函数存储  WiFi名称       WiFi密码
    wifiMulti.addAP("ChinaNet-J2Zt", "jjkanicd");
    wifiMulti.addAP("hh2", "87654321"); // 这3个WiFi网络名称分别是hh, hh2, hh3。
    wifiMulti.addAP("hh3", "13572468"); // 这3个WiFi的密码分别是12345678,87654321,13572468。
                                         // 此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。
}

// 等待连接成功
void wait_connect_ok(void)
{
    int i = 0;
    // wifiMulti.run()自动搜索addAP函数所存储的WiFi,并连接最强的那一个WiFi信号。
    // 连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。
    while (wifiMulti.run() != WL_CONNECTED)
    {
        delay(1000);
        Serial.print(i++);
        Serial.println('Waiting to connect to the network...');

    }
    Serial.println('Waiting to connect to the network1...');
}
// 打印连接信息
void print_connect_info(void)
{
    // WiFi连接成功后将通过串口监视器输出连接成功信息
    Serial.println('\n');           // WiFi连接成功后
    Serial.print("Connected to ");  // ESP8266开发板将通过串口监视器输出。
    Serial.println(WiFi.SSID());    // 连接的WiFI名称
    Serial.print("IP address:\t");  // 以及
    Serial.println(WiFi.localIP()); // ESP8266开发板的IP地址
}
//启动网络服务功能
void start_web_server(void)
{
    esp8266_server.begin();                                 // 启动网络服务
    esp8266_server.on("/", handleRoot);                     // 网站根目录,回调函数handleRoot
    esp8266_server.on("/led_contrl", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'
    esp8266_server.onNotFound(handleNotFound);              // 找不到,回调函数handleNotFound
    Serial.println("HTTP esp8266_server started"); //  告知用户ESP8266网络服务功能已经启动
}
void setup(void)
{
    Serial.begin(115200);           // 启动串口通讯
    pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
    // 添加几个可用的ap,WiFi重启后,自动连接信号最强的
    add_user_AP();
    
    Serial.println('start...');
    // 等待连接成功
    wait_connect_ok();
    // 打印连接信息
    print_connect_info();
    // 启动网络服务功能
    start_web_server();
}

/* 主循环 */
void loop(void)
{
    esp8266_server.handleClient(); // 处理http服务器访问
}

// 拼接显示网页
String show_html(bool station)
{
    String html = "<!DOCTYPE html>";
    html += "<html lang =\"zh-cn\">";
    html += "<head>";
    html += "<meta charset=\"UTF-8\">";
    html += "<title>LED_CONTRL</title>";
    html += "<style>";
    html += "* {padding: 0;margin: 0;vertical-align: top;}";
    html += "div {margin: 10px auto;width: 100px;}";
    if (!station)
        html += "span {display: inline-block;margin: 2px;background-color: blue;border-radius: 8px;width: 16px;height: 16px;}";
    else
        html += "span {display: inline-block;margin: 2px;background-color: black;border-radius: 8px;width: 16px;height: 16px;}";
    html += "input {width: 60px;height: 20px;}";
    html += "</style>";
    html += "<title>ESP8266-LED</title>";
    html += "</head>";
    html += "<body>";
    html += "<form action=\"/led_contrl\" method=\"post\">";
    html += "<div><span></span><input type=\"submit\" value=\"LED\"></div>";
    html += "</form>";
    html += "</body>";
    html += "</html>";
    return html;
}

// 设置网站根目录函数
void handleRoot()
{
    String html = show_html(digitalRead(LED_BUILTIN));
    //处理网站根目录“/”的访问请求
    esp8266_server.send(200, "text/html", html); // ESP8266开发板将调用此函数。
}

//处理LED控制请求的函数'handleLED'
void handleLED()
{
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // 改变LED的点亮或者熄灭状态
    esp8266_server.sendHeader("Location", "/");           // 跳转回页面根目录
    esp8266_server.send(303);                             // 发送Http相应代码303 跳转
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound()
{                                                             // 当浏览器请求的网络资源无法在服务器找到时,
    esp8266_server.send(404, "text/plain", "404: Not found"); // ESP8266开发板将调用此函数。
}

2.2 给服务器发送消息

#include <ESP8266WiFi.h>
const char* ssid = "ChinaNet-J2Zt";//wifi名称
const char* password = "jjkanicd";//wifi密码
const char* host="192.168.1.7";//服务器公网ip
WiFiServer server(8080);//开启80端口

void setup() {
  Serial.begin(115200);//开启串口监视器
  delay(10);
  Serial.print("Connecting to");
  Serial.println(ssid);
  WiFi.begin(ssid, password);//使用名称和密码链接wifi
  while (WiFi.status() != WL_CONNECTED) {//如果连接成功跳出循环,没成功则一直尝试连接
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();//开启服务器
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());//输出板子的ip
}

int value=0;
void loop() {
  Serial.print("Connecting to");
  Serial.println(host);
  WiFiClient client;//tcp连接
  const int httpPort=8080;//端口号
  if(!client.connect(host,httpPort)){//连接失败
    Serial.println("connection failed");
    Serial.println(WiFi.localIP());
    return;
  }
  //向服务器发送请求
  client.print("HelloServer!");
  //读取返回值
  while(client.available()){
    String line=client.readStringUntil('\r');
    Serial.print(line);
  }
  Serial.println();
  Serial.println("closing connection");
  delay(5000);
}

3 效果展示

智能家居控制系统编程 智能家居编程调试_嵌入式硬件