Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【7天rtos网络编程】day6~7-风雨潇潇
发布于 2018-10-24 23:35:28 浏览:1670
订阅该版
* 本帖最后由 风雨潇潇 于 2018-10-30 23:39 编辑 * **题目:**正常获取并运行示例程序,运用所学的知识,获取实时的日期、时间、天气,并把获取的数据通过在 OneNet 云平台创建应用展示出来。 **思路:** 在env里面配置OneNet的选项,并开启MQTT服务和JSON。    **实施步骤:** 在配置完成后更新包并编译工程。运行qemu后,运用示例代码的命令**weather **可以得到相应城市的时间和天气,  连接OneNet物联网平台,先要注册然后添加设备   在env里面配置已经在云端出创立的设备信息  运行qemu后先初始化mqtt,在利用cycle的命令循环发送信息给云端。   在云端的设备管理里面查找对应的设备可以看到传输的数据曲线   ```/* * File : httpclient.c * * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-07-20 flybreak first version * 2018-09-05 flybreak Upgrade API to webclient latest version */ #include
/* 使用 HTTP 协议与服务器通信需要包含此头文件 */ #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#include
#include
#include
#define GET_HEADER_BUFSZ 1024 //头部大小 #define GET_RESP_BUFSZ 1024 //响应缓冲区大小 #define GET_URL_LEN_MAX 256 //网址最大长度 #define GET_URI "http://mobile.weather.com.cn/data/sk/%s.html" //获取天气的 API #define AREA_ID "101220301" //上海浦东地区 ID struct msg{ char cityName[20]; char wd[20]; int ws; char sd[20]; int temp; char data[20]; char time[20]; }; static struct msg weather_msg; /* 天气数据解析 */ void weather_data_parse(rt_uint8_t *data, struct msg *p_msg) { cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL; root = cJSON_Parse((const char *)data); if (!root) { rt_kprintf("No memory for cJSON root!
"); return; } object = cJSON_GetObjectItem(root, "sk_info"); item = cJSON_GetObjectItem(object, "cityName"); strncpy(p_msg->cityName, item->valuestring, strlen(item->valuestring)); rt_kprintf("
cityName:%s ", p_msg->cityName); item = cJSON_GetObjectItem(object, "temp"); p_msg->temp = atoi(item->valuestring); rt_kprintf("
temp :%s ", p_msg->temp); item = cJSON_GetObjectItem(object, "wd"); strncpy(p_msg->wd, item->valuestring, strlen(item->valuestring)); rt_kprintf("
wd :%s ", p_msg->wd); item = cJSON_GetObjectItem(object, "ws"); p_msg->ws = atoi(item->valuestring); rt_kprintf("
ws :%s ", p_msg->ws); item = cJSON_GetObjectItem(object, "sd"); strncpy(p_msg->sd, item->valuestring, strlen(item->valuestring)); rt_kprintf("
sd :%s ", p_msg->sd); item = cJSON_GetObjectItem(object, "date"); strncpy(p_msg->data, item->valuestring, strlen(item->valuestring)); rt_kprintf("
date :%s", p_msg->data); item = cJSON_GetObjectItem(object, "time"); strncpy(p_msg->time, item->valuestring, strlen(item->valuestring)); rt_kprintf("
time :%s
", p_msg->time); if (root != RT_NULL) cJSON_Delete(root); } void weather_f() { rt_uint8_t *buffer = RT_NULL; int resp_status; struct webclient_session *session = RT_NULL; char *weather_url = RT_NULL; int content_length = -1, bytes_read = 0; int content_pos = 0; /* 为 weather_url 分配空间 */ weather_url = rt_calloc(1, GET_URL_LEN_MAX); if (weather_url == RT_NULL) { rt_kprintf("No memory for weather_url!
"); goto __exit; } /* 拼接 GET 网址 */ rt_snprintf(weather_url, GET_URL_LEN_MAX, GET_URI, AREA_ID); /* 创建会话并且设置响应的大小 */ session = webclient_session_create(GET_HEADER_BUFSZ); if (session == RT_NULL) { rt_kprintf("No memory for get header!
"); goto __exit; } /* 发送 GET 请求使用默认的头部 */ if ((resp_status = webclient_get(session, weather_url)) != 200) { rt_kprintf("webclient GET request failed, response(%d) error.
", resp_status); goto __exit; } /* 分配用于存放接收数据的缓冲 */ buffer = rt_calloc(1, GET_RESP_BUFSZ); if(buffer == RT_NULL) { rt_kprintf("No memory for data receive buffer!
"); goto __exit; } content_length = webclient_content_length_get(session); if (content_length < 0) { /* 返回的数据是分块传输的. */ do { bytes_read = webclient_read(session, buffer, GET_RESP_BUFSZ); if (bytes_read <= 0) { break; } } while (1); } else { do { bytes_read = webclient_read(session, buffer, content_length - content_pos > GET_RESP_BUFSZ ? GET_RESP_BUFSZ : content_length - content_pos); if (bytes_read <= 0) { break; } content_pos += bytes_read; } while (content_pos < content_length); } /* 天气数据解析 */ weather_data_parse(buffer, &weather_msg); __exit: /* 释放网址空间 */ if (weather_url != RT_NULL) rt_free(weather_url); /* 关闭会话 */ if (session != RT_NULL) webclient_close(session); /* 释放缓冲区空间 */ if (buffer != RT_NULL) rt_free(buffer); } MSH_CMD_EXPORT(weather_f, Get weather_f by webclient); /*------------------------------------*/ /* upload random value to temperature*/ static void onenet_upload_entry_f(void *parameter) { weather_f(); while (1) { //cityName if (onenet_mqtt_upload_string("cityName", weather_msg.cityName) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"cityName\":%s}", weather_msg.cityName); } //temp if (onenet_mqtt_upload_digit("temp", weather_msg.temp) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"temp\":%s}", weather_msg.temp); } //wd if (onenet_mqtt_upload_string("sd", weather_msg.wd) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"sd \":%s}", weather_msg.wd); } //ws if (onenet_mqtt_upload_digit("ws", weather_msg.ws) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"ws \":%s}", weather_msg.ws); } //sd if (onenet_mqtt_upload_string("sd", weather_msg.sd) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"sd \":%s}", weather_msg.sd); } //data if (onenet_mqtt_upload_string("data", weather_msg.data) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"data\":%s}", weather_msg.data); } //time if (onenet_mqtt_upload_string("time", weather_msg.time) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_d("buffer : {\"time\":%s}", weather_msg.time); } rt_thread_delay(rt_tick_from_millisecond(5 * 1000)); } } int onenet_upload_cycle_f(void) { rt_thread_t tid; tid = rt_thread_create("onenet_send", onenet_upload_entry_f, RT_NULL, 2 * 1024, RT_THREAD_PRIORITY_MAX / 3 - 1, 5); if (tid) { rt_thread_startup(tid); } return 0; } MSH_CMD_EXPORT(onenet_upload_cycle_f, send data to OneNET cloud cycle); ```  根据几位大神的帖子,勉强写了代码,可是好像一次只能显示一个参数,为什么啊??? 哪位大神能指点下代码吗,还有天气的URL....:funk::funk::funk:
查看更多
4
个回答
默认排序
按发布时间排序
flyboy
2018-10-25
Do my self();
那么问题来了......这好像都是例程,你写的代码在哪里:L
风雨潇潇
2018-10-25
这家伙很懒,什么也没写!
>那么问题来了......这好像都是例程,你写的代码在哪里 --- 需要写代码吗?:funk:
flyboy
2018-10-25
Do my self();
你可以看看大佬们写的作业啊,最少也要把解析的天气信息传上来吧
风雨潇潇
2018-10-25
这家伙很懒,什么也没写!
>你可以看看大佬们写的作业啊,最少也要把解析的天气信息传上来吧 --- 没有接触过,好难啊
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
风雨潇潇
这家伙很懒,什么也没写!
提问
3
回答
19
被采纳
0
关注TA
发私信
相关问题
1
【LWIP学习营】第一关开发环境搭建
2
LWIP学习营第一周入门移植问题汇总贴
3
【LWIP学习营】f407+lan8720A小结
4
【LwIP学习营】【第一周】仅零散记录,无主题
5
【LWIP学习营】正点原子探索者F407+LAN8720第一周小结
6
【LwIP学习营】【第一周】网络通信基础及实现TCP 聊天客户端
7
【LwIP学习营】【第一周】LWIP移植
8
【LwIP学习营】【第一周】LWIP移植
9
【LwIP学习营】【第一周】开发板适配
10
【LwIP学习营】【第一周】环境搭建和配置验证
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
MCAX-156 ADC测评
2
【FRDM-MCXA156测评】- CherryUSB与hid鼠标设备模仿
3
【FRDM-MCXA156测评】- 硬件SPI模块
4
【NXP-MCXA156】恩智浦A156上的 IIC(硬件) 实践
5
【FRA156测评DM-MCX】- PWM模块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
178
次被采纳
crystal266
552
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部