SDL时间和天气显示

时间:2023-03-27 13:03:57

1.天气获取

   天气获取采用命令行浏览器curl,天气获取接口使用心知天气网;

     心知天气是中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据、天气监控机器人、气象数据可视化产品,本次天气数据获取从心知天气网平台获取。

  •  实现步骤

1.创建心知天气个人账户

平台地址:https://www.seniverse.com/

SDL时间和天气显示

2.选择产品->天气数据接口,免费试用。

SDL时间和天气显示

3.选择免费申请,激活

SDL时间和天气显示

激活成功后即可看到公钥和私钥,这个参数在后面获取数据是需要用到。

SDL时间和天气显示

4.HTTP方式获取天气数据.

     超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

      HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本 HTTP 1.1。

      HTTP 是一个基于 TCP/IP 通信协议来传递数据( HTML 文件, 图片文件, 查询结果等)。工作于客户端-服务端架构上,默认端口号为 80,但是你也可以改为 8080或其它端口号。HTTP协议永远都是客户端发起请求,服务器回送响应。

SDL时间和天气显示

  • 接口说明
https://api.seniverse.com/v3/weather/now.json?key=SwD4-aaQxhedD1z7U&location=beijing&language=zh-Hans&unit=c
“api.seniverse.com”     -- 平台访问域名
“SwD4-aaQxhedD1z7U”  --个人私有秘钥
“beijing”             --要获取的城市名称
“zh-Hans”           --获取到的数据语言(zh-Hans为简体中文)

SDL时间和天气显示


5.功能实现

心知的 API 目前基于 http 协议,域名是 api.seniverse.com,端口是缺省的 80(http)和 443(https)。

/******************解析 天气数据****************
形参:u8* buff原始数据
			u8 *Weather_stat天气数据标志
			u8 *data解析获取到的数据
返回值:0---成功,其他值---失败
************************************************/
u8 Weather_analysis(u8* buff,u8 *Weather_stat,u8 *data)
{
	char *p=NULL;
	u16 i=0;
	p=strstr((char *)buff,(char *)Weather_stat);//获取温度
	if(p)
	{
		p+=strlen((char *)Weather_stat)+2;
		i=0;
		while(*p!='\"' && *p!='\0')
		{
			data[i++]=*p++;
		}
		data[i]='\0';
		return 0;
	}
	else return 1;
}
/*获取天气数据*/
int Http_GetWeather(void)
{
	FILE *fp=popen("curl  api.seniverse.com/v3/weather/now.json?key=SwD4-ybQxhedD1z7U'&'location=nanchang'&'language=zh-Hans'&'unit=c","r");
	if(fp==NULL)
	{
		printf("重定向失败\n");
		return -1;
	}
	char wthread_buff[1025];
	int cnt=fread(wthread_buff,1,1024,fp);
	wthread_buff[cnt]='\0';
	char buff[100];
	wchar_t wc_buff[200];
	int stat;
	/*
		{"results":[{"location":{"id":"WT47HJP3HEMP","name":"南昌","country":"CN","path":"南昌,南昌,江西,中国",
		"timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"16"},"last_update":"2021-11-20T16:57:46+08:00"}]}
	*/
	/*解析天气数据*/
	Weather_analysis(wthread_buff,(u8 *)"\"name\"",(u8 *)weather_info.city_name);//城市名称
		
	if(!Weather_analysis(wthread_buff,(u8 *)"\"temperature\"",(u8 *)buff))//获取温度
	{
		snprintf((char *)weather_info.city_temp,sizeof(weather_info.city_temp),"%s℃",buff);
	}
	Weather_analysis(wthread_buff,"\"text\"",(u8 *)weather_info.city_weather);
	if(!Weather_analysis(wthread_buff,(u8 *)"\"code\"",(u8 *)buff))//天气代码
	{
		weather_info.city_code=atoi(buff);//字符串转整数
	}
	//printf("name:%s\ttemp:%s\t天气:%s\t天气代号:%d\n",weather_info.city_name,weather_info.city_temp,weather_info.city_weather,weather_info.city_code);
	pclose(fp);
	return 0;
}

2.显示时间和天气示例

SDL时间和天气显示