疯狂吐槽mqtt组件,使用mqtt的需要注意

发布于 2019-11-05 16:30:22
准备使用mqtt开发产品,于是先进行mqtt组件的评估,例子跑起来没问题,但是例子跑完读了下源码,目测出几个严重的问题,该组件基本不能商用。现将问题列举如下:
1.mqtt发送是通过pipe或udp回环方式,udp方式没什么问题,但是要多使用一个回环网卡,多少令人不爽。
2.pipe模式下,就有严重问题了。mqtt消息发布时,如果消息大小大于pipe容量,则消息会被截断,前一部分会正常发送,后一部分找不pipe的mqtt头部,会发送不成功。对于一个消息,要么发布失败,要么发布成功,截断发送显然是不合理的。当然pipe是阻塞模式的,不会丢弃数据,所有发送数据都放入了pipe里,但因为容量限制会被截断。
3.pipe模式下,如果发布消息过快,那么pipe接收数据可能会将2个消息合并为一个发送,这显然就是严重的错误了。这2个消息可能都是不同的主题,他擅自合并。要解决的话,只能每条消息写入pipe的话增加头尾和长度,读出来的时候头尾和长度的整包读出来在发送。
4.不能忍受的是因为使用pipe或者udp要发布一个消息,数据要来回多拷贝4次,大家可以去读源码看。
5.mqtt组件写的只支持Qos1,但是事实上并未对MQTT ACK做处理,他只是等待信号量,保证pipe拿走数据,并且已经通过网络发走,发送成功失败与否都没做处理,这谈不上Qos1。
鉴于以上问题,mqtt组件根本无法实际商用,本人已经重写,近期会重新上传一个能够商业应用的mqtt组件。



查看更多

关注者
0
被浏览
4.1k
62 个回答
bernard
bernard 2019-11-11
只适合学习,这个确实有些以偏概全了。

mqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样的问题,或许是pipe用法的不对,或者例如说只传递过去指针可能更合理。不过pipe确实是类似于stream的模式,能发的就都先发了。

另外RT-Thread中有不合理的地方大家可以多提提,RTT也一直在持续进化中,RTT平台本身会遵循“小而美”
的原则来小心谨慎添加 & 更改代码、功能。而在维护好RTT平台本身的情况下,也会优先处理好核心软件包的事情。不过对软件包这边确实会相对松些,因为也希望大家多多参与,把自己的想法、组件分享出来,所以基本上任何社区开发者的任何软件包都可以提、添加到软件包索引中。
MurphyZhao
MurphyZhao 2019-11-14
看完这里的评论,内心五味陈杂,说说自己的感受。

一个 RTOS 的核心就是系统调度,以及多任务的互斥与通讯,只要这些是稳定的,那么整个项目就有了基本的确定性。

后面,增加了异常处理,日志系统,各种组件,设备框架,驱动框架,第三方软件包,那么为什么会增加这些东西?

我想,出发点就是为了开发更简单。

嵌入式开发真的是太碎片化了,不同的芯片,不同的硬件,不同的系统资源,不同的应用方式(中断、DMA),等等,这些都会因为不同的业务,不同的硬件,导致不一样的软件需求。

为了能够让碎片化的代码有那么一丝丝的重用性和确定性,RTT 抽象了设备框架、驱动框架,并将基本需求抽象为组件(如日志组件 ulog、网络组件 SAL)。这些努力,都是希望更多的代码复用,希望能够一次开发多处应用。

关于 menuconfig。每一块嵌入式代码模块都或多或少存在一些配置,要么是平台适配,要么是功能设置,要么就是资源配置。这些自定义的内容放到哪里,怎么样才能让软件开箱即用,又能让用户自由配置,灵活裁剪?我想 menuconfig 已经是非常有效的解决方式,以至于标准化的 Linux 依旧使用这种方式。为了让配置更简单,开发者用起来没那么难受,从该代码配置走向 menuconfig 的命令行界面,再到后面 IDE 里的可视化图形界面配置,这每一步都是为了简化开发者工作。但,不要妄想着自己啥都不用做了。作为项目代码开发维护者,你应当清除每一个功能组件的依赖关系,因为配置工具并不知道谁依赖谁,工具只能简化操作,并不能替代操作。

