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数据则会丢失。