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