桌面小屏幕实战课程:DesktopScreen 17 HTTPS

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcn8qjiNXmw2r3vBEdc7XCBCh

源码参考:

/home/kemp/work/esp/esp-idf/examples/protocols/https_request

源码下载方式参考:

源码下载方式

获取网站ca证书

openssl s_client -showcerts -connect api.seniverse.com:443 </dev/null

复制-----BEGIN CERTIFICATE-----后内容到pem文件

-----END CERTIFICATE-----1 s:C = US, O = DigiCert Inc, CN = RapidSSL TLS DV RSA Mixed SHA256 2020 CA-1i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIQB5g2A63jmQghnKAMJ7yKbDANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0yMDA3MTYxMjI1MjdaFw0yMzA1MzEyMzU5NTlaMFkxCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKlJhcGlkU1NMIFRMUyBE
ViBSU0EgTWl4ZWQgU0hBMjU2IDIwMjAgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBANpuQ1VVmXvZlaJmxGVYotAMFzoApohbJAeNpzN+49LbgkrM
Lv2tblII8H43vN7UFumxV7lJdPwLP22qa0sV9cwCr6QZoGEobda+4pufG0aSfHQC
QhulaqKpPcYYOPjTwgqJA84AFYj8l/IeQ8n01VyCurMIHA478ts2G6GGtEx0ucnE
fV2QHUL64EC2yh7ybboo5v8nFWV4lx/xcfxoxkFTVnAIRgHrH2vUdOiV9slOix3z
5KPs2rK2bbach8Sh5GSkgp2HRoS/my0tCq1vjyLJeP0aNwPd3rk5O8LiffLev9j+
UKZo0tt0VvTLkdGmSN4h1mVY6DnGfOwp1C5SK0MCAwEAAaOCAgswggIHMB0GA1Ud
DgQWBBSkjeW+fHnkcCNtLik0rSNY3PUxfzAfBgNVHSMEGDAWgBQD3lA1VtFMu2bw
o+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAmMCQG
CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wewYDVR0fBHQwcjA3
oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9v
dENBLmNybDA3oDWgM4YxaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
R2xvYmFsUm9vdENBLmNybDCBzgYDVR0gBIHGMIHDMIHABgRVHSAAMIG3MCgGCCsG
AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGKBggrBgEFBQcC
AjB+DHxBbnkgdXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY29uc3RpdHV0ZXMgYWNj
ZXB0YW5jZSBvZiB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1lbnQgbG9jYXRlZCBh
dCBodHRwczovL3d3dy5kaWdpY2VydC5jb20vcnBhLXVhMA0GCSqGSIb3DQEBCwUA
A4IBAQAi49xtSOuOygBycy50quCThG45xIdUAsQCaXFVRa9asPaB/jLINXJL3qV9
J0Gh2bZM0k4yOMeAMZ57smP6JkcJihhOFlfQa18aljd+xNc6b+GX6oFcCHGr+gsE
yPM8qvlKGxc5T5eHVzV6jpjpyzl6VEKpaxH6gdGVpQVgjkOR9yY9XAUlFnzlOCpq
sm7r2ZUKpDfrhUnVzX2nSM15XSj48rVBBAnGJWkLPijlACd3sWFMVUiKRz1C5PZy
el2l7J/W4d99KFLSYgoy5GDmARpwLc//fXfkr40nMY8ibCmxCsjXQTe0fJbtrrLL
yWQlk9VDV296EI/kQOJNLVEkJ54P
-----END CERTIFICATE-----
---
Server certificate
subject=CN = *.seniverse.com

Makefile添加证书

EMBED_TXTFILES "server_root_cert.pem"

/home/kemp/work/esp/DesktopScreen/main/component.mk添加

COMPONENT_EMBED_TXTFILES := server_root_cert.pem

代码实现:

