BabyOS的HTTP接口获取天气
上一次提到BabyOS可以自动同步网络时间,基于此DIY一个电子时钟便是很方便。
如果增加更多的元素,例如获取天气信息,获取实时新闻等。这些数据在网上可以找到http请求的接口。
获取天气的接口
获取天气有很多免费的接口,只是对每日的请求次数有限制,但不影响DIY的使用。基于高德天气接口做实验。
GET请求接口:
http://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=<用户key>
接口参数的介绍可以访问:https://lbs.amap.com/api/webservice/guide/api/weatherinfo
使用postman调用接口获取深圳的天气信息,返回的body数据如下,可以提取 天气、温度和湿度。
{
"status": "1",
"count": "1",
"info": "OK",
"infocode": "10000",
"lives": [
{
"province": "广东",
"city": "深圳市",
"adcode": "440300",
"weather": "阴",
"temperature": "27",
"winddirection": "西南",
"windpower": "≤3",
"humidity": "82",
"reporttime": "2024-03-31 12:30:17",
"temperature_float": "27.0",
"humidity_float": "82.0"
}
]
}
HTTP请求实现
HTTP是基于TCP的传输协议,目前的代码已实现TCP,基于此再实现HTTP接口。整个流程如下:
接收的数据是否完整需要解析校验,那么引入了第三方代码 http-parser。将收到的数据喂给http-parser,可以知道响应数据是否接收完成。
获取天气实验
BabyOS的test目录内代码可以在Linux平台运行,请切换到dev分支,进入test/netif/目录。
基于原ntp例子进行修改,体验前需要将这里的用户key补齐:
void ntp_test()
{
bUTC_DateTime_t tm;
bUTC_t now_utc = bUTC_GetTime();
bUTC2Struct(&tm, now_utc, 8);
b_log("%d-%02d-%02d %02d:%02d:%02d %02d\r\n", tm.year, tm.month, tm.day, tm.hour, tm.minute,
tm.second, tm.week);
b_log_w(":::::%d\r\n", bGetFreeSize());
if (now_utc > 1711855508)
{
bHttpRequest(httpfd, B_HTTP_GET,
"http://restapi.amap.com/v3/weather/"
"weatherInfo?city=440300&key=XXXXXXXX",
NULL, NULL);
}
}
执行指令:
make
生成可执行文件在build目录,接着执行:
./build/BabyOS
实验效果:
硬件板子上实验
linux平台调试完成后,可以试试在硬件板子上运行。更新例程: