ESP32C3学习&开发之路-http获取天气数据

16 篇文章 2 订阅
2 篇文章 0 订阅


前言

本次实现用ESP32C3模组获取指定地点的天气数据,涉及到模组联网和实现http客户端并通过get请求来从“心知天气”获取天气数据。


一、心知天气

心知天气成立于2016年,隶属于北京心知科技有限公司,是国内领先的气象服务提供商。
要使用“心知天气”提供的天气服务要先在官方平台注册账号,官方网站地址"https://www.seniverse.com/"
注册和开通免费版的步骤如下:
1、注册
在这里插入图片描述
点击“注册”进入注册,根据要求填写账号信息后完成注册
在这里插入图片描述
2、控制台操作
完成注册后登录,在首页点击“控制台”进入到自己的控制台
在这里插入图片描述
我的控制台目前有一个“免费版”的产品,对于普通使用“免费版”就够了,如果要更强大的功能可以选择更高的付费版。
在这里插入图片描述
如果没有产品或者要购买其他的产品可以在“控制台”的“产品管理”中点击“添加产品”。
在这里插入图片描述
官方提供好几个版本,根据需求选择,初学者建议选择“免费版”。
点击“免费申请”,申请成功后就能在控制台中“我的产品”中看到。点击该产品进去可以看到详细的信息:
在这里插入图片描述
这里的公钥和秘钥每个用户都是不一样的,保管好不要泄露了,在我们用API访问数据时是要使用到的。到这里基本完成了一大步,后面要根据“心知天气”提供的文档来组成API接口,具体信息大伙去看文档吧!我就不讲了,我这边提供一个简单获取实时天气的接口:
在这里插入图片描述key=这里输入你自己的私钥;
location=这里输入城市(城市名称要按“心知天气”提供的规范写)
城市列表信息在这里下载“https://docs.seniverse.com/api/start/start.html”
在这里插入图片描述
找到想要获取的城市名称,填充到key=中,然后用浏览器试试可否获取到,如下图:
在这里插入图片描述

二、http协议

获取天气用的API是要用http协议来发送的,所以我们还要学习一点http协议的基本知识,我们主要用的是get请求。
虽然ESP32C3的官方示例里给我们写好了http客户端但是基础决定上层建筑,既然入了物联网就要有相关的协议知识。
概述
HTTP(Hypertext Transfer Protocol)超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
HTTP协议工作在应用层。
工作原理几特点
流程:
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
特点:
1、客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。
2、HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。
3、HTTP是一种面向对象的协议。
4、允许传送任意类型的数据对象。
5、在HTTP / 1.1中,引入了保持活动机制,其中连接可以重用于多个请求。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商TCP 3-Way-Handshake连接。
报文格式
HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下:
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
请求行以方法字段开始,后面分别是URL字段和HTTP协议版本字段,并以CRLF结尾。SP是分隔符。除了在最后的CRLF序列中CF和LF是必需的之外,其他都可以不要。有关通用信息头,请求头和实体头方面的具体内容可以参照相关文件。
HTTP请求报文包括请求行,请求头和请求正文3个部分,格式如下:
请求行(request line): 请求方法 + 请求URI + HTTP协议版本
请求头(request header):可选的头部信息,用于补充请求的内容和其他信息
请求正文(request body):可选的,通常包含应用程序要传输到服务端的数据
应答报文格式如下:
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
状态行:协议版本、状态码以及状态描述。
协议版本:指明了报文使用的 HTTP 协议版本;
状态码: 状态码是一个三位数字,用来表示处理的结果;
状态描述:这个是作为状态码的补充,是一段更详细的文字,帮助理解原因。
响应头:可选的头部信息,用于补充响应的内容和其他信息;
报文主体:服务器返回给浏览器的响应信息,响应数据的格式是根据服务器来的;
相关知识拓展
URI:Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
HTTP的请求方法
1、GET:
向web服务请求指定的信息对象,不同的对象获取不同的信息。
文件类型的对象,获取该文件的内容;
程序类型的对象,获取该程序的执行结果;
数据库查询类对象,获取该查询的结果。

2、POST:
从客户端向web服务器发送数据。
POST和GET请求方法的本质区别:

  • GET用于信息获取,它是安全的(这里安全的含义是指非修改信息),而POST是用于修改服务器上资源的请求;
  • GET请求的数据会附在URL之后(然后提交到服务器),而POST把提交的数据则放置在HTTP实体的主体里,所以,POST的安全性要比GET的安全性高;
  • GET方式提交数据和POST方法提交数据并没有限制数据大小。

