SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS X等)的应用软件。现SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
1.天气获取
天气获取采用命令行浏览器curl,天气获取接口使用心知天气网;
心知天气是中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据、天气监控机器人、气象数据可视化产品,本次天气数据获取从心知天气网平台获取。
2.天气获取与解析示例
/******************解析 天气数据**************** 形参: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!='�') { data[i++]=*p++; } data[i]='�'; 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]='�'; 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:%sttemp:%st天气:%st天气代号:%dn",weather_info.city_name,weather_info.city_temp,weather_info.city_weather,weather_info.city_code); pclose(fp); return 0; }
3.显示时间和天气示例
sec=time(NULL); if(sec!=sec2) { sec2=sec; count++; localtime_r(&sec2,&result);//将秒单位时间转换为时间结构体 strftime(buff,sizeof(buff),"%H:%M",&result);//时间格式化打印 //printf("buff=%sn",buff); TTF_SetFontSize(ttffont,100); surface1=TTF_RenderUTF8_Blended(ttffont,buff,color2); rect.h=surface1->h; rect.w=surface1->w; rect.x=800/2-surface1->w/2;/*要显示的x起始位置*/ rect.y=120;/*要显示的y起始位置*/ srcrect.h=surface1->h; srcrect.w=surface1->w; sdltext1=SDL_CreateTextureFromSurface(render,surface1); SDL_RenderCopy(render,sdltext2,&rect,&rect); SDL_RenderCopy(render,sdltext1,&srcrect,&rect); SDL_FreeSurface(surface1);/*释放surface*/ SDL_DestroyTexture(sdltext1);/*释放表面*/ TTF_SetFontSize(ttffont,50); strftime(week_buff,sizeof(week_buff),"%w",&result); week_cnt=atoi(week_buff); strftime(buff,sizeof(buff),"%Y/%m/%d 星期",&result);//时间格式化打印 strncat(buff,week[week_cnt],sizeof(buff)); strncat(buff," | ",sizeof(buff)); surface2=TTF_RenderUTF8_Blended(ttffont,buff,color2); rect.h=surface2->h; rect.w=surface2->w; rect.x=800/2-surface2->w/2-40;/*要显示的x起始位置*/ rect.y=240;/*要显示的y起始位置*/ wather_x=rect.x+surface2->w; wather_y=rect.y; srcrect.h=surface2->h; srcrect.w=surface2->w; sdltext3=SDL_CreateTextureFromSurface(render,surface2); SDL_RenderCopy(render,sdltext2,&rect,&rect); SDL_RenderCopy(render,sdltext3,&srcrect,&rect); SDL_FreeSurface(surface2);/*释放surface*/ SDL_DestroyTexture(sdltext3);/*释放表面*/ if(count>=60)/*60s获取一次天气数据*/ { count=0; if(!Http_GetWeather())/*获取天气*/ { char image[50]; snprintf(image,sizeof(image),"./weather_photo/%d.png",weather_info.city_code); SDL_Surface *weather_surface=IMG_Load(image); if(weather_surface) { SDL_Rect rect; rect.x=wather_x; rect.y=wather_y; rect.w=50; rect.h=50; srcrect.h=weather_surface->h; srcrect.w=weather_surface->w; SDL_Texture *sdltext=SDL_CreateTextureFromSurface(render,weather_surface);/*创建*/ SDL_RenderCopy(render,sdltext2,&rect,&rect); SDL_RenderCopy(render,sdltext,&srcrect,&rect); SDL_FreeSurface(weather_surface);/*释放surface*/ SDL_DestroyTexture(sdltext);/*释放表面*/ /*显示温度*/ SDL_Surface *temp_surface=TTF_RenderUTF8_Blended(ttffont,weather_info.city_temp,color2); SDL_Texture *temp_sdltext=SDL_CreateTextureFromSurface(render,temp_surface); rect.x=wather_x+50; rect.y=wather_y; srcrect.h=temp_surface->h; srcrect.w=temp_surface->w; SDL_RenderCopy(render,sdltext2,&rect,&rect); SDL_RenderCopy(render,temp_sdltext,&srcrect,&rect); SDL_FreeSurface(temp_surface);/*释放surface*/ SDL_DestroyTexture(temp_sdltext);/*释放表面*/ } } } SDL_RenderPresent(render);//更新显示 }
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux
+关注
关注
87文章
11231浏览量
208937 -
SDL
+关注
关注
0文章
18浏览量
7387 -
开发库
+关注
关注
0文章
7浏览量
4860
发布评论请先 登录
相关推荐
SDL编译安装图片显示
SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以
Linux下基于SDL库贪吃蛇游戏
SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以
天气预警收音机方案
/通道/时间显示二、 LCD 全显图三、 天气广播---------------------------------------------------------------
发表于 05-20 17:56
SDL的交叉编译问题
求助!!移植SDL到mini2440开发板上时,在交叉编译SDL_image进行configure之后,再make时出现如下错误:/opt/mini2440/output/lib/libSDL.so
发表于 12-06 20:50
移植SDL到JZ2440显示BMP图片
LOGO的制作, 韦老师第3期讲了如何显示jpeg图片, 那么怎么显示bmp图片?这次我们借助libSDL来实现,我们先移植SDL到Ubuntu, 体验它的威力后再移植到开发板。一、移植SDL
发表于 06-29 11:19
OLED屏幕显示时间天气设计实现
通过HTTP GET天气网站的API接口,将返回的Json中天气数据解析出来显示。需要显示的图标可以通过取模软件转成对应的数组工程直接编译之后只有需要配一下网,配网接口嫌麻烦,没有写,
发表于 01-18 10:13
STM32+ESP8266获取网络时间和天气的方法
先给出两个可以获取天气和时间的网站https://www.seniverse.com/docs 可以获取天气http://api.k780.com:88/?app=life.time&
发表于 02-18 07:56
GUI向导编译错误,找不到“SDL2/SDL.h”文件是怎么回事?
如何找出编译错误:找不到“SDL2/SDL.h”文件
使用 MAC OS 12.6 和最新的guy guider 版本。
发表于 05-04 08:44
基于SDL的自动售票系统的研发
基于SDL 的自动售票系统的研发顾丽丽 梅杓春(南京邮电大学自动化学院,江苏南京 210003)摘要:本文简要介绍了SDL语言及其支持工具。通过设计自动售票系统实例对如何利用SDL
发表于 12-18 11:34
•21次下载
SDL1000X系列可编程直流电子负载的产品介绍
SDL1000X/SDL1000X-E 可编程直流电子负载配备了3.5 英寸 TFT-LCD 显示屏,拥有友好的人机交互界面和优异的性能指标,SDL1020X/
发表于 02-18 08:00
•4次下载
SDL下载与配置
点击[SDL2 核心库下载](https://libsdl.org/download-2.0.php)下载SDL2库,如下图根据编译器选择不同版本(Visual Studo系列选择第一个)。
评论