zoukankan      html  css  js  c++  java
  • MQTT详解

    前言

    mqtt现在基本是物联网标配的数据传输协议了,我们今天就详细说一下mqtt里的那些入门概念

    结构

    mqtt分两部分:

    1. 一个是服务端(broker)也可以叫server端,服务端一般使用现成的程序,国内现在比较流行的就是 EMQX ,也有一个用C语言写的 mosquitto ,生产环境下,服务端一般安装到云服务器里。
    2. 另一个是客户端(client),基本上每个具体的设备都属于客户端,比如:摄像头、冰箱、洗衣机等这些设备,一般程序中还有一个后台管理系统,后台管理系统主要用来存储、统计设备的数据,它也属于客户端。

    基本结构

    -w430

    基础概念

    这里整理一下理解mqtt容易出错的一些概念

    topic (主题设计)

    mqtt是使用发布、订阅 模式进行消息传递的,这个和 websocket 有一点类似,基本就是:一个客户端给 服务端(broker)发送一个消息,broker 按一定规则广播给其他客户端。这个规则就是利用 topic 来实现的

    注意点:

    1. 每个客户端都可以在服务端创建一个 topic,topic被创建后, 这个 topic 就可以被所有设备订阅,包括自己也行,也可以线订阅topic,再创建,顺序上没有要求
    2. 发布 topic 和订阅 topic 是两个接口,所以自己可以订阅自己发布的 topic
    3. topic 需要一定的设计,不然设备多了的时候设备不好管理
    4. 一个服务端可以发布成千上万个topic,不用担心topic过多问题
    5. topic在设计时可以使用这些符号
      1. 主题层级分隔符—“/”
      2. 多层通配符—“#”
      3. 单层通配符—“+”
      4. 通配符 —“$”

    客户端

    客户端在使用时有一些必要的注意点

    1. 客户端在链接服务端时,会有一个用户名、密码,这个用户名和密码时在服务端配置的,如果有多个平台链接服务端,我们就可以创建多个账号,每个平台使用自己的账号

    2. 客户端在链接服务端时必须有一个客户端ID,这个ID在整个服务端都必须时唯一的,服务端就时靠这个id来区分每一个链接的。多数情况下这个id是由客户端带上去的

    3. 如果想要设备能接收自己离线时别人发给自己的消息,有四点:

      1. 设备的 客户端ID 唯一且不变,就是说每次连接服务端时都使用同一个ID
      2. 链接服务端时设定 【清除会话】为false,就是说不清除 session 会话
      3. 别人发的消息必须时 qos2 权限
      4. 订阅 topic 也必须时 qos2 权限
    4. 如果想给设备发送一些配置命令,可以使用【保留消息】,保留消息的意思是:这个topic里会一直保留一条最新消息,每次有设备订阅了这个topic,都会把这条给当前客户端推送一遍,当前客户端重新订阅也会重复收到这个消息

      1. 【保留消息】:qos0、qos1、qos2都会保留
      2. 当前客户端如果订阅了两次同一个topic,则第一次订阅的topic会在第二个订阅的时候再收到一次保留的消息
    5. 【保留消息】可以被任意一个设备清除掉,只需要给这个topic发送一个空数据即可

    6. qos的等级在发布和订阅时都需要指定,pub和sub可以指定不一样的qos, 服务器只会按pub和sub两者qos等级最小的那个qos规则来发送消息。

      1. 发送时指定的qos是对服务端的,服务端肯定会按指定qos来接收消息,但是转发消息时就有可能降级发送
      2. 接收时指定的qos表示订阅者可以接收的最高消息等级,也就是可能收到更低等级的消息
    7. 监测设备异常时可以使用【遗嘱消息】功能

    本地测试工具推荐

    调试mqtt时需要用到一些客户端工具,下面是我常用的工具

    mqttbox

    有浏览器插件和客户端,操作简单,查看直观,

    缺点:英文客户端,界面不是很美观

    mqttx

    是emqx推出的客户端,界面比较美观。有中英文模式,操作还算简单

    缺点:用electorn 开发的,占用空间较大,多开情况下,操作非常不顺畅。

    建议

    建议两个软件搭配使用,充当两个客户端,其中一个发消息,另一个收消息

    博客中所涉及到的图片都有版权,请谨慎使用
  • 相关阅读:
    精选的一些《编程之美》相关资料
    使用SftpDrive+SourceInsight阅读开源代码
    malloc()参数为0的情况
    《编程之美》4.5磁带文件存放优化:最优解是怎样炼成的
    从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南
    《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明
    解答《编程之美》1.18问题1:给所有未标识方块标注有地雷概率
    C语言中 Float 数据结构的存储计算
    C#之内存分配
    unity----------------3D模型讲解
  • 原文地址:https://www.cnblogs.com/shuiche/p/mqtt-xiang-jie.html
Copyright © 2011-2022 走看看