ESP32+idf开发之WIFI通信入门(5)HTTP通信

这篇具有很好参考价值的文章主要介绍了ESP32+idf开发之WIFI通信入门(5)HTTP通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ESP32+idf开发之WIFI通信入门(5)HTTP通信

一、实现功能:

esp32作为HTTP客户端分别使用GET方法和POST方法向HTTP服务端发送请求得到响应,具体如下:

1、GET方法:向web服务器url发出get请求/add,发送参数x、y的值在服务端求和并响应,esp32得到返回数据;

2、POST方法:向web服务器url发出POST请求/add,发送参数x、y的值在服务端求和并响应,esp32得到返回数据;

3、使用json数据格式通信

二、HTTP概述:

​ HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。其主要特点:

简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

支持B/S及C/S模式。

esp32 http,ESP32+idf开发,http,网络,服务器,物联网,嵌入式硬件

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL(UniformResourceLocator, 统一资源定位符)是一种特殊类型的URI,

http://xxx.xxx.xxx.xxx:9999/add?x=3&y=4

以上URL包括以下几部分:协议部分(http:),域名/IP地址部分,端口部分(9999),文件名部分(从域名后的最后一个“/”开始到“?”为止,即/add?),参数部分(x=3&y=4)等。

客户端发送一个HTTP请求到服务器的请求消息(request):请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

esp32 http,ESP32+idf开发,http,网络,服务器,物联网,嵌入式硬件

服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息(response):状态行、消息报头、空行和响应正文。

esp32 http,ESP32+idf开发,http,网络,服务器,物联网,嵌入式硬件

GET方法和POST方法区别:

GET提交:请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;

POST提交:把提交的数据放置在是HTTP包的包体中。

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

三、步骤

1、复制wifi连接的组件代码到工程的自定义组件(components)中,进入vscode创建示例空项目,打开命令终端:

mkdir components

cp -r D:\Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common .\components

2、配置wifi连接设置,打开终端命令界面输入idf.py menuconfig,进入到Example Connection Configuration界面对热点信息的ssid和password等配置。

esp32 http,ESP32+idf开发,http,网络,服务器,物联网,嵌入式硬件

3、在main.c中编写实现以上功能的esp32的http客户端代码:

#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>
#include <esp_event.h>

#include <nvs_flash.h>
#include <esp_netif.h>
#include <protocol_examples_common.h>

#include <esp_http_client.h>
#include <cJSON.h>

static char *TAG = "http_client";
static char response_data[1024]; // 自定义缓存空间储存一次响应数据
static int recived_len = 0;      // 自定义变量储存一次响应中接收到分片数据的累计偏移

// http客户端的事件处理回调函数
static esp_err_t http_client_event_handler(esp_http_client_event_t *evt)
{
    switch (evt->event_id)
    {
    case HTTP_EVENT_ON_CONNECTED:
        ESP_LOGI(TAG, "connected to web-server");
        recived_len = 0;
        break;
    case HTTP_EVENT_ON_DATA:
        if (evt->user_data)
        {
            memcpy(evt->user_data + recived_len, evt->data, evt->data_len); // 将分片的每一片数据都复制到user_data
            recived_len += evt->data_len;//累计偏移更新
        }
        break;
    case HTTP_EVENT_ON_FINISH:
        ESP_LOGI(TAG, "finished a request and response!");
        recived_len = 0;
        break;
    case HTTP_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "disconnected to web-server");
        recived_len = 0;
        break;
    case HTTP_EVENT_ERROR:
        ESP_LOGE(TAG, "error");
        recived_len = 0;
        break;
    default:
        break;
    }

    return ESP_OK;
}

