首页 > 其他分享 >ESP8266做客户端

ESP8266做客户端

时间:2022-12-11 15:56:33浏览次数:58  
标签:ESP8266 pin client digital print Serial My 客户端

ESP8266做客户端

1. 传输单一的JSON信息
  • 程序思路

    程序目的:

    1. 解析服务器端传来的json信息
    2. 读取服务器端A0模拟引脚的状态,并串口输出
    3. 读取服务器端D3数字引脚的状态,并使得客户端LED_BUILTIN引脚状态与之相同,从而控制板上LED灯的亮灭状态

    引脚配置

    • pinMode()函数和digitalWrite()函数设置引脚模式配置引脚
    • Ps:服务器端D3数字引脚的状态判断可以使用?:三目运算符进行语法优化

    WiFi连接

    • 创建ESP8266WiFiMulti对象My_WifiMulti
    • My_WifiMulti.addAP() 连接WiFi,连接成功后串口输出

    网络服务:

    • 所有的网络服务都通过httpRequest完成,httpRequestloop()中循环执行

    • 首先创建WiFiClient对象My_Client

    • 发送请求头部分,将GETHostConnection三个参数整合到一个字符串httpRequest

    • 与服务器连接My_Client.connect(IP地址,端口号),可通过判断语句+串口验证是否已经连接上

    • 向服务器发送请求信息My_Client.print(请求头httpRequest)

    • 获取服务器响应状态My_Client,readStringUntil(\n),获取到的信息存储在一个字符串变量中

    • 使用find+if语句跳过HTTP响应头My_Client.find("\r\n\r\n")

    • 解析得到的json信息parseInfo(My_client)

    • 与服务器断开连接My_client.stop()

    json信息解析:

    • 依然是使用ArduinoJsong官网的在线工具。(详细请看:链接
    • 此时,ESP8266是充当客户端的角色,所以我们要将服务器端传过来的json信息反序列化,即选择deserializeJson(doc, My_client)
  • 程序

    #include <ArduinoJson.h>
    #include <ESP8266WiFi.h>
    #include <ESP8266WiFiMulti.h>
    
    ESP8266WiFiMulti My_WifiMulti;  //建立一个ESP8266WiFiMulti对象
    
    const char* host = "192.168.163.9";  //服务端地址
    const int httpPort = 80;             //服务端端口号
    void parseInfo(WiFiClient client);
    
    void setup() {
      Serial.begin(9600);
      Serial.print("\n");
    
      //客户端引脚初始配置
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, HIGH);
    
      //让ESP8266能够连上网 可同时设置多个Wifi
    
      My_WifiMulti.addAP("TPLINK2.4G", "@@@@@@@@");  // Wifi1
      My_WifiMulti.addAP("username2", "password");   // Wifi2
      My_WifiMulti.addAP("username3", "password");   // Wifi3
    
      int i = 0;
      Serial.print("\n-------------Connected Time:-------------\n");
    
      while (My_WifiMulti.run() != WL_CONNECTED) {
        Serial.print(i++);
        Serial.print("s-> ");
        delay(1000);
      }
      Serial.print("\n-------------WIFI connected successful!-------------\n");
    
      Serial.print("\n-------------WIFI Name:-------------");
      Serial.print(WiFi.SSID());  //连接的Wifi名称
      Serial.print("\n-------------ESP8266 IP address:-------------");
      Serial.print(WiFi.localIP());  //ESP8266在路由器中的IP地址
    }
    
    void loop() {
    
      httprequest("/");
      delay(2000);
      httprequest("/info");
      delay(2000);
      httprequest("/digital_pin");
      delay(2000);
    }
    
    void httprequest(String url)
    {
      WiFiClient client;
      String http_request = String("GET") + url + "HTTP/1.1\n" + "HOST:" + host + "\r\n" + "Connection:close\r\n\r\n";
    
      Serial.print("Connecting to");
      Serial.print(host);
    
      if (client.connect(host, 80)) 
    	{
        Serial.print("Connected Success");
    
        //向服务器发送http请求信息
        client.print(http_request);
        Serial.println("Sending request: ");
        Serial.println(http_request);
    
        //获取服务器响应状态
        String staus_response = client.readStringUntil('\n');
        Serial.print("status_response: ");
        Serial.println(staus_response);
    
        if (client.find("\r\n\r\n"))
        {
          Serial.print("Find the end of request header!");
          Serial.print("Start Parsing");
        }
        parseInfo(client);
      }
        else 
          Serial.print("Connected failed");
    
        client.stop();  //断开与服务器的连接
    }
    
    
    void parseInfo(WiFiClient client) {
    
      //-------------------------------以下程序来自于官网在线工具生成-------------------------------
      StaticJsonDocument<256> doc;
    
      DeserializationError error = deserializeJson(doc, client);
    
      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
      }
    
      JsonObject info = doc["info"];
      const char* info_name = info["name"];  // "caixvkun"
      const char* info_url = info["url"];    // "www.csdn.com"
      float info_time = info["time"];        // 2.5
    
      JsonObject digital_pin = doc["digital_pin"];
      const char* digital_pin_d1 = digital_pin["d1"];  // d1
      const char* digital_pin_d2 = digital_pin["d2"];  // d2
      const char* digital_pin_d3 = digital_pin["d3"];  // d3
      bool bool_digital_pin_d3 = bool(digital_pin_d3);
    
      const char* analog_pin_a0 = doc["analog_pin"]["a0"];  // "500"
      //-------------------------------以上程序来自于官网在线工具生成-------------------------------
    
      if(analog_pin_a0) //读取A0状态
        Serial.println("Server Json has analog_pin_a0: HIGH");
      else 
        Serial.println("Server Json has analog_pin_a0: LOW");
    
      if(bool_digital_pin_d3) //改变客户端D3状态
        digitalWrite(LED_BUILTIN,LOW);
      else
        digitalWrite(LED_BUILTIN,HIGH);
    }
    
  • 注意问题

    1. LED_BUILTIN不用define直接用
    2. Wifi连接操作是放在setup()函数里面的,不能放在这上面
    3. httprequest(String url)是个有参函数

