跟随网上获取和风天气的代码,实际上机体验了下。几点感受:
一、和风天气可以使用HTTPS方式获取信息。需要提前去和风天气注册,有免费的使用量。
二、和风天气的数据进行了zip压缩,需要安装zlib组件。
三、HTTPS的主要代码如下:
1、定义URL:
//三天天气信息URL
#define QWEATHER_DAILY_URL "https://XXXXXXXX.re.qweatherapi.com/v7/weather/3d?&location=101270101&key=XXXXXXXXXXXX"
//实时天气信息
#define QWEATHER_NOW_URL "https://XXXXXXXX.re.qweatherapi.com/v7/weather/now?&location=101270101&key=XXXXXXXXXXXX"
//天气建议
#define QWEATHER_indices_URL "https://XXXXXXXX.re.qweatherapi.com/v7/indices/1d?type=1,2,3,4,5,6,7,8&location=101270101&key=XXXXXXXXXXXX"
#define QWEATHER_indices_URL1 "https://XXXXXXXX.re.qweatherapi.com/v7/indices/1d?type=9,10,11,12,13,14,15,16&location=101270101&key=XXXXXXXXXXXX"
//type=0为全部信息,共16项,其余数字代码代表不同的项目。由于缓冲区超过2K问题暂未解决,分两次下载建议信息。
2、HTTPS使用esp_http_client_init()进行初始化,esp_http_client_perform() 同步执行完整请求流程(包含连接、发送、接收),esp_http_client_cleanup()释放资源。由于要执行4次URL请求,为减少TCP连接开销,使用esp_http_client_set_url()来复用client句柄。
static void http_rest_with_url(void)
{
char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};
int client_code = 0;
int64_t gzip_len = 0;
//和风天气实时数据
ESP_LOGI(TAG, "获取实时天气信息......");
esp_http_client_config_t config = {
.url = QWEATHER_NOW_URL,
.event_handler = _http_event_handler,
.crt_bundle_attach = esp_crt_bundle_attach,
.user_data = local_response_buffer, // Pass address of local buffer to get response
};
esp_http_client_handle_t client = esp_http_client_init(&config);
// GET
esp_err_t err = esp_http_client_perform(client);
if (err == ESP_OK) {
client_code = esp_http_client_get_status_code(client);
gzip_len = esp_http_client_get_content_length(client);
ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRIu64, client_code, gzip_len);
} else {
ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err));
}
if (client_code != 200)
{
ESP_LOGE(TAG, "Error Client_code %d", client_code);
return ;
}
int buffSize = MAX_HTTP_OUTPUT_BUFFER;
char* buffData = (char*)malloc(MAX_HTTP_OUTPUT_BUFFER);
memset(buffData, 0, MAX_HTTP_OUTPUT_BUFFER);
int ret = gzDecompress(local_response_buffer, gzip_len, buffData, &buffSize);
if (Z_STREAM_END != ret)
{ // 解压失败
ESP_LOGE(TAG, "now_weather decompress faild......");
free(buffData);
return ;
}
user_cjson_now(buffData);
free(buffData);
//和风天气三天预报
ESP_LOGI(TAG, "获取三天天气信息......");
esp_http_client_set_url(client, QWEATHER_DAILY_URL) ;
// GET
err = esp_http_client_perform(client);
if (err == ESP_OK) {
client_code = esp_http_client_get_status_code(client);
gzip_len = esp_http_client_get_content_length(client);
ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRIu64, client_code, gzip_len);
} else {
ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err));
}
if (client_code != 200)
{
ESP_LOGE(TAG, "Error Client_code %d", client_code);
return ;
}
buffSize = MAX_HTTP_OUTPUT_BUFFER;
buffData = (char*)malloc(MAX_HTTP_OUTPUT_BUFFER);
memset(buffData, 0, MAX_HTTP_OUTPUT_BUFFER);
ret = gzDecompress(local_response_buffer, gzip_len, buffData, &buffSize);
if (Z_STREAM_END != ret)
{ // 解压失败
ESP_LOGE(TAG, "daily_weather decompress faild......");
free(buffData);
return ;
}
user_cjson_daily(buffData);
free(buffData);
//和风天气生活指数1-8项
ESP_LOGI(TAG, "获取生活指数1-8项信息......");
esp_http_client_set_url(client, QWEATHER_indices_URL) ;
// GET
err = esp_http_client_perform(client);
if (err == ESP_OK) {
client_code = esp_http_client_get_status_code(client);
gzip_len = esp_http_client_get_content_length(client);
ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRIu64, client_code, gzip_len);
} else {
ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err));
}
if (client_code != 200)
{
ESP_LOGE(TAG, "Error Client_code %d", client_code);
return ;
}
buffSize = MAX_HTTP_OUTPUT_BUFFER ;
buffData = (char*)malloc(MAX_HTTP_OUTPUT_BUFFER);
memset(buffData, 0, MAX_HTTP_OUTPUT_BUFFER);
ret = gzDecompress(local_response_buffer, gzip_len, buffData, &buffSize);
if (Z_STREAM_END != ret)
{ // 解压失败
ESP_LOGE(TAG, "sug_weather decompress faild......");
free(buffData);
return ;
}
user_cjson_sug(buffData);
free(buffData);
//和风天气生活指数9-16项
ESP_LOGI(TAG, "获取生活指数信息9-16项......");
esp_http_client_set_url(client, QWEATHER_indices_URL1) ;
// GET
err = esp_http_client_perform(client);
if (err == ESP_OK) {
client_code = esp_http_client_get_status_code(client);
gzip_len = esp_http_client_get_content_length(client);
ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRIu64, client_code, gzip_len);
} else {
ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err));
}
if (client_code != 200)
{
ESP_LOGE(TAG, "Error Client_code %d", client_code);
return ;
}
buffSize = MAX_HTTP_OUTPUT_BUFFER ;
buffData = (char*)malloc(MAX_HTTP_OUTPUT_BUFFER);
memset(buffData, 0, MAX_HTTP_OUTPUT_BUFFER);
ret = gzDecompress(local_response_buffer, gzip_len, buffData, &buffSize);
if (Z_STREAM_END != ret)
{ // 解压失败
ESP_LOGE(TAG, "sug_weather decompress faild......");
free(buffData);
return ;
}
user_cjson_sug1(buffData);
esp_http_client_cleanup(client);
free(buffData);
}
其中:
(1)user_cjson_now()、user_cjson_daily()、user_cjson_sug()、user_cjson_()sug1完成4次URL的josn数据解析。
(2)gzDecompress()完成https数据解压。
(3)remove_doub()去除json中值的双引号。
4、结合之前的SHT40传感器,结合SNTP网络时间同步。最后得到的输出: