ESP8266客户端请求JSON信息

物联网的最终是实时获取数据来控制物件完成相应的动作

esp8266作为服务端,产生json数据

    1. 实时读取A0、 D1、D2以及D3引脚的读数。
    2. 当有客户端请求时,通过响应信息将引脚读数和测试数据信息发送给客户端。


    信息发送格式为json格式。以下为该json信息的示例:

       该实例的解析使用官方提供的工具实现生成代码

{
  "info": {
    "name": "taichimaker",
    "url": "www.taichi-maker.com",
    "email": "taichimaker@163.com"
  },
  "digital_pin": {
    "d1": "1",
    "d2": "0",
    "d3": "1"
  },
  "analog_pin": {
    "a0": "500"
  }
}
/**
 * ESP8266客户端请求JSON信息,请求的数据是实时发生改变的
 * 由两块esp8266开发板来完成,一块是用于作为服务器,一块是用于客户端请求
 * 创建服务端来监控esp8266的实时引脚状态来控制,通过wifi局域网来访问
 */
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
//洪定义
#define buttonPin D3
//建立ESP8266WIFIMulti对象
ESP8266WiFiMulti wifiMulti;
//建立网络服务器对象,该对象用于响应HTTP请求,监听端口80
ESP8266WebServer esp8266_server(80);
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
 
  // 将引脚设置为输入上拉模式
  pinMode(D1, INPUT_PULLUP);
  pinMode(D2, INPUT_PULLUP);
  pinMode(buttonPin, INPUT_PULLUP);   // NodeMCU开发板按键连接在D3引脚上

  //通过addAp函数存储  WiFi名称       WiFi密码
  wifiMulti.addAP("nova", "wifi.danke.life");
  wifiMulti.addAP("taichi-maker2", "87654321");
   int i = 0;    
   //每隔一秒发送连接wifi直到wifi连接成功                             
  while (wifiMulti.run() != WL_CONNECTED) {  // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
    delay(1000);                             // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
    Serial.print(i++); Serial.print(' ');    // 将会连接信号最强的那一个WiFi信号。
  }                                          // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
                                             // 此处while循环判断是否跳出循环的条件。
  //打印服务端地址
  Serial.println(WiFi.localIP());           // NodeMCU的IP地址
  
  //网络建立成功后,就开始写被访问的规则
  esp8266_server.on("/",handleRoot);
  esp8266_server.begin();//启动网络服务
 
}

void loop() {
     //处理http服务器访问
     esp8266_server.handleClient();
}
void handleRoot(){//处理网站目录"/"的访问请求
  esp8266_server.send(200,"application/json",rootJson());
  }

String rootJson(){
  //const size_t capacity = JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(3)+140;
  const size_t capacity = JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(3)+140;
DynamicJsonDocument doc(capacity);

JsonObject info = doc.createNestedObject("info");
info["name"] = "taichimaker";
info["url"] = "www.taichi-maker.com";
info["email"] = "taichimaker@163.com";

JsonObject digital_pin = doc.createNestedObject("digital_pin");
digital_pin["d1"] = String(digitalRead(D1));
digital_pin["d2"] = String(digitalRead(D2));
digital_pin["d3"] = String(digitalRead(D3));
JsonObject analog_pin = doc.createNestedObject("analog_pin");
analog_pin["a0"] = String(analogRead(A0));
String jsonCode;
  serializeJson(doc,jsonCode);
  return jsonCode;
  }

客户端程序

 客户端的功能为:

   1. 向服务器端请求json数据信息
   2. 解析服务器端响应的json信息内容。
   3. 将解析后的数据信息显示于串口监视器
   4. 利用服务器端D3引脚(按键引脚)读数来控制客户端开发板上LED的点亮和熄灭

/**
 * 客户端主要的程序,通过获取服务端的数据解析输出到控制台
 * 主要的功能实现
 * 1. 向服务器端请求json数据信息
 * 2. 解析服务器端响应的json信息内容。
 * 3. 将解析后的数据信息显示于串口监视器
 * 4. 利用服务器端D3引脚(按键引脚)读数来控制客户端开发板上LED的点亮和熄灭
 */
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;           // 建立ESP8266WiFiMulti对象
 
