esp32s3 HTTPS 获取和风天气信息

跟随网上获取和风天气的代码,实际上机体验了下。几点感受:

一、和风天气可以使用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网络时间同步。最后得到的输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值