在上一篇中,已经实现了art-pi的网络自动连接,并且可以获取网络时间,还差一个天气情况。 RT-Thread提供了丰富的组件,webclient 是 RT-Thread 上实现的一个 HTTP 客户端,用来提供高效且功能丰富的 HTTP 客户端编程工具包,利用这个工具可以完成与 HTTP 服务器的通信。
打开webclient,并且使能开启 webclient 的 GET/POST 示例
再打开包里http客户端示例
打开的示例,中文显示是乱码,不方便理解,需要修改文档的编码格式,修改后就可以正常显示了
在http示例里,其获取天气的服务器是http://mobile.weather.com.cn/data/sk/%s.html,实际测试已经打不开。
后来在文档中看到了这个的说明“此程序仅为 http client 的示例程序,其中获取天气的 API 已经被弃用,实际使用时更换为其他的 API 才可获取最新的天气。”因此,想要获取天气数据,只能更改API了,于是参考了 RT-thread入门课程中的心知天气获取,更改为心知的API。
虽然第一次使用,但是发现利用官网页面还是很容易上手的。心知天气按收费分为好几个版本,越贵的参数越多,不过,免费的感觉已经够用了。注册一个账户先。
其接口API,有详细的说明,每个参数的函数,以及每个参数是否要给出都有介绍,使用起来很容易操作
实际来获取指定城市,查询时的天气实况
{
"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"
}
]
}
再比如获取指定城市三天的天气情况
{
"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 软件包来解析天气
保存配置后,打开cjson.c文件,可以看到很多解析接口,利用这些接口去解析刚才获取的天气数据
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)
}
解析完成后打印输出
中文和英文实际差距很小,一个是&language=en,一个是&language=zh-Hans,或者直接不带这个参数。也可以自己直接在printf里修改,在心知的API里,提供了详细的天气现象代码说明
根据代码对照表就很容易修改printf里的字符串了
本帖最后由 数码小叶 于 2021-8-1 22:48 编辑