最后,RTT 提供的是通用代码,所有的组件、软件包都可能仅仅适应一定的场合,并不能全业务场景适用,即使是高级语言,也无法解决这个问题,不然哪来的性能优化与运维(尽管 RTT 在努力减少这部分工作)。当然,我们每一个人可能都是某个领域的大佬,如果你在应用 RTT 相关代码的时候,当它不能满足你的需求,或者它本身设计存在问题,如果你不能忍受,那就动手优化(就像这个帖子的作者一样)。
aozima
aozima 2019-11-05
拒绝白嫖,拒绝键盘侠!
    本帖最后由 aozima 于 2019-11-5 16:40 编辑


楼主说得对,楼主V5,点个赞!
hichard
hichard 认证专家 2019-11-05
先确认下问题,描述是否有误,是否是真实存在的问题!也欢迎吐槽本人
whj467467222
whj467467222 2019-11-06
膜拜大佬,期待大佬的PR
tanglj86
tanglj86 2019-11-08
大神,膜拜大佬!
sean
sean 2019-11-08
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主说的pipe问题,需要竞争的资源肯定是要互斥操作的,如果官方没实现这个机制,那真是解释不通了……而缓存大小,这个需要根据自己项目来综合考虑;ACK机制自己在业务层实现;
我夏了夏天
我夏了夏天 2019-11-09
sean 发表于 2019-11-8 16:48
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...


这么说就有点以偏概全了
QianHao
QianHao 2019-11-09
最近用mqtt在项目上 也出来很多问题 等待大佬的仓库
yqiu
yqiu 2019-11-09
sean 发表于 2019-11-8 16:48
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...


RTT 的装机量都超过两亿台了 :)
cychen
cychen 2019-11-10
的确有很多不合理的东西,所以我用啊里的在改造 改成我们公司商业用途
haov000
haov000 2019-11-11
期待大佬的PR,使用RTT这么多年,内核一直很稳定,没出过问题,组件是近几年刚发展起来的,有些许问题,需要大家一起完善
sean
sean 2019-11-11
bernard 发表于 2019-11-11 08:45
只适合学习,这个确实有些以偏概全了。

mqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样 ...


快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针对stm32的库更新问题,针对log的输出问题,makemenuconfig配置问题,这些当你实际来使用的时候,你会发现问题不是一点点的多……
吐槽不是想说系统不好,只是希望不要光将虚头的东西,多做点实际的,号称可以使用menuconfig界面轻松配置,log系统多么完善易使用,系统多么容易裁剪……这些东西说出来好听,但是实际拿来用却不是那么回事,实在是大跌眼镜!
sean
sean 2019-11-11
yqiu 发表于 2019-11-9 11:45
RTT 的装机量都超过两亿台了


装机量多更应该把一些基本的东西而且已知的不合理的东西改掉了……现在看来并不是这么回事……
bernard
bernard 2019-11-11
sean 发表于 2019-11-11 12:06
快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...


发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人使用。

如果说有很多修改的,做为一份开源中立的系统,没能合并在一起,是悲哀的(我不希望给大家的感受是:中国的一个人是一条龙,合在一起是一条虫,真的)。我在做这个系统之初,就希望它开源开放,让它应用得更多更广,而不是依赖我的力量。git上的PR永远都是打开的,可以多提补丁、建议,在遵循“小而美”,不会干扰到其他组件代码或其他BSP代码的前提下,都欢迎。

stm32的库更新,这部分是跟着ST的步伐走,也是一种无奈。太多人吐槽 HAL 不好用了……这个能怎么说,是跳坑了,还是趟坑了?不过stm32新BSP用的人还是更多,比原来的好很多。原来的stm32 bsp,驱动不全,问题也挺多,现在都得到长足的改观。

log输出问题,poll?指的是什么?rt_kprintf?或者ulog系统?rt_kprintf实现得简陋些,但是却是在中断中可用的非常好的一种方式。要异步,不poll,请看ulog,而且ulog可以对接不同的后端,同步或异步方式都很灵活。

