mqtt老是连不上_使用MQTT遇到问题?来这里找答案!

时间:2024-11-08 16:35:02

Q:MQTT的开源资源多吗?

A:有很多,可以到MQTT的官网查阅()。

Q:MQTT为什么一般不提供持久化的功能

A:mqtt协议里面是按照设备一直在线设计的,数据都是保存在内存里的。

Q:MQTT是不是很耗内存?

A:MQTT是比较吃内存的,emqtt的实测数据是:38W,内存占14G,CPU 15%。

Q:单片机缓存和处理能力有限,消息不能一次性发出去,此时,应该如何通过MQTT发布消息?

A:先组装publish协议的头,里面写好payload的长度,通过tcp发出去,然后一点一点发payload。

1、先确认发布内容的长度,然后组publish数据包头,填写payload长度,tcp:send(head),之后一段一段发送payload。

2、举个例子,如果一次发送1K,按照正常的tcp发送数据,一直发送完毕,就算这个publish结束了。

如果在tcp层send失败,那证明连接断开了,socket出现问题。此时需要重新连接mqtt服务器。

发送过程中,只要进行了重新连接,你需要重新发送,发送消息中途,只要断掉,就得重新连接。是否需要重发数据,取决于以前的数据是否被保存。

3、如果消息很重要,可以使用qos=1或者2。这样可以确保服务端收到消息。qos=1是指需要一个来回,qos=2是指需要四个来回,qos=0则非常简单,意思是只要send出去就不管了。

Q:session与client之间的关系是怎样的?

A:比如说一个硬件主板作为客户端,发起一个connect到mqtt服务器的MQTT连接请求。

emqtt服务端收到这个主板的连接请求之后,会在tcp层上和主板建立一个tcp连接。

此时,在emqtt内部,会产生一个进程和这个主板做数据通讯。与此同时,还会产生一个session进程,这个sessoin专门管理这个板子订阅的主题。

如果其他主板发布了这个主板感兴趣的主题,这个主板对应的session也会收到。如果这个session收到订阅的主题之后,发现对用的client还活着,就通过这个client把数据经过tcp发到这个板子上。

如果对用的client已经没有了,就说明板子和服务器断掉了,那么session就会把收到的订阅主题先保存在session里面。

下次主板再进行连接的时候,如果cleansession=false,那么就证明这个session没有清除。此时,系统就可以把以前收到的订阅消息发给主板了。

Q:emqtt如何证明连接上的client是否为同一个?

Emqtt与client连接的时候,需要设置一个clientid。当然,这个id也可以不设置。

A:如果不设置,emqtt服务端会自动产生一个唯一的id。因为如果需要用到session,就必须有一个唯一个id。如果你一定要收到离线消息的话,则必须使用确定的id了。

Q:emqtt的session时间可以修改吗?

A:可以修改。现在的时间是48小时。使用者可以根据实际使用情况调整时间,但是不能改成永久。

Q:emqtt的分布式是怎么回事?

A:简单说就是把几台服务器连接在一起。只要服务器不是全坏了,emqtt就可以正常运行。

Emqtt的数据是在几个节点上共享的。当某一个节点出现问题时,数据是不会丢失的。但是节点上的session数据则会丢失。