一、准备工作
1.在和风天气官网注册,获取账号的key。
2.Arduino安装ArduinoUZlib库,用于解压和风天气返回的数据流。由于和风天气采用Gzip压缩方式返回数据流,返回的数据需要解压。以及与HTTPS、JSON等相关库。
二、相关代码
为了方便理解代码功能,不同功能的代码,各采用1个.h和.cpp文件。
1.获取数据流。和风天气API采用HTTPS方式获取相关天气数据,并且返回数据采用GZIP压缩方式,因此先要建立HTTPS链接,获取数据后,使用UZlib库里的 int result=ArduinoUZlib::decompress(inbuff, size, outbuf,outsize);函数进行解压。相关代码如下:
HttpsGetUtils.h代码
#ifndef _HTTPS_GET_UTILS_H_
#define _HTTPS_GET_UTILS_H_
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
class HttpsGetUtils {
public:
HttpsGetUtils();
static bool getString(const char* url, uint8_t*& outbuf, size_t &len);
static const char *host; // 服务器地址
private:
static bool fetchBuffer(const char* url);
static uint8_t _buffer[2048]; //gzip流最大缓冲区
static size_t _bufferSize;
};
#endif
HttpsGetUtils.cpp代码
#include "HttpsGetUtils.h"
#include "ArduinoUZlib.h" // gzip库
uint8_t HttpsGetUtils::_buffer[2048];
const char* HttpsGetUtils::host = "https://devapi.qweather.com"; //服务器地址,这是免费用户的地址,如果非免费用户,改为:https://api.qweather.com
size_t HttpsGetUtils::_bufferSize=0;
HttpsGetUtils::HttpsGetUtils() {
}
bool HttpsGetUtils::getString(const char* url, uint8_t *& outbuf, size_t &outlen) {
fetchBuffer(url); //HTTPS获取数据流
if(_bufferSize) {
ArduinoUZlib::decompress(_buffer, _bufferSize,outbuf, outlen);//GZIP解压
_bufferSize=0;
return true;
}
return false;
}
bool HttpsGetUtils::fetchBuffer(const char *url) {
_bufferSize=0;
std::unique_ptr<WiFiClientSecure> client(new WiFiClientSecure);
client->setInsecure();
H