zoukankan      html  css  js  c++  java
  • MQTT Broker mosquitto

    MQTT

    全称

    MQ Telemetry Transport 消息队列遥测传输协议
    IBM 1994开发
    MQTT v3.1.1 第4版 OASIS标准
    1 to 0/1/N

    简介

    MQTT是一个TCP服务端,称为broker。
    通过这个broker服务,我们可以作为发布者,发送一条主题消息给broker,然后其他订阅者通过消息订阅机制获得broker的主题消息推送。我们也可以作为订阅者,订阅其他发布者的主题消息。

    对比MQ

    消息队列存储消息,直到它们被消耗
    消息队列中只有一个消费者处理消息,MQTT中订阅主题的每个订阅者都会收到消息
    消息队列要提前并明确创建,MQTT中可以随时实时创建

    议题

    • 自动重连 Automatic Reconnect
    • 离线缓存 Offline Buffering
    • 消息持久化 Message Persistence
    • 高可用 High Availability
    • 安全 SSL/TLS
    • websocket支持

    连接

    建立

    broker开启一个host的TCP 1883端口
    客户端连接Broker
    如果是重连,需要带上上次ClientID
    如果不是重连,可以指定CleanSession是否清空之前会话
    可以指定两端之间心跳维持时间
    服务端根据参数,重用或开启会话Session,绑定ClientID
    一个会话,可以服务多个TCP连接,取决于是否CleanSession

    会话

    PersistentSession与CleanSession
    session相关信息将会同时保存在broker和client中,session里包含以下内容:
    客户端的订阅信息
    从broker接收来的还没有ack的消息
    发送给client的还没有ack的消息

    断开

    客户端主动断开:客户端发送 DISCONNECT 关闭链接,遗嘱失效并删除
    客户端异常断开:遗嘱消息发布

    消息

    消息类型

    心跳消息
    连接、断开连接消息 10 e0
    订阅、取消订阅消息 80
    发布消息 30

    遗嘱消息

    为了能知道哪个客户端异常断开,broker定时查询客户端状态。
    当检查到客户端异常断开时,就发布客户端连接时指定的遗嘱消息到指定主题。
    正常断开,是不会有遗嘱消息发布的。

    保留消息

    发布者发布主题消息时,可以指定消息是否缓存到broker,作为对应主题的最后一次消息记录
    订阅者连接后,可一次性获取想要的主题的全部保留消息

    主题

    分层过滤格式

    树状结构,用'/'分隔,如:home/light/brightness
    通配符:

    • 单层通配符 如,a/b/+” 匹配 “a/b/c1” 和 “a/b/c2”,但是不匹配 “a/b/c/d”

    多层通配符 如 “a/b/c/#" 可以匹配 “a/b/c”、“a/b/c/d” 和 “a/b/c/d/e”

    特殊的主题$SYS

    查看服务器的状态信息

    消息分发可靠性QoS

    • 至多一次 允许丢失,无需回复订阅者回复,发布者自动删除。适用传感器数据
    • 至少一次 确保到达,需要订阅者回复,发布者和broker都缓存消息,待订阅者回复后,再依次删除消息缓存。可能重复发送
    • 只有一次 确保到达,不重复不丢失,用的很少
      图示

    消息发布与订阅

    基于主题的消息过滤,可以使用通配符来订阅多个主题的消息
    发布消息时,不可以使用通配符,必须指定完整的topic名
    如果想发送给多个topic,需要发布多次
    发布者在每次发布消息时都需要设置QoS

    消息存储

    可以使用基于内存的,但是单点故障情况下,消息会丢失。
    可以结合外部redis,进行消息外部存储。

    redis消息持久化配置

    storage_class io.moquette.persistence.redis.RedisStorageService 
    
    # redis storage
    redis.host localhost
    redis.port 6379
    redis.password
    redis.database 0
    redis.prefix monitor:
    
  • 相关阅读:
    DEBUG_PRINT
    FFMpeg的解码流程
    解决Cannot open the disk 'E:\my Ubuntu\Ubuntu000001.vmdk' or one of the snapshot disks it depends on.(虚拟机突然断电之后)
    关于mov.c的demuxer
    dts
    fprintf
    H264学习(1)
    如何安装不能识别的驱动错误代码为10
    mplayer先播视频后播音频的解决方法
    团队作业(二) IS191x
  • 原文地址:https://www.cnblogs.com/cenon/p/10723253.html
Copyright © 2011-2022 走看看