需求分析:1.需要Linux c 网络编程基础,2.需要了解 http 协议3.需要天气信息相关api(可以从阿里云上购买,很便宜的!)4.需要cJSON解析库(因为获取到的天气信息一般是用cJSON封装,有的是用xml封装则需要相关解析库)cJSON下载链接:https://github.com/DaveGamble/cJSON
cJSON在线代码格式化:http://tool.oschina.net/codeformat/json
cJSON简解及使用:cJSON核心结构体:
typedef struct cJSON
{struct cJSON *next;struct cJSON *prev;struct cJSON *child;int type;           /*键类型*/char *valuestring;  /*字符串值*/int valueint;       /*整形值*/double valuedouble; /*浮点值*/ char *string;       /*键名称*/
} cJSON;说明:cJSON数据是以(键-值)形式存在。每个键对应的值都可以访问(valuestring、valueint、valuedouble)成员得到。主要用到的函数:1. CSJON_PUBLIC(cJSON*) cJSON_Parse(const char *value);用了获得根节点,2. CSJON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char *const string);用来获得根节点下的子节点,3. CSJON_PUBLIC(void) cJSON_Delete(const cJSON *item);用来释放为根节点分配的内存!
获取天气的http协议:"GET /phone-post-code-weeather?""phone_code=021 ""HTTP/1.1\r\n""Host:ali-weather.showapi.com\r\n""Authorization:APPCODE xxxxxx\r\n\r\n"解释说明:"/phone-post-code-weeather"此部分对应于 path格式"Host:ali-weather.showapi.com"此部分对应于 接口域名"phone_code" 表示城市编号021为上海(记住后面要空格)"xxxxxx" 为你购买的APPCODE 这我就不填。。。
![这里写图片描述](http://img.blog.csdn.net/20170815164731926?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ29taW5nRmx5aW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
相关代码:#include <netdb.h>
#include <stdbool.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>#include "common.h"
#include "cJSON.h"#define SERV_PORT   80typedef struct sockaddr SA;void http_request(char *buf, int size, char *city_name);
void analyze_CJSON(const char *json);
char *recv_msg(int sockfd);int main(int argc, char **argv)
{int sockfd;struct hostent *hptr = NULL;struct sockaddr_in servaddr; struct in_addr  **pptr;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {err_quit("socket error");}char *alias_name = "ali-weather.showapi.com";//char *alias_name = "jisutianqi.market.alicloudapi.com";//得到接口域名的IP地址if ((hptr = gethostbyname(alias_name)) == NULL) {err_quit("gethostbyname error for host: %s: %s", alias_name, hstrerror(h_errno));}pptr = (struct in_addr **)hptr->h_addr_list;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family  =   AF_INET;servaddr.sin_port    =   htons(SERV_PORT);memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0) {err_quit("connect error");}char buf[MAXLINE];//设置想要查询的城市编号,也可以安其他方式查询char *phone_code = "021";http_request(buf, MAXLINE, phone_code);//发送http请求if (write(sockfd, buf, strlen(buf)) != strlen(buf)) {err_quit("write error");}//接收返回信息char *json = recv_msg(sockfd);//解析CJSON数据analyze_CJSON(json);return EXIT_SUCCESS;
}void http_request(char *buf, int size, char *phone_code)
{bzero(buf, size);snprintf(buf, size, "GET /phone-post-code-weeather?""phone_code=%s ""HTTP/1.1\r\n"//"Host:jisutianqi.market.alicloudapi.com\r\n""Host:ali-weather.showapi.com\r\n""Authorization:APPCODE d487d937315848af80710a06f4592fee\r\n\r\n", phone_code);
}/***注意:返回的信息包含http报头信息和实际的CJSON数据,我们只*需要CJSON数据,所有需要做一定处理。**/
char * recv_msg(int sockfd)
{int nread;char recvbuf[4096];char *begin = NULL, *end = NULL;char *lenght = NULL;char *data = NULL;char tar[] = "Content-Length: ";bool flage = true;while (1) {bzero(recvbuf, sizeof(recvbuf));if ((nread = read(sockfd, recvbuf, sizeof(recvbuf))) == 0) {break;}//获得cJSON数据的字节数,存储到lenght中,并调用atoi函数将其转化为int类型if (strstr(recvbuf, "403") != NULL || strstr(recvbuf, "Quota Exhausted")) {err_quit("your appcode is expire..");}if (flage) {if ((begin = strstr(recvbuf, tar)) != NULL) {if ((end = strstr(begin, "\r\n")) != NULL) {lenght = malloc(end - (begin+strlen(tar)));memcpy(lenght, begin+strlen(tar), end-(begin+strlen(tar)));data = calloc(1, atoi(lenght));if (data == NULL) {err_quit("malloc error");}strcpy(data, strrchr(recvbuf, '\n')+1);}} else {continue;}}if (!flage) {strcat(data, recvbuf);}if (strlen(data) == atoi(lenght)) {break;}flage = false;}printf("atoi(lenght) = %d\n", atoi(lenght));free(lenght);return data;
}void analyze_CJSON(const char *json)
{//获得根节点cJSON *root = cJSON_Parse(json);if (root == NULL) {err_quit("cJSON_Parse error");}cJSON *body = cJSON_GetObjectItem(root, "showapi_res_body");if (body == NULL) {err_quit("body error");}//判断是否成功得到数据if (cJSON_GetObjectItem(body, "ret_code")->valueint == -1) {err_quit("json data invalid..");}cJSON *now = cJSON_GetObjectItem(body, "now");if (now == NULL) {err_quit("get now failure");}cJSON *aqiDetai = cJSON_GetObjectItem(now, "aqiDetail");if (aqiDetai == NULL) {err_quit("get aqiDetai failure");}cJSON *cityinfo = cJSON_GetObjectItem(body, "cityInfo");if (cityinfo == NULL) {err_quit("get cityinfo failure");}cJSON *f1 = cJSON_GetObjectItem(body, "f1");if (f1 == NULL) {err_quit("get f1 failure");}cJSON *f2 = cJSON_GetObjectItem(body, "f2");if (f1 == NULL) {err_quit("get f2 failure");}cJSON *f3 = cJSON_GetObjectItem(body, "f3");if (f1 == NULL) {err_quit("get f3 failure");}printf("            country:\t%s\n", cJSON_GetObjectItem(cityinfo, "c9")->valuestring);printf("               area:\t%s\n", cJSON_GetObjectItem(aqiDetai, "area")->valuestring);printf("            quality:\t%s\n", cJSON_GetObjectItem(aqiDetai, "quality")->valuestring);printf("              pm2_5:\t%s\n", cJSON_GetObjectItem(aqiDetai, "pm2_5")->valuestring);printf("               pm10:\t%s\n", cJSON_GetObjectItem(aqiDetai, "pm10")->valuestring);printf("                aqi:\t%s\n", cJSON_GetObjectItem(aqiDetai, "aqi")->valuestring);printf("\ntoday weather:\n");printf("        day_weather:\t%s\n", cJSON_GetObjectItem(f1, "day_weather")->valuestring);printf("     day_wind_power:\t%s\n", cJSON_GetObjectItem(f1, "day_wind_power")->valuestring);printf(" day_wind_direction:\t%s\n", cJSON_GetObjectItem(f1, "day_wind_direction")->valuestring);printf("day_air_temperature:\t%s\n", cJSON_GetObjectItem(f1, "day_air_temperature")->valuestring);printf("\ntomorrow weather:\n");printf("        day_weather:\t%s\n", cJSON_GetObjectItem(f2, "day_weather")->valuestring);printf("     day_wind_power:\t%s\n", cJSON_GetObjectItem(f2, "day_wind_power")->valuestring);printf(" day_wind_direction:\t%s\n", cJSON_GetObjectItem(f2, "day_wind_direction")->valuestring);printf("day_air_temperature:\t%s\n", cJSON_GetObjectItem(f2, "day_air_temperature")->valuestring);printf("\nthe day after tomorrow weather:\n");printf("        day_weather:\t%s\n", cJSON_GetObjectItem(f3, "day_weather")->valuestring);printf("     day_wind_power:\t%s\n", cJSON_GetObjectItem(f3, "day_wind_power")->valuestring);printf(" day_wind_direction:\t%s\n", cJSON_GetObjectItem(f3, "day_wind_direction")->valuestring);printf("day_air_temperature:\t%s\n", cJSON_GetObjectItem(f3, "day_air_temperature")->valuestring);cJSON_Delete(root);
}

转载于:https://www.cnblogs.com/Focus-Flying/p/9279163.html

Linux网络编程之获取网络天气信息相关推荐

  1. java获取主机信息大全,网络编程:Java获取网络主机信息

    java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...

  2. php获得注册信息,PHP网络编程:获取用户的注册信息[2]

    PHP网络编程:获取用户的注册信息[2]以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!     --此文章摘自<P ...

  3. python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。

    上一个章节我们说的是套接字名和DNS.这篇文章我们主要解决下面问题. 我们在两台主机之间建立与关闭TCP流连接以及UDP数据报连接后.我们应该怎么准备我们需要传输的数据,该怎么对数据进行编码与格式化. ...

  4. 【Java 18】网络编程 - 概述、网络编程要素、IP和端口号、网络协议、TCP、UDP、URL

    网络编程 - 概述.网络编程要素.IP和端口号.网络协议.TCP.UDP.URL 网络编程 1 网络编程概述 2 网络通信要素概述 3 通信要素1:IP和端口号 3.1 内容 3.2 InetAddr ...

  5. 使用java网络编程模拟简单网络即时通信

    使用java网络编程模拟简单网络即时通信 通信流程图: 解析: 1.在上图中我们可以看出对于任何一个客户端,都由两部分构成,发送端和接收端(分别由两个线程来维系) 2.客户端在每一次请求链接时都会轮询 ...

  6. 【JavaSe】网络编程篇(一) 网络编程入门

    JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...

  7. 网络编程笔记之网络编程入门

    网络编程的概念 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的.中间最主要的就是数据包的组装,数据包的过滤 ...

  8. 【IoT最佳实践】设备获取实时天气信息

    [摘要] 物联网智能设备可以通过物联网平台统一获取实时天气信息,本文提供一个实现该功能的DEMO和其使用方法. 场景说明 随着技术的发展,物联网设备也越来越智能化,例如可以显示当地的实时天气. 在物联 ...

  9. 通过Temboo实现从Arduino获取雅虎天气信息

    如果问我未来的科技行业发展有哪些亮点的话,我必须说物联网一定是其中之一.物联网技术发展迅速,现在我们已经看到非常多的设备通过互联网互相通信了.物联网技术的发展背后的推动因素之一是Arduino和Ras ...

最新文章

  1. ftl模板导出excel_freemarker导出复杂Excel
  2. windows内存管理和API函数
  3. ROC曲线 vs Precision-Recall曲线
  4. 计算机网络第4章(网络层)
  5. war部署到tomcat
  6. [Uva10641]Barisal Stadium(区间dp)
  7. Windows MinGW cmake 安装编译Opencv 3.4.3 C++开发环境
  8. 收银系统服务器有什么好处,生鲜超市收银系统软件怎么选?收银系统能带来什么好处?...
  9. Android笔记 fragment的Tab样式demo
  10. C语言插件开发模式与分析
  11. Windows server 2016远程桌面登录和修改3389端口
  12. 定时器应用-页面弹出广告
  13. 网上招生报名系统V1.0发布
  14. mybatis 打印sql_不敢相信,相同SQL下Mybatis查询结果和数据库竟然不一样!
  15. ThinkPHP的CURD操作
  16. 查看网页上次更新时间
  17. QGC使用国内天地图卫星图并添加注记图层
  18. python连接数据库mysql失败_python连接mysql失败怎么解决
  19. 系统短信验证码实现案例
  20. 云服务显示服务器异常,云服务器显示异常登录

热门文章

  1. 计算机系统原理实验——微程序控制器
  2. java小明摘苹果_Java实现 洛谷 P1487 陶陶摘苹果(升级版)
  3. 解决小程序-wx.canvasGetImageData()-RGB取色盘苹果手机获取颜色慢问题
  4. 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动
  5. Python爬虫+数据分析+数据可视化(分析《雪中悍刀行》弹幕)
  6. 大数据必学语言Scala(三十三):scala高级用法 模式匹配
  7. [DP]Apple Catching G
  8. 林业工程抗旱造林技术
  9. xshell6使用技巧_Xshell 6怎么设置为中文-Xshell 6设置为中文的方法 - 河东软件园
  10. java xlsx转html