3、HEAD
HEAD请求方法作用:只请求头部,允许客户端在未获取资源实体的情况下,对资源的头部检查,了解资源的基本情况,比如类型,是否被修改过等。
HEAD和GET请求方法的区别:GET请求回来的报文有实体的主体部分,而HEAD请求回来的报文没有实体的主体部分。

4、其他
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除指定的页面。
OPTIONS:返回服务器针对特定资源所支持的 HTTP 请求方法。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
PATCH:实体中包含一个表,表中说明与该URI所表示的原内容的区别。
MOVE:请求服务器将指定的页面移至另一个网络地址。
COPY:请求服务器将指定的页面拷贝至另一个网络地址。
LINK:请求服务器建立链接关系。
UNLINK:断开链接关系。
WRAPPED:允许客户端发送经过封装的请求。

三、ESP32C3获取天气

1.连接可访问网络的热点AP:

在上一篇有博文有介绍怎么连接热点AP,链接在这里ESP32C3学习&开发之路-连接手机热点AP

2.创建http协议客户端:

1)头文件包含
在这里插入图片描述
2、相关宏定义
在这里插入图片描述3、创建http客户端
创建http客户端通过https连接到“心知天气”的http服务器上,并通过GET请求获取天气信息,代码实现如下:

static void https_get_request()
{
    char buf[512];
    int ret, len;

    esp_tls_cfg_t cfg = {
        .crt_bundle_attach = esp_crt_bundle_attach,
    };

    struct esp_tls *tls = esp_tls_conn_http_new(WEB_URL, &cfg);

    if (tls != NULL) {
        ESP_LOGI(TAG, "Connection established...");
    } else {
        ESP_LOGE(TAG, "Connection failed...");
        goto exit;
    }

#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
    /* The TLS session is successfully established, now saving the session ctx for reuse */
    if (tls_client_session == NULL) {
        tls_client_session = esp_tls_get_client_session(tls);
    }
#endif
    size_t written_bytes = 0;
    do {
        ret = esp_tls_conn_write(tls,
                                 REQUEST + written_bytes,
                                 sizeof(REQUEST) - written_bytes);
        if (ret >= 0) {
            ESP_LOGI(TAG, "%d bytes written", ret);
            written_bytes += ret;
        } else if (ret != ESP_TLS_ERR_SSL_WANT_READ  && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
            ESP_LOGE(TAG, "esp_tls_conn_write  returned: [0x%02X](%s)", ret, esp_err_to_name(ret));
            goto exit;
        }
    } while (written_bytes < sizeof(REQUEST));

    ESP_LOGI(TAG, "Reading HTTP response...");

    do {
        len = sizeof(buf) - 1;
        bzero(buf, sizeof(buf));
        ret = esp_tls_conn_read(tls, (char *)buf, len);

        if (ret == ESP_TLS_ERR_SSL_WANT_WRITE  || ret == ESP_TLS_ERR_SSL_WANT_READ) {
            continue;
        }

        if (ret < 0) {
            ESP_LOGE(TAG, "esp_tls_conn_read  returned [-0x%02X](%s)", -ret, esp_err_to_name(ret));
            break;
        }

        if (ret == 0) {
            ESP_LOGI(TAG, "connection closed");
            break;
        }

        len = ret;
        ESP_LOGD(TAG, "%d bytes read", len);
        /* Print response directly to stdout as it is read */
        for (int i = 0; i < len; i++) {
            putchar(buf[i]);
        }
    } while (1);
    putchar('\n'); // JSON output doesn't have a newline at end

exit:
    esp_tls_conn_delete(tls);
    for (int countdown = 10; countdown >= 0; countdown--) {
        ESP_LOGI(TAG, "%d...", countdown);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

4、创建http任务函数
该任务函数在热点AP连接成功的事件返回中调用;
void https_request_task(void *pvparameters)
{
https_get_request();
vTaskDelete(NULL);
}

5、主函数
与上一篇的一样:

void app_main(void)
{
    /* 初始化NVS Flash */
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
      ESP_ERROR_CHECK(nvs_flash_erase());
      ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    /* 初始化基础TCP/IP堆 */ 
    ESP_ERROR_CHECK(esp_netif_init());
    /* 创建一个默认的事件循环(同一个esp32C3程序中可以有多个event_loop,这里使用默认的事件循环)*/   
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    ESP_LOGI(TAG, "ESP_WIFI_STA");
    wifi_init_sta();
}

6、调试结果;
在这里插入图片描述


总结

本次主要是讲述用ESP32C3来实现http客户端和GET请求获取“心知天气”的指定城市天气数据,主要新增http协议的知识,运用连接热点AP的项目。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值