ESP8266 + Arduino (四) 客户端向服务器发送数据信息---2022.3.5

2023-11-13

学习目的:通过两块esp8266模块实现互联,一块作为服务器,另一块作为客户端,连接成功后客户端发送http请求,并通过客户端的按键来控制服务器端的LED 的亮灭!
在这里插入图片描述

在这个示例中,ESP8266客户端将会通过HTTP协议向ESP8266服务器发送信息。在运行过程中,客户端ESP8266将会实时检测板上的按键状态,并且把按键状态发送给服务器。服务器在接收到客户端按键状态后,可以根据客户端按键状态来控制服务器端板上的LED点亮和熄灭。最终实现的效果是,我们可以通过客户端ESP8266开发板上的按键来“遥控”服务器上的LED点亮和熄灭。

服务器端代码如下:

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : csd_server
演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,一个以客户端模式运行。
 
此代码为服务器端代码。此代码主要功能:
    - 接收客户端发来的http请求
    - 解析客户端请求中的数据信息
    - 将解析的数据信息通过串口监视器显示供用户查看
    - 将解析的客户端按键状态信息用于控制板上LED的点亮和熄灭
    
-----------------------------------------------------------------------
***********************************************************************/
 
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>   // 使用WiFiMulti库 
#include <ESP8266WebServer.h>   // 使用WebServer库
 
ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
 
ESP8266WebServer server(80);    // 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
 
IPAddress local_IP(192, 168, 123, 123); // 设置服务端ESP8266-NodeMCU联网后的IP
IPAddress gateway(192, 168, 123, 1);    // 设置网关IP(通常网关IP是WiFI路由IP)
IPAddress subnet(255, 255, 255, 0);   // 设置子网掩码
IPAddress dns(192,168,123,1);           // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP)
 
void setup(void){
  Serial.begin(9600);          // 启动串口通讯
  Serial.println("");
 
  pinMode(LED_BUILTIN, OUTPUT);   
  digitalWrite(LED_BUILTIN, HIGH);		//HIGH 电平 LED灭
  
  // 设置开发板网络环境
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("Failed to Config ESP8266 IP"); 
  } 
  
  wifiMulti.addAP("TPLINK", "TPLINK123"); // 将需要连接的一系列WiFi ID和密码输入这里
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
  Serial.println("Connecting ...");                            // 则尝试使用此处存储的密码进行连接。
  
  // 尝试进行wifi连接。
  while (wifiMulti.run() != WL_CONNECTED) { 
    delay(250);
    Serial.print('.');
  }
 
  // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // 通过串口监视器输出连接的WiFi名称
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // 通过串口监视器输出ESP8266-NodeMCU的IP
 
  server.on("/update", handleUpdate);        // 处理服务器更新函数
  
  server.begin();                            // 启动网站服务
  Serial.println("HTTP server started");
}
 
void loop(void){
  server.handleClient();                    // 检查http服务器访问
}
 
void handleUpdate(){
  float floatValue = server.arg("float").toFloat();  // 获取客户端发送HTTP信息中的浮点数值
  int intValue = server.arg("int").toInt();        // 获取客户端发送HTTP信息中的整数数值
  int buttonValue = server.arg("button").toInt();  // 获取客户端发送HTTP信息中的按键控制量
  
  server.send(200, "text/plain", "Received");                 // 发送http响应
 
  buttonValue == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);		//<表达式1> ? <表达式2> : <表达式3>; 
  //"?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;
  //如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。
 
  // 通过串口监视器输出获取到的变量数值
  Serial.print("floatValue = ");  Serial.println(floatValue);  
  Serial.print("intValue = ");  Serial.println(intValue); 
  Serial.print("buttonValue = ");  Serial.println(buttonValue);   
  Serial.println("=================");    
}

在这里插入图片描述

代码解析:

1.server.arg(“float”)

server.arg(“float”).toFloat(); // 获取客户端发送HTTP信息中的浮点数值

ESP8266WebServer库 – arg

server.arg(“float”)
说明
使用本函数,我们可以获取客户端向ESP8266物联网服务器发送的指定参数的数值。

语法
server.arg(Name)
server.arg(index)

参数
– Name
请求体中的参数名(参数类型: String)

– index
请求体中的参数序列号(参数类型: int)

返回值
指定参数的数值(类型:String)

http://192.168.0.106/?a=1&b=2&c=3

我们可以看到,以上信息中有三个参数,这些参数中,a的数值为1,序列号为2的参数数值为3(序列号0的参数为a, 序列号1的参数为b…)。
server.arg(“a”) = 1
server.arg(2) = 3

2. server.on("/update", handleUpdate); // 处理服务器更新函数

针对客户端的更新请求

  // 将需要发送的数据信息放入客户端请求
  String url = "/update?float=" + String(clientFloatValue) + 
               "&int=" + String(clientIntValue) +
               "&button=" + String(buttonState);
                         
  // 建立字符串,用于HTTP请求
  String httpRequest =  String("GET ") + url + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";

客户端代码如下:


/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : csd_client
程序目的/Purpose          : 
演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
一个以客户端模式运行。
 
此代码为客户端代码。此代码主要功能:
    - 通过HTTP协议向服务器发送HTTP请求
    - HTTP请求中包含客户端按键开关引脚状态和程序测试数据

http信息发送说明
192.168.0.123/update?float=1.5&int=2&button=0
***********************************************************************/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>   // 使用WiFiMulti库 
 
#define buttonPin D3            // 按钮引脚D3
 
ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
 
bool buttonState;       //存储客户端按键控制数据
float clientFloatValue; //存储客户端发送的浮点型测试数据
int clientIntValue;     //存储客户端发送的整数型测试数据
 
const char* host = "192.168.123.123";    // 即将连接服务器网址/IP
const int httpPort = 80;               // 即将连接服务器端口
 
void setup(void){
  Serial.begin(9600);                  // 启动串口通讯
  Serial.println("");
 
  pinMode(buttonPin, INPUT_PULLUP);    // 将按键引脚设置为输入上拉模式
  
  wifiMulti.addAP("TPLINK", "TPLINK123"); // 将需要连接的一系列WiFi ID和密码输入这里
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
  Serial.println("Connecting ...");                            // 则尝试使用此处存储的密码进行连接。
  
  while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
    delay(250);
    Serial.print('.');
  }
 
  // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // 通过串口监视器输出连接的WiFi名称
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // 通过串口监视器输出ESP8266-NodeMCU的IP
}
 
void loop(void){
 // 获取按键引脚状态
 buttonState = digitalRead(buttonPin); 
 
 // 改变测试用变量数值用于服务器端接收数据检测
 clientFloatValue += 1.5;
 clientIntValue += 2;
 
 // 发送请求
 wifiClientRequest();
 delay(1000);
}
 
