标签:产生 设计 单片机 通讯 发布 怎么 ESS 存在 进程
先组装publish协议的头,里面写好payload的长度,通过tcp发出去,然后一点一点发payload。如果拿不到payload总长度,这个事情就难办。因为你发了一个publish协议报,服务端读到head里面的payload的长度之后,就会一直读,读到需要的长度,才算这个publish结束。所以,你的需求是首先确认你发布的内容的长度,然后组publish数据包头,填写payload长度,tcp:send(head),之后一段一段发送payload,比如一次1k,还是按照正常的tcp发送数据,一直发送完毕,就算这个publish结束了。接下来的send,都属于tcp层的,这些不用你干预的。如果在tcp层,send失败,那一定是socket有问题了,连接断了,你就得重新连接mqtt服务器了,如果没有发完,那么服务端的会话也会结束,就是说服务端也没有接收到数据。重新连接,你就得重发,发送消息中途,只要断掉,就得重连,是否要重发数据,取决于你是否保存了以前的数据。还有如果消息重要,可以使用qos=1或者2,可以确保服务端收到消息,qos=1需要一个来回,qos=2需要四个来回,qos=0非常简单,只要send出去就不管了。
http://www.mqtt.org里面很多
mqtt协议里面是按照设备一直在线设计的,数据都是保存在内存里的
MQTT是比较吃内存的,emqtt的实测数据是:38W,内存占14G,CPU 15%
这样的,比如你一个板子,作为客户端,发起mqtt的连接请求connect到mqtt服务器,比如说就是emqtt服务吧,emqtt服务端收到这个板子的连接请求之后,在tcp层上会和板子建立一个tcp的连接,在emqtt内部,会产生一个进程,和这个板子做数据通讯,同时还会产生一个进程,叫session,这个sessoin是专门管理这个板子订阅的主题,其它板子如果发布了这个板子感兴趣的主题的时候,也会发到这个板子对应的这个session里面,如果这个session收到订阅的主题之后,发现对用的client还活着,就通过这个client把数据经过tcp发到这个板子上,如果发现client已经没有了,就是说板子和服务端断掉了,那么session就会把收到的订阅的主题,先保存在session里面,下次板子连接上了,而且cleansession=false,那么这个session就不会清除,在这次连接时,就会把以前收到的订阅消息,发给板子,大概就是这个意思。
连接的时候,需要设置一个clientid,这个id可以不设置,如果不设置,在emqtt服务端会自动产生一个唯一的id,如果你要用到session,必须有一个唯一个id,你可以用imei。如果你一定要收到离线消息的话,就必须使用确定的id了。
你可以改一下session的时间,现在是48小时,你可以改为一周,如果要永久,恐怕emqtt不太适合。
etc/acl.config
分布式简单说就是把你的几台服务器连在一起,里面任意一台或者多台,只要不是全坏了,emqtt都可以正常运行。emqtt的数据是在几个节点共享的,某个节点出问题,数据是不会丢的,但是节点上的session数据会丢失。
标签:产生 设计 单片机 通讯 发布 怎么 ESS 存在 进程
原文地址:https://www.cnblogs.com/jiangzhaowei/p/9152586.html