ESP32- 项目应用1 智能手表 之更新天气#4
1 天气网站-心知天气(Seniverse)
心知天气(Seniverse)是一个面向开发者的 天气数据服务平台,提供全球范围的实时天气、预报、生活指数、空气质量等气象信息的 API 接口。
官网: https://www.seniverse.com
1.2 🧩 适合场景
智能家居终端(温湿度屏幕显示)
ESP32 物联网设备
室内环境监控
微信小程序、APP 天气插件
城市大屏天气播报
1.3 📌 核心特点
特性 描述
📍 地理范围 全球(包括中国大陆)
⏱ 实时性 提供实时天气数据(分钟级更新)
🗓 数据种类 实况天气、3天天气预报、生活指数、空气质量、天气图片等
📡 接口类型 RESTful API(GET 请求返回 JSON)
📋 支持语言 支持中英文天气描述
1.4 注册账号
1.5 进入控制后台
如果只是简单测试,选择免费版。学习测试、开发验证,低频天气展示屏(如 ESP32 LCD/LED 项目),每天不超过 1000 次调用的小型物联网项目
1.6 一个免费版,可以创建3个密钥。
你可以将这个 Key 配置在 多个设备上同时使用,只要所有设备每天的请求总数 ≤ 1000 次即可。如果你把设备部署在公网(如 ESP32 连 WiFi),一定要设置好 请求频率控制,避免无意中超限。如果超出免费额度,API 会返回 429 Too Many Requests。建议增加本地缓存或设定统一更新间隔,比如所有设备整点访问一次。
1.7 API 的调用方式
每组密钥由“公钥”(参数uid)和“私钥”(参数key)组成,例如:
● 公钥 PKwiV7auWJE3iBJ8d
● 私钥 SMEieQjde1C9eXnbE
心知天气支持两种 API 安全验证方式:
-
“私钥” 直接请求方式(更简单)
将 API 密钥中的“私钥”作为 API 请求中的 key 参数值:
比如 https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c
将your_private_key更改为私钥即可
说明:此方式较为方便,但请注意不要泄漏你的“私钥”。 -
“公钥 + 私钥” 签名验证方式(更安全)
“公钥 + 私钥” 验证方式更加安全。请求地址中只包含你的“公钥”以及用你的“私钥”制作的签名,因此不会在请求地址中泄露你的私钥。具体使用方式请查看下一章如何使用签名验证方式。
所以我们一般采用私钥访问方式。
1.8 V3天气现象代码说明
每一种天气现象(例如:晴、小雨、多云等)都对应一个天气现象代码,即 API 返回结果中的 code 字段。下表列出了心知天气 API 所有可能返回的天气现象代码。注:部分天气现象提供白天和夜间两种代码。
天气现象图标下载
每一个天气现象代码也对应了一个 PNG 图标,心知天气用户可免费下载使用。
● 亮色主题图标 下载
● 暗色主题图标 下载
天气现象代码对照表(V3)
1. 9 多语言支持说明
心知天气 API 支持 13 种语言,分别为:中文(简体、繁体),英语,日语,德语,法语,俄语,西班牙语,葡萄牙语,泰语,阿拉伯语,印尼语,印地语。多语言支持向心知的所有注册用户开放,无论免费用户还是付费用户,都可以通过接口的language参数改变返回数据的语言。
1.10 V3 API 返回错误代码说明
当 API 请求由于权限不足、服务过期等原因导致错误时,API 会返回如下结构的错误信息。你的程序可以根据 status_code 来进行相应的处理。
2 esp32 获取温度和天气
这里需要用户注意,一定获取好本地正确时间。
2.1 跟网站建立链接
这里需要配置好你的私钥, 选择语言,我这里选择英文。地址选择上海。 这里以后根据精度和维度,获取地址。 单位选择摄氏度。
https://api.seniverse.com/v3/weather/now.json?key=XXXXX&location=shanghai&language=en&unit=c
参考代码:
esp_http_client_config_t config = {.url = "https://api.seniverse.com/v3/weather/now.json?key=SYc8bI8YXSx_Hd8u1&location=shanghai&language=en&unit=c",.skip_cert_common_name_check = true,.event_handler = client_event_handler,}; esp_http_client_handle_t client = esp_http_client_init(&config); //初始化http连接
skip_cert_common_name_check指的是跳过服务器证书,这是为了避免HTTP Client提示不安全的HTTPS链接出现异常的情况,特别是我们开发系统接口调用的时候,经常是HTTPS的接口,而又是不安全的,此时使用HTTP Client就无法正确调用,因此要写绕过SSL验证。 需要注意的是,ESP32作为客户端进行HTTPS请求时,如果不需要验证服务器证书也就是想跳过证书验证,只设置esp_http_client_config_t结构体中skip_cert_common_name_check成员为true是没有效果的。它只会跳过检查证书的CN而不是CA,不会跳过整个证书验证。所以如果想跳过证书则需要在menuconfig里面修改ESP-TLS选项,改为默认跳过服务器证书如下图:
2.2 链接回调函数
event_handler为ESP HTTP 客户端的回调函数,发生相关事件时会触发相应的事件处理程序。在 ESP32 使用 esp_http_client 发起 HTTP(S) 请求时,HTTP_EVENT_ON_DATA 和 HTTP_EVENT_ON_FINISH 的处理尤为关键,特别是在服务器采用 chunked 传输编码 的场景下。服务器不会告诉你总内容长度(Content-Length 不存在),数据通过多个 分块(chunk) 传输,每个块会触发一次 ,HTTP_EVENT_ON_DATA,当所有数据传输完成,才会触发 HTTP_EVENT_ON_FINISH。
这种方式的优点是,服务器可以边产生数据边发送,不需要等待所有数据都产生完毕。客户端也可以边接收数据边处理,不需要等待所有数据都接收完毕。这样就可以减少服务器的负担,提高数据传输的效率,改善用户体验。
esp_err_t client_event_handler(esp_http_client_event_t *evt