天气查询系统
项目要求
项目知识点
问题与解决
代码分部
结果展示
项目要求
1.显示天气预报系统界面
2.系统可以通过选择城市配置获取不同城市天气信息
3.查看实时的天气信息
(当前温度、最高温度、最低温度、当前湿度、最高湿度、最低湿度、风向、风力、风级等信息)
4.查看未来一周天气
5.能够输入指定日期并获得该天不同时间段的历史信息(点击左右按键,查看输入日期前一天后一天的信息)(不实现历史信息)
1.选择城市 2.历史天气 3.实时天气 4.未来天气 5.退出
项目知识点
通过使用 http 协议查询并获取 api.k780.com 网站天气信息并分析
提取并分割信息方式采用strstr + strncpy(空间泄露?)或 JSON(添加头文件以及函数的使用)
绘制菜单采用\033屏幕控制
采用 snprntf 函数拼接网址报文,结合read,write网络相关函数获取信息
定义全局变量模式以便switch选择
定义结构体存放关键字信息
- 实现功能:
选择查询方式:历史天气 实时天气 未来天气
每个查询方式实现:
1. 信息获取 建立连接 => 输入数据(城市) => 拼接命令 =>
服务器发送 => 客户端接收
2. 信息处理 查找关键字 => 提取关键字信息
3. 信息打印 打印关键字信息
问题与解决
(√)1.刚开始只实现模式为实时天气,后续添加其他模式要注意报文的改变
(√)2.模式菜单的选择>>
w上移s下移p选择
移动时清除原来的>>, 选择的退出循环
(√)3.返回模式后switch判断
(√)4.报文的变化
- 未来报文:
https://sapi.k780.com/?app=weather.future①模式切换
&weaId=1②换成获取的城市名
&③多一个& 经过测试与不多添加&相同,可省略
&appkey=10003&sign=b59bc3ef ...... f2a4&format=json
- 未来指数(未解决)
https://sapi.k780.com/?app=weather.lifeindex①
&weaId=1②
&appkey=10003&sign=b59bc3ef ...... 2a4&format=json
- 实时报文:
https://sapi.k780.com/?app=weather.today①
&weaId=1②
&appkey=10003&sign=b59bc3ef ......2a4&format=json
未来返回的缺少temp_curr,aqi, wea_curr
多六个生活指数
风向+风力拼成一个
注意: strstr截断文本时+1可以在再次寻找当前字符串时寻找到下一个,而不是当前的
(√)5.获取未来数据的方式
目前打算:在主函数中用i获取天数
随后调用msg_get函数逐个获取futuer[i]
(√)6.模式选择历史和返回应该回到欢迎页面,但报段错误
退出:使用while循环解决,在整体输入完后再解决
返回:设置跳点,跳通过转GO函数实现跳转回模式菜单页面
7.多查询几次会出现段错误,目前认为是strncpy导致空间溢出或网络问题
8.避免空间泄露,最好只读取一次信息进行分析(未解决)
(√)9.未来7日存入数据定义weather_t future[7];存入
输出菜单时在菜单函数外清屏
防止每次输入都会清屏,最终只输出最后一天的数据
(√)11.可以重置光标位置
(√)12.ping api.k780.com出来两个端口,注意上网许可
代码分部
客户端函数(主函数)
要点:
1. 定义全局模式
2. ping 网址 api.k780.com 有两个地址,注意能否上网,端口号为80
要点:
1. 欢迎 和 模式菜单的绘制并显示(菜单代码部分)
2. 设置跳转起始点
3. 获取模式结果后switch 处理单个模式:未获取数据打印提示
获取数据修改报文分布
返回:进入下一次循环 即 返回欢迎菜单
要点:
1. 注意保报文每个分部的含义即需要修改的地方
2. 模式1,2,3进入信息获取与处理(模式3未实现)
3. 每次获取信息时先清空数组空间,避免空间泄露
4. 未来天气数据获取需要存放至数量为7的结构体空间,注意处理方式(可以重新定义函数减轻主函数体量,未实现)
5. 未来天气菜单页面显示需要在显示菜单外清屏,否则每次获取菜单时都会清屏,最后只显示最后一组数据
,
要点:
1. 返回结果会跳转到设置的起点,即模式菜单
2. 退出结果会结束循环置下一循环,即欢迎菜单
信息获取处理函数(部分)
要点:
1. 函数传入参数为从网址获取的信息以及模式(不同模式需要获取的信息有不同)
2. strstr获取关键字信息为分部的起点
3. 根据获取信息内容为jansson模式,strchr获取结尾部分为分部的结尾
4. 再获取分布的长度,通过strncpy截取信息进行结构体的存放
5. 可使用JSON方式截取信息
6. 函数返回整个结构体weather_t
菜单函数(部分)
要点:
1. 可通过定义全局变量,对变量进行四则运算处理横纵坐标(未实现)
2. 注意重新定义光标位置注意全局美观(后续菜单一样)
要点:
1. 模式菜单选择通过键盘输入进行操作,添加操作说明部分
2. getchar有阻塞作用,选择输入p结束阻塞,确定并返回模式
3. 模式仅有5个,注意循环的判断操作
4. 选择模式时注意画面的反馈:清楚移动前的 >> ,显示移动后的 >>
要点:
1. 构造边框并显示,添加图标改变颜色增加多样性,注意要结合整体的位置
2. 单独对一部分信息进行了图标变换,由于需要进行信息与汉字的判断,结合计算机存放信息的底层逻辑,查找汉字的编码进行判断操作
3. 未来天气与未来指数菜单同理,区别与清屏在主函数清屏(客户端代码部分有解释)
结果展示
欢迎菜单:
根据报文格式,可以输入城市的汉字或拼音
模式菜单:
历史天气:
实时天气:
q e 退出与返回正常
天气图标变化正常
未来天气:
未来指标:
期望显示: