mqtt理解【持续更新】

1.什么是mqtt

mqtt是一种基于发布订阅的轻量级通信协议,协议简历在tcp/ip上,作为一种低开销、低带宽占用的即时通讯协议广泛应用在物联网、小型设备、移动应用。

2.什么是mqtt的qos机制

qos是Quality of Service levels,消息可靠性投递的机制。
qos=0会发生丢失和消息重复。
qos=1会至少发送一次消息给订阅者,会出现消息重复。
qos=2保证消息仅发送到目的地一次,带有唯一id的消息会存储2次,一次来自消费者,一次来自生产者。这种模式下网络消耗最高,因为发送方和接收方之间需要2个流。

3.mqtt数据包结构

固定头、可变头、消息体

4.mqtt客户端下载地址

客户端下载地址:https://mosquitto.org/
可视化工具:mqttx

5.springboot怎么整合mqtt

1.引入spring-integration-stream,spring-integration-mqtt依赖
2.配置MqttConnectOptions,设置用户名、密码、服务地址、存活间隔、连接超时、最大飞行时间。
解释:
存活间隔keepaliveinterval:仅仅依赖 TCP 层的连接状态监测是不够的,于是 MQTT 协议设计了一套 Keep Alive 机制。回忆一下,在建立连接的时候,我们可以传递一个 Keep Alive 参数,它的单位为秒,MQTT 协议中约定:在 1.5*Keep Alive 的时间间隔内,如果 Broker 没有收到来自 Client 的任何数据包,那么 Broker 认为它和 Client 之间的连接已经断开;同样地, 如果 Client 没有收到来自 Broker 的任何数据包,那么 Client 认为它和 Broker 之间的连接已经断开。
最大飞行时间maxinflight:发布消息的时候qos=1,需要等待broker会ack,由于客户端发送量太大,未能及时抽到broker回复的ack(这一点可能因为网络有延时),但是客户端维持的一个变量—maxinflight,默认值为10,如果以qos=1发送的消息,maxinflight就会+1,当抽到broker回复的ack时,maxinflight-1,所以当客户端发送量太大时,又未能及时收到broker回复的ack,导致达到了maxinflght的值,出现上述问题。
3.配置MqttPahoClientFactory工厂,返回DefaultMqttPahoClientFactory实例,通过DefaultMqttPahoClientFactory的setConnectionOptions方法传递MqttConnectOptions
4.配置MessageChannel输入信道,返回DirectChannel实例。
5.配置MessageHandler的实例,通过@ServiceActivator(inputChannel = 信道名称)注解设置信道名称,返回MqttPahoMessageHandler。MqttPahoMessageHandler构造器中,设置clientId和工厂。设置是否异步、默认主题、默认是否保留消息、默认的生产者qos。
6.配置输出信道MessageChannel,返回DirectChannel实例。
配置
7.配置消息消费者MessageProducer,返回MqttPahoMessageDrivenChannelAdapter,配置MqttPahoMessageDrivenChannelAdapter的构造器clientId和多个主题。设置完成超时时间、qos、消息转换器、信道。
8.用@ServiceActivator注解监听信道,通过MessageHandler的实现类重写handleMessage方法,通过handleMessage方法参数Message的getHeaders方法的MessageHeaders的get方法传递主题topic,从消息头中获得指定主题的消息。通过Message的getPayload获得消息体。
9.发送消息时,@MessagingGateway使用在发送消息的接口上,@MessagingGateway注解的defaultRequestChannel属性设置信道,发送消息的方法参数前使用@Header(MqttHeaders.TOPIC)设置参数是主题,@Header(MqttHeaders.QOS)设置qos类型,string类型的payload是消息体。

6.消息可靠性投递

配置MessageHandler生产者的,设置参数消息是否持久化到mqtt。setDefaultRetained(defaultRetained)设置持久化。
setDefaultQos设置消息质量类型。设置成2,值不会重复发送,保证一次消息正常发送。

你可能感兴趣的:(java,spring,boot,后端)