你的位置:AIgentX中文网 > FAM中文网 > 【XR806开发板试用】通过http请求从心知天气网获取天气预报信息
【XR806开发板试用】通过http请求从心知天气网获取天气预报信息
发布日期:2025-01-04 15:34 点击次数:197
1. 开发环境搭建本次评测开发环境搭建在windows11的WSL2的Ubuntu20.04中, (1) 在WSL的Ubuntu20.04下安装必要的工具的.安装git:sudo apt-get install git安装gcc编译器套件:sudo apt-get install build-essential安装bear,该工具用来生成编译数据库文件:compile_commands.json,可以实现编辑代码时智能提示和代码跳转.sudo apt-get install bear安装ncurses库,使用make menuconfig配置工程时依赖该库.sudo apt-get install libncurses5-dev(2)安装windows下必要的工具 我们编译的固件要通过串口烧录到XR806,由于WSL2下不能直接使用windows的串口,所以需要在windows下使用工具 usbipd共享串口给WSL2使用,(3)搭建XR806编译开发环境需要注意的是文章中提供的编译工具链gcc-arm-none-eabi-8-2019-q3-update下载链接无效,2. 创建工程我们在终端中进入工程跟目录,按如下步骤来配置工程和编译代码生成镜像:# 复制默认配置文件到顶层目录(不切换工程可不要此步骤)
$ make PRJ=demo/wifi_sta defconfig
# 检查SDK 基础配置,如工程名、芯片型号、高频晶振、板级配置是否正确
$ make menuconfig
# 清理,切换工程时需要
$ make build_clean
# 编译代码并生成镜像文件,生成的镜像文件为“out/xr_system.img”
$ bear make build -j 12
依次执行上述命令后,在工程根目录执行如下命令,使用vscode打开工程code . 在vscode中打开工程目录后,敲击F1键,弹出如下选择项,我们选择C/C++:编辑配置(UI)在编译器路径输入框中输入XR806交叉编译器完整路径,如下图所示:在高级设置下的编译命令输入框中输入编译数据库文件compile_commands.json的路径,如下图所示:3. 编辑工程代码想要从心知天气网获取天气预报,首先需要注册该网站账号. 注册账号并登陆,打开获取天气预报相关的API文档页 其中参数"your_api_key"是你获取天气预报信息的API密钥,该API密钥可以从心知天气网主页进入控制台页面,然后点击左侧的"免费版",即可看到自己的私钥,该私钥即为API 密钥,如下图所示:接下来我们编写代码实现通过http请求从心知天气网获取未来3天的天气信息.首先在main.c中添加必要的头文件:#include
#include
#include "kernel/os/os.h"
#include "net/wlan/wlan.h"
#include "net/wlan/wlan_defs.h"
#include "common/framework/net_ctrl.h"
#include "common/framework/platform_init.h"
#include
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/inet.h"
#include "lwip/netdb.h"
#include "sys/select.h"
#include "cjson/cJSON.h"
然后定义关于天气信息的结构体类型:/* 天气数据结构体 */
typedef struct tagWeather
{
/* 实况天气数据 */
char id[32]; //id
char name[32]; //地名
char country[32]; //国家
char path[32]; //完整地名路径
char timezone[32]; //时区
char timezone_offset[32]; //时差
char text[32]; //天气预报文字
char code[32]; //天气预报代码
char temperature[32]; //气温
char last_update[32]; //最后一次更新的时间
/* 今天、明天、后天天气数据 */
char date[3][32]; //日期
char text_day[3][64]; //白天天气现象文字
char code_day[3][32]; //白天天气现象代码
char code_night[3][64]; //晚间天气现象代码
char high[3][32]; //最高温
char low[3][32]; //最低温
char wind_direction[3][64]; //风向
char wind_speed[3][32]; //风速,单位km/h(当unit=c时)
char wind_scale[3][32]; //风力等级
} Weather_T;
再定义通过http的GET请求方式获取天气预报的请求头部:#define WEB_SERVER "api.seniverse.com" // 天气预报网服务器地址
#define WEB_PORT "80" // 天气预报网服务器端口号
#define CONFIG_API_KEY "xxxxxxxxxxxxxx" // 你的API密钥,从心知天气网控制台页面获取
/* 获取天气预报信息的http请求头部 */
#define GET_REQUEST_PACKAGE
"GET https://api.seniverse.com/v3/weather/daily.json?key=" CONFIG_API_KEY "&location=%s&language=zh-Hans&unit=crnrn"
#define HTTPC_DEMO_THREAD_STACK_SIZE (8 * 1024) /* 任务栈大小 */
定义WiFi的ssid和password:char *sta_ssid = "xxxxxx"; // 你要连接的WiFi名
char *sta_psk = "xxxxxxxx"; // 你要连接的WiFi密码
char httpc_response_buf[2048]; //用于保存获取到的天气信息的原始数据
int write_idx = 0; // 写数据到httpc_response_buf的数组下标
static OS_Thread_t httpc_demo_thread; // 获取天气的线程ID
编写WiFi联网初始化函数:void sta_start(void)
{
/* switch to sta mode */
net_switch_mode(WLAN_MODE_STA);
#if STA_MODE_USE_WPA2_ONLY
/* set ssid and password to wlan, only use WPA2 mode to connect AP. */
wlan_sta_config((uint8_t *)sta_ssid, strlen(sta_ssid), (uint8_t *)sta_psk, 0);
#else
/* set ssid and password to wlan, use WPA2|WPA3 compatible mode to connect AP. */
wlan_sta_set((uint8_t *)sta_ssid, strlen(sta_ssid), (uint8_t *)sta_psk);
#endif
/* start scan and connect to ap automatically */
wlan_sta_enable();
}
在mian函数中添加如下代码int main(void)
{
observer_base *net_ob;
platform_init();
/* create an observer to monitor the net work state */
net_ob = sys_callback_observer_create(CTRL_MSG_TYPE_NETWORK,
NET_CTRL_MSG_ALL,
net_cb,
NULL);
if (net_ob == NULL) {
return -1;
}
if (sys_ctrl_attach(net_ob) != 0) {
return -1;
}
sta_start();
return 0;
}
其中,函数sys_callback_observer_create创建一个事件监听器,当函数第1个参数CTRL_MSG_TYPE_NETWORK和第2个参数NET_CTRL_MSG_ALL所指定的事件发生时自动调用回调函数net_cb,此处表示所有的网络事件发生时均会调用回调函数net_cb,net_cb定义如下:static void net_cb(uint32_t event, uint32_t data, void *arg)
{
uint16_t type = EVENT_SUBTYPE(event);
switch (type) {
case NET_CTRL_MSG_NETWORK_UP: // WiFi sta连接AP成功并自动分配了ip地址
{
/* 打印本机的IP地址,网关,子网掩码 */
struct netif *nif = wlan_netif_get(WLAN_MODE_STA);
while (!NET_IS_IP4_VALID(nif)) {
OS_MSleep(100);
}
printf("local ip: %sn", ipaddr_ntoa(&nif- >ip_addr));
printf("gw: %sn", ipaddr_ntoa(&nif- >gw));
printf("netmask: %sn", ipaddr_ntoa(&nif- >netmask));
}
/*创建线程,通过http请求获取天气预报信息*/
if (!OS_ThreadIsValid(&httpc_demo_thread)) {
OS_ThreadCreate(&httpc_demo_thread,
"httpc_demo_thread",
httpc_demo_fun,
(void *)NULL,
OS_THREAD_PRIO_APP,
HTTPC_DEMO_THREAD_STACK_SIZE);
}
break;
case NET_CTRL_MSG_NETWORK_DOWN: //WiFi连接断开事件
break;
default:
break;
}
}
httpc_demo_fun函数的定义如下:static void httpc_demo_fun(void *arg)
{
http_get_weather("beijing");
// 获取天气预报信息结束后,删除本线程
OS_ThreadDelete(&httpc_demo_thread);
}
其中http_get_weather函数的参数即为想要获取天气预报的城市的汉语拼音名,定义如下:static void http_get_weather(char *city)
{
int32_t ret;
char request_head[sizeof(REQUEST) + 64];
const struct addrinfo hints = {
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM,
};
struct addrinfo *res;
struct in_addr *addr;
int s, r;
Weather_T weather_data = {0};
bzero(httpc_response_buf, sizeof(httpc_response_buf));
/* 通过服务器域名和端口获取服务器的IP地址相关信息 */
ret = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);
if (ret != 0
下一篇:2600元《生化危机》艾达王1/4雕像 腿玩年 上一篇:房天下开发云app
热点资讯
- 比特币价格突破10万美元 创下历史新高 但前景仍存分歧
- 2600元《生化危机》艾达王1/4雕像 腿玩年
- 【XR806开发板试用】通过http请求从心知天气网获取天气预报信息
- 房天下开发云app
- 重磅!吕中元、陶友华等分获“高分子基础研究王葆仁奖”和“高分子科学创新奖”!