menuconfig,这个是什么问题?没发现有什么问题,RTT平台(也就是RTT每次发布的代码,不包括软件包)的Kconfig一直在完善中,软件包则有些超出我们的管辖范围了。确实也会面临到一些问题,例如查找一个配置项不容易;英文的文本描述信息等。所以在这点上,我们期望通过图形化界面的配置器来解决<什么时候有?那还请想像下,把Kconfig翻成图形化配置的并且好用的,这个工作量啊>。

如果说都是虚头的东西,我也不会在这里回复你,还投入很多时间到代码,到社区中,直接删帖就好了。希望大家多吐槽,我们以及您一起多来完善,改观。
sean
sean 2019-11-12
bernard 发表于 2019-11-11 15:03
发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人 ...


谢谢超级版主的关注!

吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支持国产的态度来的!吐槽也只是希望社区能把系统做的更好更方便使用,如果本人有能力也会提交一些PR的……

至于ulog的输出,我大概看了下底层的源码:

虽然ulog支持多后台模式输出,但是在调用串口输出的时候还是使用轮询的方式发送,虽然是异步处理,但是串口的这种发送方式还是没有DMA的方式效率高,中断发送的话如果log数据较大,对于实时系统来说也是不小的开销……本人尝试修改log发送为DMA发送,可能能力有限,还没有成功……

至于menuconfig这块,做好了确实工作量巨大,需要社区成员慢慢提交pr集成起来,如果menuconfig上集成了MCU选项,然后自动导入相关HAL或者扳机支持,只需修改类似设备树概念的板级信息,那么menuconfig就又大进一步了;

希望RTT越做越好,本人也会持续关注,最近在尽力移植到项目中,吐槽不少,有些可能过于夸大问题,望见谅!
gnail092
gnail092 2019-11-13
大佬,你的MQTT组件上传了吗
gnail092
gnail092 2019-11-13
大佬,你的组件上传了吗
flashman2002
flashman2002 2019-11-13
光吐槽只应是第一步,下一步要贡献正能量,让rtt能完善更强大才时真正有意义的事情!
whj467467222
whj467467222 2019-11-13
sean 发表于 2019-11-12 12:14
谢谢超级版主的关注!

吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...


RTT好像快要发布自己的IDE了,这个可选MCU的功能到时候会不会支持,可以期待一下。
hurryddddd
hurryddddd 2019-11-14
sean 发表于 2019-11-11 12:06
快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...


我想问,你真的有用心去研究使用rtt吗,碎片化的开发方式搞惯了吧
hichard
hichard 认证专家 2019-11-14
新写的组件已经提交,等合并了大家就可以用了。为了和以前的区分,我命名为mymqtt。函数名和以前的paho-mqtt保持兼容,但是为方便应用,也增加了一些函数,比如判断连接是否断开的。
hichard
hichard 认证专家 2019-11-14
gnail092 发表于 2019-11-13 10:04
大佬,你的MQTT组件上传了吗


已经上传了哈,等待合并
yygg_you
yygg_you 2019-11-14
熊大的头像用的骑扫把的小姐姐?
yygg_you
yygg_you 2019-11-14
海神出马 一个顶仨
whj467467222
whj467467222 2019-11-15
hichard 发表于 2019-11-14 18:53
新写的组件已经提交,等合并了大家就可以用了。为了和以前的区分,我命名为mymqtt。函数名和以前的paho-mqt ...


膜拜大佬
来一颗糖
来一颗糖 2019-11-15
hichard 发表于 2019-11-14 19:42
已经上传了哈,等待合并

厉害,已经 star
QianHao
QianHao 2019-11-15
不管37 21 我已经移植上我的板卡了。 不管怎么样 先感谢楼主一波
hichard
hichard 认证专家 2019-11-15
注意有个keepalive_count, 这个以前的组件没有。以前的组件mqtt keepalive一次心跳收不到就断开连接,这太暴力了,在4G网络,TCP数据延迟一分钟都是可能发生的。因此,加了这个参数,这么多次心跳没应答才断开连接。
armink
armink 2019-11-15
sean 发表于 2019-11-12 12:14
谢谢超级版主的关注!

吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...


“log发送为DMA发送”

这个与 ulog 没有关系,ulog 的后端支持的是不同设备,最常见的是 console 设备

ulog->backend->console->serial device