const char* host = "192.168.43.163";   // 将要连接的服务器地址  
const int httpPort = 80;              // 将要连接的服务器端口  
void setup() {
  Serial.begin(9600);
  //设置开发板的引脚,设置为输出模式
   pinMode(LED_BUILTIN,OUTPUT);
   //设置为高电平模式,led点亮
   digitalWrite(LED_BUILTIN,HIGH);
   //设置连接WiFi
   wifiMulti.addAP("nova", "wifi.danke.life"); // 将需要连接的一系列WiFi ID和密码输入这里
   //连接WiFi
   int i=0;
   while(wifiMulti.run()!=WL_CONNECTED){
    delay(1000);
    Serial.print(i++);Serial.print(' ');
    }
     // WiFi连接成功后将通过串口监视器输出连接成功信息 
      Serial.println("");
      Serial.print("Connected to ");
      Serial.println(WiFi.SSID());              // WiFi名称
      Serial.print("IP address:\t");
      Serial.println(WiFi.localIP());           // IP
}

void loop() {
  //每隔3秒请求服务器
  httpRequest();
  delay(3000);
}
// 向服务器请求信息并对信息进行解析
void  httpRequest(){
   //创建对象
   WiFiClient client;
//   String httpRequest =String("GET /") + "HTTP/1.1\r\n" +
//                              "Host: " + host + "\r\n" +
//                              "Connection: close\r\n\r\n";
 String httpRequest = String("GET /") + " HTTP/1.1\r\n" + 
                              "Host: " + host + "\r\n" + 
                              "Connection: close\r\n\r\n";
   //连接服务器                 
    if (client.connect(host, 80)){
     Serial.println("connect Success!!");
    //向服务器发送http请求
    client.print(httpRequest);
    Serial.println("Sending request: ");
    Serial.println(httpRequest); 
    
    // 获取并显示服务器响应状态行 
    String status_response = client.readStringUntil('\n');
    Serial.print("status_response: ");
    Serial.println(status_response);
    
    // 使用find跳过HTTP响应头
    if(client.find("\r\n\r\n")){
       Serial.println("Found Header End. Start Parsing.");
      }
       parseInfo(client);
    }else{
       Serial.println(" connection failed!");
    }
 //断开客户端与服务器连接工作
  client.stop(); 
   
  }


void parseInfo(WiFiClient client){
  const size_t capacity = JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(3) + 140;
  DynamicJsonDocument doc(capacity);
   
  deserializeJson(doc, client);
  
  JsonObject info = doc["info"];
  const char* info_name = info["name"]; // "taichimaker"
  const char* info_url = info["url"]; // "www.taichi-maker.com"
  const char* info_email = info["email"]; // "taichimaker@163.com"
  
  JsonObject digital_pin = doc["digital_pin"];
  const char* digital_pin_d1 = digital_pin["d1"]; // "1"
  const char* digital_pin_d2 = digital_pin["d2"]; // "0"
  const char* digital_pin_d3 = digital_pin["d3"]; // "1"
  
  const char* analog_pin_a0 = doc["analog_pin"]["a0"]; // "500"

  String info_name_str = info["name"].as<String>();
  bool d3_bool = digital_pin["d3"].as<int>();

  Serial.print("info_name_str = ");Serial.println(info_name_str);
  Serial.print("d3_bool = ");Serial.println(d3_bool);


  if(d3_bool == 0){
    digitalWrite (LED_BUILTIN, LOW);
    }else{
      digitalWrite(LED_BUILTIN, HIGH);
      }
}

   可能在拼接访问路径可能会有问题!!!所以要注意

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ESP8266可以通过HTTP POST方法发送请求。具体步骤如下: 1. 首先需要连接到WiFi网络,可以使用ESP8266的WiFi库进行连接。 2. 然后需要创建一个HTTP客户端,可以使用ESP8266的HTTPClient库。 3. 设置HTTP请求的URL、请求头、请求体等参数。 4. 发送HTTP POST请求,可以使用HTTPClient库的post()方法。 5. 获取HTTP响应,可以使用HTTPClient库的getString()或getStream()方法。 下面是一个简单的示例代码: ``` #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { HTTPClient http; http.begin("http://example.com/api/data"); // 设置请求的URL http.addHeader("Content-Type", "application/json"); // 设置请求头 String requestBody = "{\"name\":\"John\",\"age\":30}"; // 设置请求体 int httpResponseCode = http.POST(requestBody); // 发送HTTP POST请求 if (httpResponseCode > ) { String response = http.getString(); // 获取HTTP响应 Serial.println("HTTP response: " + response); } else { Serial.println("HTTP request failed"); } http.end(); delay(500); } ``` ### 回答2: ESP8266是一款低成本、高性能Wi-Fi芯片。在物联网应用中,ESP8266广泛用于WiFi模块,它的高性价比使其成为市场上最受欢迎的WiFi芯片。 在开发物联网设备时,使用ESP8266可以快速实现设备与云端的数据通信。其中,HTTP Post请求是进行数据通信的一种常见方式,下面将介绍如何使用ESP8266对服务器发送HTTP Post请求ESP8266发送HTTP Post请求的基本流程如下: 1. 利用ESP8266连接到WiFi网络 在使用ESP8266发送HTTP Post请求之前,我们需要首先将ESP8266连接到WiFi网络。ESP8266可以通过AT指令设置WiFi网络配置,具体方式可以参考ESP8266官方文档,这里不再赘述。 2. 初始化HTTP POST请求ESP8266中,我们可以使用AT指令进行HTTP Post请求的初始化设置,具体指令如下: AT+CIPSTART=“TCP”,“<Server_IP>”,80 AT+CIPSEND=63 POST /url HTTP/1.1\r\n Host:<Server_IP>\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: <Content_Length>\r\n\r\n 3. 发送HTTP POST请求 在初始化HTTP Post请求后,我们需要将数据发送到服务器。在ESP8266中,我们可以使用AT+CIPSEND指令进行数据发送,如下所示: AT+CIPSEND <Content> 4. 关闭HTTP POST请求 当HTTP Post请求发送完成后,我们需要使用AT+CIPCLOSE指令关闭请求,以释放ESP8266的网络资源,具体指令如下: AT+CIPCLOSE 综上所述,ESP8266是一款性价比高的WiFi芯片,在物联网应用中得到了广泛应用。通过使用ESP8266发送HTTP Post请求,我们可以快速实现设备与云端的数据通信,从而实现数据的传输和控制。 ### 回答3: ESP8266是一款可编程的WiFi模块,可以实现WiFi联网控制。通过ESP8266可以实现HTTP POST请求发送数据。 HTTP POST请求是一种传输方式,可以向服务器发送数据。与GET请求不同的是,POST请求会向服务器上传数据,并且没有数据大小的限制。ESP8266作为客户端发送HTTP POST请求的步骤如下: 1.连接WiFi:使用ESP8266连接WiFi网络,建立网络连接。 2.创建HTTP POST请求:在连接到网络之后,ESP8266发送HTTP POST请求必须指定目标服务器的IP地址、端口号和请求的地址。可以通过ESP8266的AT命令序列创建HTTP POST请求,如下所示: AT+CIPSTART=”TCP”,”目标服务器IP地址”,端口号 AT+CIPSEND=POST请求长度 POST请求内容 (通过AT回车符指令完成) 在创建HTTP POST请求时,需要提供POST请求的长度和内容。请求内容的格式应该符合HTTP协议的规范,包括请求头和请求体。 3.发送HTTP POST请求:创建HTTP POST请求后,发送请求到服务器端,并等待服务器返回响应内容。 4.处理服务器响应:当服务器返回响应内容时,ESP8266需要处理服务器返回的信息ESP8266可以使用AT命令序列或编程方式进行控制。通过AT命令序列发送HTTP POST请求是一种相对简单的方式,但是具有一定的局限性。如果想实现更加灵活的功能和处理方式,可以选择编程方式来控制ESP8266。使用编程方式的好处是可以实现更加灵活和高效的功能和处理方式。例如,使用Arduino等开发板,可以直接通过代码控制ESP8266发送HTTP POST请求,并处理服务器端返回的响应数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值