标签:ESP8266,pin,client,digital,print,Serial,My,客户端
From: https://www.cnblogs.com/WuKaiXiong/p/ESP8266_Client.html

相关文章

  • tektont server/tekton dashboard部署/tkn 客户端工具安装使用
    部署tektonWEB界面​​https://tekton.dev/docs/getting-started/tasks/​​部署tektonDashborad​​https://tekton.dev/docs/dashboard/install/​​部署tkn客户端工具......
  • ctr客户端命令使用
    查看default命名空间当前有哪些容器ctrcontainerls终止t2default命名空间容器ctrtaskkillt2删除t2 default命名空间容器ctrcontainerrmt2查看k8s.io命名空间......
  • 查看Oracle某时刻的客户端IP连接情况
    1、查看每个oracle帐户的连接总数Sql代码 selectusername,count(username)fromv$sessionwhereusernameisnotnullgroupbyusername 2、缺省从v$session中不能......
  • web客户端websocket
    Websocke是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议在WebSocketAPI中浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的链接,并进行双向传......
  • oracle 客户端连接VBA模板使用教程
    首先解释一个VBA是什么。VBA全称:VisualBasicforApplications。我这里的是指办公软件excel中的VBA宏功能。Oracle中我们是可以多个客户端访问服务器端的。......
  • Linux系统zabbix_agentd客户端安装与配置
    官网下载zabbix安装包(zabbix安装包里包含了zabbix_agentd客户端安装包,我们只选择zabbix_agentd客户端安装) zbbix官网下载地址:  ​​http://www.zabbix.com/download​......
  • Mysql开启ssl加密协议及Java客户端配置操作指南
    Mysql开启ssl加密协议及Java客户端配置操作指南​​Mysql配置​​​​验证Mysql开启SSL​​​​Java客户端操作​​​​生成证书密码​​​​配置数据库连接​​​​工具配......
  • 腾讯企业邮箱imap/pop3/smtp服务器信息(用于客户端)
    腾讯企业邮箱支持pop/imap/exchange协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP/SMTP协议接收邮件服务器:imap.exmail.qq.com,使用SSL,端口号993发送邮件......
  • ClickHouse的客户端可视化连接工具DBeaver的安装及使用
    客户端连接(DBeaver)clickhouse由于其优异的查询性能,目前在大数据领域应用逐渐火热起来,由于navicat不支持clickhouse的可视化查询,我们就用DBeaver来代替navicat,这个工具可以说......
  • 基于Qt的桌面客户端组件化框架DT 开源啦
    这个是本人在工作中基于QT开发的组件化桌面开发框架,目前打算开源出来提供给大家,节省大家的开发时间和效率,希望对大家的开发有所帮助,也欢迎提出意见和改进建议1.为什么开源D......