而这个 console 设备具体是个 中断串口,还是 DMA 串口,是你配置实现的问题

可以多关注一些设备方面的介绍
cychen
cychen 2019-11-15
static int send_packet(mqtt_client *c, void *buf, int length)
开启TLS时ret未定义
static int net_connect(mqtt_client *c)
开启TLS时uri未定义
bernard
bernard 2019-11-15
sean 发表于 2019-11-12 12:14
谢谢超级版主的关注!

吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...


ulog这个说得太业余了,

在多任务系统中,同步、异步都是相对的。ulog这种方式,你只要在backend端实现个异步模式就好。ulog好就好在,前端和后端是分离的,这样灵活的大了很多。在这样灵活度情况下,还保持了小巧的资源占用,这个难能可贵
海阔天kongcyc
海阔天kongcyc 2019-11-15
sean 发表于 2019-11-8 16:48
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...


确实有点偏激了
hichard
hichard 认证专家 2019-11-16
cychen 发表于 2019-11-15 14:59
static int send_packet(mqtt_client *c, void *buf, int length)
开启TLS时ret未定义
static int net_conn ...


已修复,请更新latest即可
zhuxiang
zhuxiang 2019-11-17
hichard 发表于 2019-11-16 10:42
已修复,请更新latest即可


WHAT? 无任何代码添加到项目中
cychen
cychen 2019-11-18
hichard 发表于 2019-11-16 10:42
已修复,请更新latest即可


其实我想问下,怎么加进EVN菜单里面 没显示出mymqtt 我是下你的源码然后加进工程里面的。EVN中不出现
hichard
hichard 认证专家 2019-11-18
cychen 发表于 2019-11-18 09:42
其实我想问下,怎么加进EVN菜单里面 没显示出mymqtt 我是下你的源码然后加进工程里面的。EVN中不出现 ...


env里面执行命令pkgs --upgrade
就会有的
sjj430
sjj430 2019-11-20
windows都天天在更新,有问题是正常的
hichard
hichard 认证专家 2019-11-21
sjj430 发表于 2019-11-20 10:14
windows都天天在更新,有问题是正常的


windows有问题不是我们也应该有问题的借口!我系统出的每一款产品,都可以从安装使用到最后停用,使用5年以上,都没有一点点的维护成本!
yaomo718
yaomo718 2019-11-25
首先顶一下楼主,虽然没实际使用过mqtt,但是在潘多拉开发板上运行了一下,确实有很多问题,有新的mqtt软件包提交真的是太好了。
hejiang177
hejiang177 2019-12-01
新的mqtt支持tls或者ssl加密么?准备学习下
hichard
hichard 认证专家 2019-12-02
hejiang177 发表于 2019-12-1 19:20
新的mqtt支持tls或者ssl加密么?准备学习下


新的老的都支持的。这个从第一版最开始都是支持的
chua052
chua052 2019-12-19
楼主之前有用过那个paho-mqtt的例程mqtt-sample吗,有没有出现连接不上服务器的情况,试了几个服务器 “tcp://iot.eclipse.org:1883”、用通信猫提供的服务器"tcp://mq.tongxinmao:18831"、以及用ActiveMQ建立的本地服务器“tcp://192.168.0.242:1883”,都是报同样的错误”getaddrinfo err:-1“。知道怎么解决吗?望指点,多谢!
hichard
hichard 认证专家 2019-12-19
这个是域名解析不成功,请检查域名服务器配置
tanc
tanc 2019-12-19
楼主使用你改过的包,这个问题怎么解决?使用paho_mqtt_publish发送数据1K以下没问题,到了3K左右就一发送就掉线触发mqtt_offline_callback重连
hichard
hichard 认证专家 2019-12-19
    本帖最后由 hichard 于 2019-12-19 16:46 编辑


tanc 发表于 2019-12-19 14:04
楼主使用你改过的包,这个问题怎么解决?使用paho_mqtt_publish发送数据1K以下没问题,到了3K左右就一发送 ...

使用什么平台?什么网卡测试的?没遇到过这样的现象。我测试过4K左右的包了,没有掉线。这个问题如果是AT网卡,8层要检查下网卡的缓冲区配置。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友