/* HTTPS GET Example using plain mbedTLS sockets** Contacts the howsmyssl.com API via TLS v1.2 and reads a JSON* response.** Adapted from the ssl_client1 example in mbedtls.** Original Copyright (C) 2006-2016, ARM Limited, All Rights Reserved, Apache 2.0 License.* Additions Copyright (C) Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD, Apache 2.0 License.*** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_netif.h"#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#include "lwip/dns.h"
#include "cJSON.h"#include "esp_tls.h"#define WEB_SERVER "api.seniverse.com"
#define WEB_URL "https://api.seniverse.com/v3/weather/now.json?key=SmazqPcltzTft-X3v&location=guangzhou&language=zh-Hans&unit=c"#define WEB_BILIBILI_SERVER "api.bilibili.com"
#define WEB_BILIBILI_URL "https://api.bilibili.com/x/relation/stat?vmid=383943678&jsonp=jsonp"static const char *TAG = "example";static const char *REQUEST = "GET " WEB_URL " HTTP/1.0\r\n""Host: "WEB_SERVER"\r\n""User-Agent: esp-idf/1.0 esp32\r\n""\r\n";static const char *REQUEST_BILIBILI = "GET " WEB_BILIBILI_URL " HTTP/1.0\r\n""Host: "WEB_BILIBILI_SERVER"\r\n""User-Agent: esp-idf/1.0 esp32\r\n""\r\n";/* Root cert for howsmyssl.com, taken from server_root_cert.pemThe PEM file was extracted from the output of this command:openssl s_client -showcerts -connect www.howsmyssl.com:443 </dev/nullThe CA root cert is the last cert given in the chain of certs.To embed it in the app binary, the PEM file is namedin the component.mk COMPONENT_EMBED_TXTFILES variable.
*/
extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start");
extern const uint8_t server_root_cert_pem_end[]   asm("_binary_server_root_cert_pem_end");extern const uint8_t server_root_cert_bilibili_pem_start[] asm("_binary_server_root_cert_bilibili_pem_start");
extern const uint8_t server_root_cert_bilibili_pem_end[]   asm("_binary_server_root_cert_bilibili_pem_end");static void https_get_task(void *pvParameters)
{char buf[512];int ret, len;int flags = 0;while(1) {//设置证书esp_tls_cfg_t cfg = {.cacert_buf  = server_root_cert_pem_start,.cacert_bytes = server_root_cert_pem_end - server_root_cert_pem_start,};esp_tls_cfg_t bilibili_cfg = {.cacert_buf  = server_root_cert_bilibili_pem_start,.cacert_bytes = server_root_cert_bilibili_pem_end - server_root_cert_bilibili_pem_start,};//创建tls连接struct esp_tls *tls;if(flags == 0){tls = esp_tls_conn_http_new(WEB_URL, &cfg);}else{tls = esp_tls_conn_http_new(WEB_BILIBILI_URL, &bilibili_cfg);}if(tls != NULL) {ESP_LOGI(TAG, "Connection established...");} else {ESP_LOGE(TAG, "Connection failed...");goto exit;}size_t written_bytes = 0;if(flags == 0){flags = 1;do {//发送请求数据ret = esp_tls_conn_write(tls,REQUEST + written_bytes,strlen(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%x", ret);goto exit;}} while(written_bytes < strlen(REQUEST));}else{flags = 0;do {ret = esp_tls_conn_write(tls,REQUEST_BILIBILI + written_bytes,strlen(REQUEST_BILIBILI) - 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%x", ret);goto exit;}} while(written_bytes < strlen(REQUEST_BILIBILI));  }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%x", -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);exit:esp_tls_conn_delete(tls);   putchar('\n'); // JSON output doesn't have a newline at endstatic int request_count;ESP_LOGI(TAG, "Completed %d requests", ++request_count);for(int countdown = 15; countdown >= 0; countdown--) {ESP_LOGI(TAG, "%d...", countdown);vTaskDelay(1000 / portTICK_PERIOD_MS);}ESP_LOGI(TAG, "Starting again!");}
}void ds_https_request_init(void)
{xTaskCreate(&https_get_task, "https_get_task", 8192, NULL, 5, NULL);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/910693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud:高级特性与最佳实践

一、Spring Cloud 高级特性 &#xff08;一&#xff09;分布式配置管理 分布式配置管理是微服务架构中的一个重要功能&#xff0c;Spring Cloud 提供了多种配置管理解决方案&#xff0c;如 Spring Cloud Config 和 Spring Cloud Consul。 Spring Cloud Config Spring Cloud C…

理解图像的随机噪声

图像灰度信息很难精确测量&#xff0c;一般情况下测量值总在真实值附近晃动&#xff0c;使用概率模型可以对该随机性建模&#xff0c;大致如下&#xff1a; 1 概率密度函数 1&#xff09;随机变量 x 的概率密度函数 p(x) 定义为&#xff1a;当 趋近于 0 时&#xff0c;在区间 上…

spring中maven缺少包如何重新加载,报错java: 程序包org.springframework.web.reactive.function不存在

错误原因分析 java: 程序包org.springframework.web.reactive.function不存在 这个错误是由于 项目中缺少 Spring WebFlux 相关依赖 导致的。org.springframework.web.reactive.function 包属于 Spring WebFlux 模块&#xff08;用于响应式 Web 开发&#xff09;&#xff0c;如…

【C++】atoi和std::stoi

两个将字符串转为int的方法 atoi&#xff08;C语言&#xff09; atoi 是 C 库中的一个函数&#xff0c;它定义在 <cstdlib> 头文件里。其作用是把一个字符串转换为对应的整数。 /* Convert a string to an integer. */ extern int atoi (const char *__nptr)__THROW …

Re:从零开始的文件结构(融合线性表来理解 考研向)

文件管理 & 线性表 文件管理文件的结构无结构文件 有结构文件&#xff08;重点&#xff09;定长与不定长记录顺序文件&#xff08;类线性表&#xff09;它的逻辑结构它的物理结构&#xff08;存储结构&#xff09;小结 索引顺序文件与多级索引顺序文件形象化理解&#xff0…

Vue2 引入 Tailwind CSS 完整指南

目录 概述 安装步骤 1. 安装 Tailwind CSS 及相关依赖 2. 初始化 Tailwind CSS 配置 3. 配置 Tailwind CSS 重要说明&#xff1a; 4. 创建 PostCSS 配置 5. 在 CSS 中引入 Tailwind 6. 在 main.js 中引入 CSS 文件 使用说明 基础类使用 布局类 间距类 颜色类 字体类 边…

关于css的height:100%

这个问题&#xff0c;今天还搞了我两个小时&#xff0c;也是基础没搞好&#xff0c;再回顾了一下 问题描述&#xff1a;客户提出&#xff0c;在弹窗的时候就没办法滚动页面了&#xff0c;客户希望还可以滚动父页面。 基于这个问题&#xff0c;我想&#xff0c;本来就是可以滚…

华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)

HCCDA实验 实验一 任务1 补全数据模型数组项 得分点&#xff1a;能正确对指定类中创建对象进行构造初始化。 请使用如下配置自行创建API为12的应用工程&#xff1a; 应用工程创建时的相关配置如下表&#xff1a; Project name : ArkTSExam Device Type: Phone 创建成功后…