Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【LwIP学习营】第三周小作业
发布于 2018-06-04 10:37:38 浏览:1909
订阅该版
* 本帖最后由 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
被浏览
1.9k
关于作者
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
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
NXP MCXN947测评(二)ETH设备使用
2
【RA8D1-Vision Board】适配 LVGL V8
3
VISION BOARD 第二弹 基础工程配置和点亮一个LED灯
4
musb移植问题记录【设备注册3次挂起】
5
关于使用CherryUSB时候使用外挂的usb phy 芯片配置的一点注意事项
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
xiaorui
7
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
18
个答案
1
次被采纳
踩姑娘的小蘑菇
14
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
3
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部