ESP8266客户端请求服务端JSON信息

服务端

访问服务端的80端口, 可以请求到D3脚状态,来控制客户端的LED


@Controller
public class IndexControll {
    @RequestMapping("/")
    @ResponseBody
    String index() {
        String str = "{\n" +
                "  \"info\": {\n" +
                "    \"name\": \"taichimaker\",\n" +
                "    \"url\": \"www.taichi-maker.com\",\n" +
                "    \"email\": \"taichimaker@163.com\"\n" +
                "  },\n" +
                "  \"digital_pin\": {\n" +
                "    \"d1\": \"1\",\n" +
                "    \"d2\": \"0\",\n" +
                "    \"d3\": \"1\"\n" +
                "  },\n" +
                "  \"analog_pin\": {\n" +
                "    \"a0\": \"500\"\n" +
                "  }\n" +
                "}";

        return str;
    }
}

 

客户端

/**********************************************************************

程序目的/Purpose          : 
本实例用于演示esp8266的json数据通讯。
操作测试本程序需要使用一台8266开发板作为为客户端。  服务器端用的是java程序
本程序为服务器程序,功能如下:
 
1. 实时读取A0,D1,D2以及D3引脚的读数。
2. 当有客户端请求信息时,将会通过响应将引脚读数等信息发送给客户端。
3. 服务器在发送响应信息时,会根据客户端的需求而有选择性地发送响应信息。
4. 信息发送格式为json格式。建立json过程使用arduinojson serialize
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
20200511      CYNO朔           001        移除handleNotFound以精简示例代码
***********************************************************************/
#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   //  ESP8266WiFiMulti库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库
#include <ArduinoJson.h>        //  ArduinoJson库
 
#define buttonPin D3            // 按钮引脚D3
 
ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
 
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
 
IPAddress local_IP(192, 168, 2, 234); // 设置ESP8266-NodeMCU联网后的IP
IPAddress gateway(192, 168, 2, 1);    // 设置网关IP(通常网关IP是WiFI路由IP)
IPAddress subnet(255, 255, 255, 0);   // 设置子网掩码
IPAddress dns(192,168,2,1);           // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP)
         
void setup(){
  Serial.begin(9600);          // 启动串口通讯
  Serial.println("");
 
  // 将引脚设置为输入上拉模式
  pinMode(D1, INPUT_PULLUP);
  pinMode(D2, INPUT_PULLUP);
  pinMode(buttonPin, INPUT_PULLUP);   // NodeMCU开发板按键连接在D3引脚上
   
  // 设置开发板网络环境
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("Failed to Config ESP8266 IP"); 
  } 
 
  //通过addAp函数存储  WiFi名称       WiFi密码
  wifiMulti.addAP("Mrmiss", "Zh1020.."); // 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。
  wifiMulti.addAP("taichi-maker2", "87654321"); // 这3个WiFi网络名称分别是taichi-maker, taichi-maker2, taichi-maker3。
  wifiMulti.addAP("taichi-maker3", "13572468"); // 这3个网络的密码分别是123456789,87654321,13572468。
                                                // 此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。
                                                // 另外这里只存储了3个WiFi信息,您可以存储更多的WiFi信息在此处。
 
  int i = 0;                                 
  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循环判断是否跳出循环的条件。
  // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.println('\n');                     // WiFi连接成功后
  Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  Serial.println(WiFi.SSID());              // 连接的WiFI名称
  Serial.print("IP address:\t");            // 以及
  Serial.println(WiFi.localIP());           // NodeMCU的IP地址
  
  // 重点一: 建立回调函数以满足客户端的不同请求
  esp8266_server.begin();                  
  esp8266_server.on("/", handleRoot);     
  esp8266_server.on("/info", handleInfo);
  esp8266_server.on("/digital_pin", handleDigitalPin);          
 
  Serial.println("HTTP esp8266_server started");//  告知用户ESP8266网络服务功能已经启动
}
 
void loop(){
  // 处理http服务器访问
  esp8266_server.handleClient(); 
}                                                                   
 
void handleRoot() {   //处理网站目录“/”的访问请求 
  esp8266_server.send(200, "application/json", rootJson());  
}
 
void handleInfo() {   //处理网站目录“/info”的访问请求 
  esp8266_server.send(200, "application/json", infoJson());  
}
 
void handleDigitalPin() {   //处理网站目录“/digital_pin”的访问请求 
  esp8266_server.send(200, "application/json", digitalPinJson());  
}
 
// 实时获取ESP8266开发板引脚信息并且建立JSON信息
// 以便ESP8266服务器通过响应信息发送给客户端
String rootJson(){
  // 开始ArduinoJson Assistant的serialize代码 
  const size_t capacity = JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(3);
  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));
  // 结束assistant的serialize代码
 
  String jsonCode;  
  serializeJson(doc, jsonCode);
  Serial.print("Root Json Code: ");Serial.println(jsonCode); 
   
  return jsonCode;
}
 
//建立infoJson信息
String infoJson(){
 
  // 开始ArduinoJson Assistant的serialize代码 
  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"; 
  // 结束assistant的serialize代码
 
  String jsonCode;  
  serializeJson(doc, jsonCode);
  Serial.print("info Json Code: ");Serial.println(jsonCode); 
   
  return jsonCode;
}
 
//建立digitalPinJson信息
String digitalPinJson(){
 
  // 开始ArduinoJson Assistant的serialize代码 
  const size_t capacity = JSON_OBJECT_SIZE(1) + 3*JSON_OBJECT_SIZE(3)+140;
  DynamicJsonDocument doc(capacity);
  
  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));
  
  String jsonCode;  
  serializeJson(doc, jsonCode);
  Serial.print("root json Code: ");Serial.println(jsonCode); 
   
  return jsonCode;
}

参考

3-4-5-1 ESP8266客户端请求JSON信息 – 太极创客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值