[RT_Thread] 【ART-Pi测评】五:联网获取天气数据

数码小叶   2021-8-1 22:49 楼主

在上一篇中,已经实现了art-pi的网络自动连接,并且可以获取网络时间,还差一个天气情况。 RT-Thread提供了丰富的组件,webclient 是 RT-Thread 上实现的一个 HTTP 客户端,用来提供高效且功能丰富的 HTTP 客户端编程工具包,利用这个工具可以完成与 HTTP 服务器的通信。

Snipaste_2021-07-23_22-29-05.png

 

打开webclient,并且使能开启 webclient 的 GET/POST 示例

Snipaste_2021-07-23_22-29-56.png

 

 

再打开包里http客户端示例

Snipaste_2021-07-23_22-37-23.png

 

 

打开的示例,中文显示是乱码,不方便理解,需要修改文档的编码格式,修改后就可以正常显示了

Snipaste_2021-07-23_22-38-47.png

 

Snipaste_2021-07-23_22-39-05.png

 

在http示例里,其获取天气的服务器是http://mobile.weather.com.cn/data/sk/%s.html,实际测试已经打不开

Snipaste_2021-07-23_23-20-52.png

 

后来在文档中看到了这个的说明“此程序仅为 http client 的示例程序,其中获取天气的 API 已经被弃用,实际使用时更换为其他的 API 才可获取最新的天气。”因此,想要获取天气数据,只能更改API了,于是参考了 RT-thread入门课程中的心知天气获取,更改为心知的API。

 

Snipaste_2021-07-27_22-34-44.png

 

虽然第一次使用,但是发现利用官网页面还是很容易上手的。心知天气按收费分为好几个版本,越贵的参数越多,不过,免费的感觉已经够用了。注册一个账户先。

Snipaste_2021-07-27_22-38-13.png

Snipaste_2021-07-27_22-40-39.png

 

 

其接口API,有详细的说明,每个参数的函数,以及每个参数是否要给出都有介绍,使用起来很容易操作

Snipaste_2021-07-27_22-47-39.png

 

实际来获取指定城市,查询时的天气实况

Snipaste_2021-07-27_22-55-34.png

{
    "results":[
     {
        "location":
        {
            "id":"WTS4JZ3WMZMC",
            "name":"芜湖",
            "country":"CN",
            "path":"芜湖,芜湖,安徽,中国",
            "timezone":"Asia/Shanghai",
            "timezone_offset":"+08:00"
        },
        "now":
        {
            "text":"阴",
            "code":"9",
            "temperature":"25"
        },
        "last_update":"2021-07-28T21:43:20+08:00"
     }
    ]
}

 

再比如获取指定城市三天的天气情况

Snipaste_2021-07-27_22-56-16.png

{
    "results":[
     {
        "location":
        {
            "id":"WTS4JZ3WMZMC",
            "name":"芜湖",
            "country":"CN",
            "path":"芜湖,芜湖,安徽,中国",
            "timezone":"Asia/Shanghai",
            "timezone_offset":"+08:00"
        },
        "daily":[
         {
            "date":"2021-07-28",
            "text_day":"阴",
            "code_day":"9",
            "text_night":"阴",
            "code_night":"9",
            "high":"28",
            "low":"24",
            "rainfall":"5.67",
            "precip":"0.99",
            "wind_direction":"西南",
            "wind_direction_degree":"229",
            "wind_speed":"21.92",
            "wind_scale":"4",
            "humidity":"94"
         },
         {
             "date":"2021-07-29",
             "text_day":"阴",
             "code_day":"9",
             "text_night":"晴",
             "code_night":"1",
             "high":"30",
             "low":"22",
             "rainfall":"1.2",
             "precip":"0.43",
             "wind_direction":"西",
             "wind_direction_degree":"274",
             "wind_speed":"19.91",
             "wind_scale":"4",
             "humidity":"89"
         },
         {
              "date":"2021-07-30",
              "text_day":"晴",
              "code_day":"0",
              "text_night":"阴",
              "code_night":"9",
              "high":"32",
              "low":"25",
              "rainfall":"1.2",
              "precip":"0.41",
              "wind_direction":"西南",
              "wind_direction_degree":"237",
              "wind_speed":"6.59",
              "wind_scale":"2",
              "humidity":"81"
         }
         ],
         "last_update":"2021-07-28T20:00:00+08:00"
     }
    ]
}

 

因为获取到的数据是json格式的,因此可以利用rt-thread的cJSON 软件包来解析天气

Snipaste_2021-07-23_22-40-05.png

 

 

保存配置后,打开cjson.c文件,可以看到很多解析接口,利用这些接口去解析刚才获取的天气数据

Snipaste_2021-07-28_22-48-23.png

 if((subobject = cJSON_GetObjectItem(object,"location")) != NULL)
 {
    if((item = cJSON_GetObjectItem(subobject,"id")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"name")) != NULL) 
    if((item = cJSON_GetObjectItem(subobject,"country")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"path")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL)                   
 }

 

解析完成后打印输出

Snipaste_2021-07-26_22-38-07.png

Snipaste_2021-07-26_22-52-32.png

中文和英文实际差距很小,一个是&language=en,一个是&language=zh-Hans,或者直接不带这个参数。也可以自己直接在printf里修改,在心知的API里,提供了详细的天气现象代码说明

Snipaste_2021-08-01_22-17-24.png

根据代码对照表就很容易修改printf里的字符串了

Snipaste_2021-08-01_22-48-17.png

 

本帖最后由 数码小叶 于 2021-8-1 22:48 编辑

回复评论 (2)

楼主这个RT-Thread联网获取天气数据整的很好,收藏

点赞  2021-8-2 07:24

组件多了确实方便。

默认摸鱼,再摸鱼。2022、9、28
点赞  2021-8-2 16:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复