//主要功能
#include "head.h"
#include "cJSON.h"
void FunWeather(void);
void RecvSendWeather(void);
int RealTimeWeather(void);
int CreateTcpClient(char *p,int port);
int SendHttpRequest(int sockfd,char *q);
void RecvSendWeather(void);
char city[256] = {0};
int sockfd = 0;
typedef struct media
{
int id;
char menulist[512];//菜单名字的长度
}MEDIA_CFG_S;
typedef struct menuinfo
{
int id;
int pos_start;
int pos_end;
int focus;
}MENU_CFG_S;
MEDIA_CFG_S medialist[32]=
{
{1,"选择城市"},
{2,"实时天气"},
{3,"未来天气"},
{4,"历史天气"},
{5,"退出"},
};
int pos_start=0; //界面起始位置
int pos_end = 4; //界面结束位置
int focus; //界面焦点位置
void PrintfMenu(void)
{
int i =0;
printf("+-----------------------------+\n");
printf("|---------天气预报系统--------|\n");
for(i = pos_start;i<= pos_end;i++)
{
if(i == focus)
{
printf("| |\r|\033[30;43m%2d.%-20s\033[0m\n",medialist[i].id,medialist[i].menulist);
}else
{
printf("| |\r|%2d.%-20s\n",medialist[i].id,medialist[i].menulist);
}
}
printf("+-----------------------------+\n");
return;
}
void MenuChoose(void)
{
char tmpbuff[1024]={0};
char w[10] = {0};
memset(w,0,sizeof(w));
fgets(w,sizeof(w),stdin);
if(27 == w[0] && 10 == w[1])//esc
{
}
if(10 == w[0] && focus ==4)//回车
{
exit(1);
}
if(10 == w[0] && focus ==0)
{
system("clear");
printf("请输入要查询的城市:"); //选择城市
scanf("%s",city);
while(getchar()!= '\n');
// SendWeather();
}
if(10 == w[0] && focus ==1) //实时天气
{
system("clear");
// memset(w,0,sizeof(w));
// fgets(w,sizeof(w),stdin);
// if(10 == w[0])
// {
CreateTcpClient("103.205.5.249",80);
sprintf(tmpbuff,"/?app=weather.today&weaid=%s&appkey=72316&sign=f17235c2563dbbc6643d7a49d83fbc1d",city);
SendHttpRequest(sockfd,tmpbuff);
RecvSendWeather();
RealTimeWeather();
}
if(10 == w[0] && focus ==2) //未来天气
{
// system("clear");
CreateTcpClient("103.205.5.249",80);
sprintf(tmpbuff,"http://api.k780.com/?app=weather.future&weaid=%s&appkey=72316&sign=f17235c2563dbbc6643d7a49d83fbc1d&format=json",city);
SendHttpRequest(sockfd,tmpbuff);
RecvSendWeather();
FunWeather();
}
if(27 == w[0] && 91==w[1])
{
if(65 == w[2])//上
{
if(focus > pos_start)
{
system("clear");
focus--;
}else if(focus == pos_start && pos_start ==0)
{
return;
}else if(focus == pos_start)
{
system("clear");
pos_start--;
pos_end--;
focus--;
}
}else if(66 ==w[2]) //下
{
if(focus < pos_end)
{
system("clear");
focus++;
}else if(focus == pos_end && pos_end == 4)
{
return;
}else if(focus == pos_end)
{
system("clear");
pos_start++;
pos_end++;
focus++;
}
}
}
}
int CreateTcpClient(char *p,int port) //创建一个TCP用户端
{
int ret = 0;
struct sockaddr_in seraddr;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1==sockfd)
{
perror("fail to socket");
return -1;
}
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(port);
seraddr.sin_addr.s_addr = inet_addr(p);
ret = connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
if(-1==ret)
{
perror("fail to connect");
return -1;
}
return 0;
}
int SendHttpRequest(int sockfd,char *q) //向http里面发送
{
char tmpbuff[4096]={0};
ssize_t nsize = 0;
sprintf(tmpbuff,"GET %s HTTP/1.1\r\n",q);
sprintf(tmpbuff,"%sHost: api.k780.com\r\n",tmpbuff);
sprintf(tmpbuff,"%sUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n",tmpbuff);
sprintf(tmpbuff,"%sAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n",tmpbuff);
sprintf(tmpbuff,"%sAccept-Language: en-US,en;q=0.5\r\n",tmpbuff);
sprintf(tmpbuff,"%sConnection: keep-alive\r\n\r\n",tmpbuff);
nsize = send(sockfd,tmpbuff,strlen(tmpbuff),0);
return 0;
}
int RealTimeWeather(void)
{
int fd = 0;
char tmpbuff[1000000] = {0};
fd = open("recv.txt",O_RDONLY);
cJSON *proot = NULL;
cJSON *pvalue = NULL;
cJSON *ptmp = NULL;
read(fd,tmpbuff,sizeof(tmpbuff));
proot = cJSON_Parse(tmpbuff);
if(NULL == proot)
{
fprintf(stderr,"creat root json failed!\n");
}
pvalue = cJSON_GetObjectItem(proot,"result");
if(NULL == pvalue)
{
fprintf(stderr,"can not find result\n");
return -1;
}
ptmp = cJSON_GetObjectItem(pvalue,"days");
printf("时间:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"week");
printf("星期:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"citynm");
printf("地点:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"temperature_curr");
printf("当前温度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"temp_high");
printf("最高温度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"temp_low");
printf("最低温度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"weather");
printf("天气:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"humidity");
printf("当前湿度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"humi_high");
printf("最大湿度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"humi_low");
printf("最小湿度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"temperature");
printf("白天 夜间温度:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"aqi");
printf("pm2.5:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"wind");
printf("风向:%s\n",ptmp->valuestring);
ptmp = cJSON_GetObjectItem(pvalue,"winp");
printf("风力:%s\n",ptmp->valuestring);
close(fd);
cJSON_Delete(proot);
}
void FunWeather(void)
{
cJSON *proot = NULL;
cJSON *pvalue = NULL;
cJSON *ptmp = NULL;
cJSON *p = NULL;
int fd = 0;
int i = 0;
char tmpbuff[4096] = {0};
fd = open("recv.txt",O_RDONLY);
read(fd,tmpbuff,sizeof(tmpbuff));
proot = cJSON_Parse(tmpbuff);
if(NULL == proot)
{
fprintf(stderr,"creat root json failed!\n");
}
pvalue = cJSON_GetObjectItem(proot,"result");
if(NULL == pvalue)
{
fprintf(stderr,"can not find result\n");
// return -1;
}
for( i = 0;i < cJSON_GetArraySize(pvalue);++i)
{
ptmp = cJSON_GetArrayItem(pvalue,i);
if(NULL == ptmp)
{
fprintf(stderr, "can not find location json struct %d item\n", i);
// return -1;
}
p = cJSON_GetObjectItem(ptmp,"days");
printf("时间:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"week");
printf("星期:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"citynm");
printf("地点:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"weather");
printf("天气:%-20s",p->valuestring);
putchar('\n');
p = cJSON_GetObjectItem(ptmp,"temperature");
printf("白天 夜间温度:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"temp_high");
printf("白天温度:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"temp_low");
printf("夜间温度:%-20s",p->valuestring);
putchar('\n');
p = cJSON_GetObjectItem(ptmp,"wind");
printf("风向:%-20s",p->valuestring);
p = cJSON_GetObjectItem(ptmp,"winp");
printf("风力:%-20s",p->valuestring);
putchar('\n');
}
close(fd);
cJSON_Delete(proot);
}
void RecvSendWeather(void)
{
int fd = 0;
char buff[30000];
char cmpbuff[30000];
char tmpbuff[4096]={0};
ssize_t nsize = 0;
char *ptmp = NULL;
char *pstart = NULL;
char *pend =NULL;
fd = open("recv.txt",O_RDWR|O_CREAT|O_TRUNC,0664);
while(1)
{
memset(tmpbuff,0,sizeof(tmpbuff));
nsize = recv(sockfd,tmpbuff,sizeof(tmpbuff),0);
strcat(buff,tmpbuff);
if(strstr(tmpbuff,"0\r\n") != NULL)
{
break;
}
}
ptmp = strstr(buff,"\r\n\r\n");
ptmp += 4;
ptmp = strstr(ptmp,"\r\n");
ptmp += 2;
pstart = ptmp;
pend = strstr(ptmp,"\r\n");
memset(cmpbuff,0,sizeof(cmpbuff));
strncpy(cmpbuff,pstart,pend - pstart);
write(fd,cmpbuff,strlen(cmpbuff));
/*
sockfd = CreateTcpClient("103.205.5.249",80);
SendHttpRequest(sockfd,"/?app=weather.today&weaid=西安&appkey=44923&sign=c9815919d111da6c2c9ca64a304f640b&format=json");
nsize = recv(sockfd,tmpbuff,sizeof(tmpbuff),0);
printf("================================= RECV ================================\n");
printf("%s\n", tmpbuff);
printf("=======================================================================\n");
*/
close(sockfd);
close(fd);
}
int main(void)
{
while(1)
{
// system("clear");
PrintfMenu();
MenuChoose();
}
return 0;
}