Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【LwIP学习营】第三周小作业
发布于 2018-06-04 10:37:38 浏览:2072
订阅该版
* 本帖最后由 hcb900330 于 2018-6-4 11:30 编辑 * 1.bsp使用的3.03版本,出现了不知道的错误,要使用最新的bsp包,重新更新bsp要使用git,抽时间要好好学习下。另外缺少select.c需要手动添加。 2。刚开始弄不明白,为啥搞两种协议,mqtt跟http,后来知道硬件传送给平台的数据都是通过http,而下发命令都是通过mqtt。 ![1.png](/uploads/201806/04/111228m06rjrgdrslrvszs.png) ![2.png](/uploads/201806/04/111453on6nycz8rnzy6by1.png) 3.之前用过rtt2.0的mqtt,mqtt经常断线,mqttclient用好多地方要修改,新版本的mqtt用了两三天都没有断线,还不错,小伙伴们有福了。 当时2.0的mqtt主要问题是一个socket只能在一个线程里面,还有ping超时以后必须要重新连接,另外还有卡在某个地方,这些坑当时弄了好久才搞定,新版本的rtt都做了处理。 还有ping,mqttpub,mqttsub 都在同一个线程里面,当时pub自己加了一个环形数组,新版本的rtt也做了很好的封装。 res = select(((c->pub_pipe[0] > c->sock) ? c->pub_pipe[0] : c->sock) + 1,&readset, RT_NULL, RT_NULL, &timeout); while (1) { int res; rt_tick_t tick_now; fd_set readset; struct timeval timeout; tick_now = rt_tick_get(); if (((tick_now - c->tick_ping) / RT_TICK_PER_SECOND) > (c->keepAliveInterval - 5)) { timeout.tv_sec = 1; //LOG_D("tick close to ping."); } else { timeout.tv_sec = c->keepAliveInterval - 10 - (tick_now - c->tick_ping) / RT_TICK_PER_SECOND; //LOG_D("timeount for ping: %d", timeout.tv_sec); } timeout.tv_usec = 0; FD_ZERO(&readset); FD_SET(c->sock, &readset); FD_SET(c->pub_pipe[0], &readset); /* int select(maxfdp1, readset, writeset, exceptset, timeout); */ res = select(((c->pub_pipe[0] > c->sock) ? c->pub_pipe[0] : c->sock) + 1, &readset, RT_NULL, RT_NULL, &timeout); if (res == 0) { len = MQTTSerialize_pingreq(c->buf, c->buf_size); rc = sendPacket(c, len); if (rc != 0) { LOG_E("[%d] send ping rc: %d ", rt_tick_get(), rc); goto _mqtt_disconnect; } /* wait Ping Response. */ timeout.tv_sec = 5; timeout.tv_usec = 0; FD_ZERO(&readset); FD_SET(c->sock, &readset); res = select(c->sock + 1, &readset, RT_NULL, RT_NULL, &timeout); if (res <= 0) { LOG_E("[%d] wait Ping Response res: %d", rt_tick_get(), res); goto _mqtt_disconnect; } } /* res == 0: timeount for ping. */ if (res < 0) { LOG_E("select res: %d", res); goto _mqtt_disconnect; } if (FD_ISSET(c->sock, &readset)) { //LOG_D("sock FD_ISSET"); rc_t = MQTT_cycle(c); //LOG_D("sock FD_ISSET rc_t : %d", rc_t); if (rc_t < 0) goto _mqtt_disconnect; continue; } if (FD_ISSET(c->pub_pipe[0], &readset)) { MQTTMessage *message; MQTTString topic = MQTTString_initializer; //LOG_D("pub_sock FD_ISSET"); len = read(c->pub_pipe[0], c->readbuf, c->readbuf_size); if (len < sizeof(MQTTMessage)) { c->readbuf[len] = '\0'; LOG_D("pub_sock recv %d byte: %s", len, c->readbuf); if (strcmp((const char *)c->readbuf, "DISCONNECT") == 0) { LOG_D("DISCONNECT"); goto _mqtt_disconnect_exit; } continue; } message = (MQTTMessage *)c->readbuf; message->payload = c->readbuf + sizeof(MQTTMessage); topic.cstring = (char *)c->readbuf + sizeof(MQTTMessage) + message->payloadlen; //LOG_D("pub_sock topic:%s, payloadlen:%d", topic.cstring, message->payloadlen); len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id, topic, (unsigned char *)message->payload, message->payloadlen); if (len <= 0) { LOG_D("MQTTSerialize_publish len: %d", len); goto _mqtt_disconnect; } if ((rc = sendPacket(c, len)) != PAHO_SUCCESS) // send the subscribe packet { LOG_D("MQTTSerialize_publish sendPacket rc: %d", rc); goto _mqtt_disconnect; } } /* pbulish sock handler. */ } /* while (1) */
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
2.1k
关于作者
hcb900330
这家伙很懒,什么也没写!
提问
24
回答
37
被采纳
1
关注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
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部