void app_main(void)
{
    esp_err_t ret;

    nvs_flash_init();
    esp_netif_init();
    esp_event_loop_create_default();

    example_connect();

    const esp_http_client_config_t cfg = {
        .url = "http://111.230.201.180:3000",
        .event_handler = http_client_event_handler,
        .user_data = response_data,
    };
    //使用http服务器配置参数对http客户端初始化
    esp_http_client_event_handle_t httpclient = esp_http_client_init(&cfg);

    // GET方法请求
    esp_http_client_set_method(httpclient, HTTP_METHOD_GET);
    esp_http_client_set_url(httpclient, "/add?x=10&y=11");//url传递发送数据x=10,y=11
    ret = esp_http_client_perform(httpclient);//启动并阻塞等待一次响应完成
    if (ret == ESP_OK)
    {
		//一次响应完成,打印完整响应数据,即得到X+y的值
        printf("GET:%s\n", response_data);
    }
    // POST方法请求
    esp_http_client_set_method(httpclient, HTTP_METHOD_POST);
    esp_http_client_set_url(httpclient, "/add/");

    //设置请求头
    esp_http_client_set_header(httpclient, "Content-Type", "application/json");

    //构造json数据jsonArg请求体(即发送数据x=24,y=124)
    cJSON *pRoot = cJSON_CreateObject();
    cJSON_AddStringToObject(pRoot, "x", "24");
    cJSON_AddStringToObject(pRoot, "y", "124");
    // char *jsonArg = "{\"x\":23,\"y\":34}";
    char *jsonArg = cJSON_Print(pRoot);
    //printf("jsonArg:%s\n", jsonArg);
    esp_http_client_set_post_field(httpclient, jsonArg, strlen(jsonArg));

    ret = esp_http_client_perform(httpclient);
    if (ret == ESP_OK)
    {
        //一次响应完成,打印完整响应数据,即得到X+y的值
        printf("POST:%s\n", response_data);
    }

    esp_http_client_cleanup(httpclient);//清空http客户端描述符
}

4、服务端本人部署在腾讯云服务器,其中服务端代码文件index.js如下所示。(初学者可先不部署服务端,可使用本人的服务端进行测试)

const express = require('express')
const bodyParser = require('body-parser')
const request = require('request')
const fs = require('fs')
const app = express()
app.use(bodyParser.json())

app.get('/add', (req, res) => {
    console.log("\nx: "+req.query.x)
    console.log("\ny: "+req.query.y)
    //查询
    res.json({
                result: true,
                method:"GET",
                message:Number(req.query.x) + Number(req.query.y)
            })
})

app.post('/add', (req, res) => {
    console.log("\nx: "+req.body.x)
    console.log("\ny: "+req.body.y)
    //增加
    res.json({
                result: true,
                method:"POST",
                message:Number(req.body.x) + Number(req.body.y)
            })
})


app.listen(3000, () => {
    console.log('server running at http://127.0.0.1:3000')
})

四、测试

有自行搭建服务器的则对应路径下运行:sudo node index.js开启服务端。

编译、烧写、监控esp32,观察打印esp32的终端打印信息,测试是否响应数据正常。得到GET请求测试10+11=21返回json数据测试正常;POST请求24+124=148返回json数据测试正常。

esp32 http,ESP32+idf开发,http,网络,服务器,物联网,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-657149.html

到了这里,关于ESP32+idf开发之WIFI通信入门(5)HTTP通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32/ESP8266 WIFI接入通过HTTP响应远程控制(附可用源码)

    ESP共有三种工作模式,分别是无线接入点模式(AP)、无线终端模式STA(Wireless Station)以及混合模式(以上两种模式的混合)。 ESP的WiFi设置是储存在它的闪存系统中的。因此在启动ESP8266并连接WiFi时,它都会尝试使用闪存系统中储存的信息来进行WiFi连接 连接网络基本步骤

    2023年04月09日
    浏览(43)
  • ESP32网络应用 -- ESP32-S3使用HTTP协议获取城市天气数据

    超文本传输协议(Hypertext Transfer Protocol,HTTP),是一种建立在TCP协议之上,应用非常广泛的请求-响应协议,关于HTTP协议的详细描述,网上已经不乏文章,此处不再详细论述。 作为一款网络功能强大Wi-Fi SOC芯片,ESP32-S3可以通过ESP-IDF编程框架提供的应用程序接口,方便地构建

    2024年02月09日
    浏览(40)
  • ESP32 IDF iic通信( 已验证) C语言

    关于iic原理建议B站自己看视频去, 然后本文主要实现了esp32的初始化, 写地址, 写数据, 读数据的功能, 从机的代码因为展示不需要,没写. 园子里面有个兄弟写了iic的代码.但是里面有点毒,多发了次地址验证,所以才有这篇文章; 代码注释比较多, 愿君少走弯路❀ 以下是头文件主要

    2024年02月03日
    浏览(41)
  • ESP32通过HTTP及SNTP同步网络时间

    1、获取毫秒级时间 和普通系统函数相同 2、延时毫秒级时间 SNTP 指 简单网络时间协议(Simple Network Time Protocol),一个合格的物联网设备,少不了一个准确的钟。通过SNTP,可以使ESP32设备通过网络校准本地时间。使用起来也非常简单! 二、示例 1、场景一:最基础方式 最简单

    2024年02月09日
    浏览(36)
  • ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

    下载网址:https://dl.espressif.com/dl/esp-idf/ 打开上面的网页,选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer,5.0.2是当前最新版本,如果没有ESP32-IDF v5.0.2 - Offine Installer,说明官方有更新最新版本,如果想要安装此教程版本可以把页面翻到最下面,会列出所有历史版本供用户下载。

    2024年02月13日
    浏览(58)
  • ESP32网络开发实例-Web方式配置WiFi连接

    在本文中,我们将介绍如何实现在Web页面中配置ESP32的WiFi连接。 ESP32 将在启动时设置为热点模式 连接到充当 AP 的 ESP32 开发板。 在连接到ESP32 WiFi热点后,打开ESP32的WiFi配置页面,并输入WiFi连接信息,包含SSID和接入密码。 在配置完成后,ESP32将自动重启并将WiFi工作模式设置

    2024年02月05日
    浏览(59)
  • ESP32开发:1、环境搭建(基于vscode+ESP-IDF)

    ESP-IDF提供操作ESP32芯片的API函数,供用户编写的用户程序调用。当用户程序编写好后,ESP-IDF需要借助一系列编译工具才能将用户程序+API函数编译成能运行在ESP32上的二进制文件。 如上图所示这个1个G左右大的压缩包就是ESP-IDF。如果电脑上已经存在了这个文件,就可以不用下

    2024年02月12日
    浏览(59)
  • ESP-IDF开发框架添加自定义组件 ESP32-C3

    因为熟悉了STM32的开发方式,同时随着项目文件越来越多,可以将自己写的代码分模块添加到工程中,下面分析如何将自己写的组件添加到工程中使其能够正常编译运行。 在ESP-IDF中,构建,编译,以及下载都是通过idf.py脚本来实现的,该脚本使用 CMake,配置待构建的项目 N

    2024年02月02日
    浏览(64)
  • vscode+esp-idf 搭建esp32开发环境,编译信息中文乱码

    1.修改波特率 2.C:UsersAdministrator.vscodeextensionsvsciot-vscode.vscode-arduino-0.6.0-win32-x64outsrccommon  打开文件 util.js 屏蔽掉这部分的代码 、  

    2024年02月10日
    浏览(52)
  • ESP8266WIFI模块(ESP01)上云端(OneNet平台,HTTP)

    1.注册账号并登录 Onenet平台 2.打开控制台 3.在控制台点击全部产品,选择基础服务的多协议接入 4.选择·HTTP并点击添加产品。 5.填写产品信息,名称随便起,行业任选一个,类别也任选,联网方式选择wifi 6.添加设备 并填写设备名称,随便起名个字,随便输入编号,但是同一

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包