void wifiClientRequest(){
  WiFiClient client;  
 
  // 将需要发送的数据信息放入客户端请求
  String url = "/update?float=" + String(clientFloatValue) + 
               "&int=" + String(clientIntValue) +
               "&button=" + String(buttonState);
                         
  // 建立字符串,用于HTTP请求
  String httpRequest =  String("GET ") + url + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";
                        
  Serial.print("Connecting to "); 
  Serial.print(host); 
  
  if (client.connect(host, httpPort)) {  //如果连接失败则串口输出信息告知用户然后返回loop
    Serial.println(" Sucess");
    
    client.print(httpRequest);          // 向服务器发送HTTP请求
    Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
    Serial.println(httpRequest);        
  } else{
    Serial.println(" failed");
  }
  
  client.stop();                         
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP8266 + Arduino (四) 客户端向服务器发送数据信息---2022.3.5 的相关文章

  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • 当 REST 中的资源不支持操作时,HTTP 状态代码 404 或 501

    我有一个 REST 服务 根据正在查看的资源类型 我有某些可用的操作 So Resource1支持Operation1 and Operation2 eg Resource1 Operation1 Resource1 Operation2
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • Jsoup http 日志记录

    有没有办法记录http请求和响应 我们假设以下请求 Connection Response res Jsoup connect LOGIN URL HERE data user USER pass PASS method Connectio
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • 身份验证中的随机数使用

    在基于摘要的身份验证中 随机数由服务器生成 然而 在基于 OAuth 的身份验证中 随机数是由客户端生成的 我想知道是否有人知道差异的原因 随机数用于使请求唯一 在没有随机数的身份验证方案中 恶意客户端可以生成一次请求并重放多次 即使计算成
  • 从浏览器中删除cookie?

    有什么方法可以指示网络浏览器完全delete一个人的cookie是用PHP设置的吗 我不想expiry或者等待浏览器closed 对于删除 我的意思是实际上不再将其列在 cookie 列表中 尝试这样删除所有 cookie foreach
  • 在 Flex 中以 HTTP Post 方式上传任意数据

    我们目前有一个 Java 小程序 可以生成大量数据并将其上传到我们的服务器 我们拥有的上传方法之一是使用 HTTP POST 到我们的服务器 其内容只是原始数据 没有多部分编码或任何内容 我正在考虑实现一个具有相同功能的 Flex 应用程序
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso
  • HttpRequest PUT内容到poco库中

    我想使用 HTTP PUT 请求将一些数据从 C 应用程序发送到服务器 我在用poco http pocoproject org我的应用程序中的网络库 我正在使用这个代码片段 HTTPClientSession session uri ge
  • HTTP部分上传、断点续传的标准方法

    我正在开发 http 客户端 服务器框架 并寻找处理部分上传的正确方法 与使用带有 Range 标头的 GET 方法进行下载相同 但是 HTTP PUT 并不打算恢复 据我所知 PATCH 方法不接受 Range 标头 有没有办法通过 HT
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 是否可以修改 $_SESSION 变量?

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • Django 响应总是用 text/html 分块无法设置内容长度

    在我的Django应用程序的views py中 我在尝试设置以下HTTP标头字段后返回一个HttpResponse对象 Create a Response Object with the content to return response
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 使用 Anypoint Studio (MULE) 在本地主机上找不到资源

    我尝试按照 MuleSoft 网站上建议的教程进行操作 我首先从这个例子开始
  • 如何在 PHP 中使用 file_get_contents 获取图像的 MIME 类型

    我需要获取图像的 MIME 类型 但我只有图像的正文file get contents 是否有可能获取 MIME 类型 是的 你可以这样得到它 file info new finfo FILEINFO MIME TYPE mime type
  • GET 和 POST 方法有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候用POST 什么时候用GET https stackoverflow com questions 46585 when do you use post and when do you use
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP

随机推荐

  • 深度学习可视化工具FiftyOne介绍

    FiftyOne是用于构建高质量数据集和计算机视觉模型的开源工具 由Python语言实现 最新发布版本为v0 14 0 它的License是Apache 2 0 源码位于https github com voxel51 fiftyone F
  • 积分商城能给商家带来哪些帮助?

    说起积分商城 不少人都大概接触过 甚至使用过 最常见的 例如我们使用的手机号码就有积分商城的存在 通过充值话费 会累积一定的消费积分 而这些积分通常在手机营业厅APP上可以查询到其作用 早期的积分商城玩法较少 如今已经变得很成熟 常见的有积
  • python里object是什么类型_Python object类中的特殊方法

    python版本 3 8 class object The most base type del obj xxx或delattr obj xxx 时被调用 删除对象中的一个属性 def delattr self args kwargs re
  • (Ubuntu Linux)Conda安装Pytorch2.0-Python3.8-Cuda11.7

    Ubuntu Linux Conda安装Pytorch2 0 Python3 8 Cuda11 7 一 安装Anaconda 安装包下载 https repo anaconda com archive 1 选择合适的安装包 每个版本中对应不
  • AppScan安全漏洞报告

    1 会话cookie 中缺少HttpOnly 属性 修复任务 向所有会话cookie 添加 HttpOnly 属性 解决方案 过滤器中 Java代码 HttpServletResponse response2 HttpServletResp
  • Linux-DM9000C网卡移植(详解)

    上一节 我们学习了 网卡驱动介绍以及制作虚拟网卡驱动 http www cnblogs com lifexy p 7763352 html 接下来本节 学习网卡芯片DM9000C 如何编写移植DM9000C网卡驱动程序 1 首先来看DM90
  • spring boot 的 ApplicationContext 及 getbean

    在spring中 我们通过如下代码取得一个spring托管类 ApplicationContext ac new FileSystemXmlApplicationContext applicationContext xml ac getBe
  • 红日安全vulnstack-ATT&CK实战系列 红队实战(四)

    一 介绍 下载地址http vulnstack qiyuanxuetang net vuln detail 6 strusts漏洞利用phpmyadmin getshell tomcat 漏洞利用 docker逃逸 ms14 068 ssh
  • AutoScraper——爬虫神器

    AutoScraper是一个自动化的爬虫工具 非常智能 而且使用简单便捷 AutoScraper 是使用 Python 实现的 Web 爬虫 兼容 Python 3 能快速且智能获取指定网站上的数据 在github上具有4 8K githu
  • springboot结合redis(保存用户登录信息)

    一 导入包
  • 1.计算机图形学 实验 线条(利用C语言图形函数绘图)

    1 修改例1的代码 改变顶点个数 要求50个顶点 使得得到的图形更逼近于正圆 在实验报告中给出完整的代码和对应的运行结果截图 include
  • 用python比较大小

    1 比较 ax lt xa 的大小 代码为 print ax lt xa 结果为True print ord a print ord x 字符串是通过ASCII表来进行顺次为比较大小 2 is与 的区别 print 1 is True 为F
  • Java为什么不能写大型游戏?

    所谓大游戏 一般指端游 必须是C 没办法 C 和java的效率还是有很大差距的 基本上所有东西都可以用java开发 但是java致命的一点就是不能直接操作内存 只能安装虚拟机 这就造成了java的开发有很多局限性 但是java提供了本地方法
  • python 简单k近邻分类器的实现

    1 问题 在此使用k近邻算法实现一个简单分类器 其中model xls表样式如下表1所示 表1 model xls数据表 分析 数据存放在model xls中 需要利用panda数据 对数据进行切片为指标和结果 切片后的数据类型为dataf
  • 教你几种MySQL 中常见的高可用架构部署方案

    MySQL 中的集群部署方案 前言 这里来聊聊 MySQL 中常用的部署方案 MySQL Replication MySQL Replication 是官方提供的主从同步方案 用于将一个 MySQL 的实例同步到另一个实例中 Replica
  • 现代控制理论4——线性系统状态方程的解

    注 本文是在MOOC平台上学习西北工业大学 现代控制理论基础 郭建国 赵斌 郭宗易 的课程进行随笔记录与整理 一 线性定常连续系统状态方程的解 齐次方程 1 求解 齐次状态方程 x Ax 其解描述的是 即无控情况下在初始状态作用下系统的自由
  • Spring Boot 中的 @Async 注解是什么,如何使用

    Spring Boot 中的 Async 注解是什么 如何使用 引言 在开发 Web 应用程序时 经常需要执行一些耗时的操作 比如发送邮件 生成报表 调用第三方接口等等 这些操作如果在主线程中执行 会导致请求响应时间过长 影响用户体验 为了
  • 双层神经网络模型

    第8到12行为正向传播算法 输出一个损失函数 其中h为sigmod激活函数 第11行为L2损失函数 第14到20行为反向传播算法 使用梯度下降法对权值进行优化 注 常见的几种Activation Functions
  • FAT32文件系统中文件的“修改时间”

    海思 项目背景 项目中用到AV3板 AV1板及CPU板 AV3板给AV1板校时 CPU板给AV3板校时 AV3板是UTC时间 AV1板和CPU板是CST时间 且时区不能修改 问题说明 AV3板产生的文件的 修改时间 在windows里面查看
  • ESP8266 + Arduino (四) 客户端向服务器发送数据信息---2022.3.5

    学习目的 通过两块esp8266模块实现互联 一块作为服务器 另一块作为客户端 连接成功后客户端发送http请求 并通过客户端的按键来控制服务器端的LED 的亮灭 在这个示例中 ESP8266客户端将会通过HTTP协议向ESP8266服务器