精华内容
下载资源
问答
  • MQTT协议MQTT协议简介及协议原理

    万次阅读 多人点赞 2016-02-04 15:34:36
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以...

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

    1. MQTT协议特点
    2. MQTT协议原理

     

    1. MQTT协议特点

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

    MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于百TCP/IP网络,如:ZigBee。

    MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:

    1. 使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
    2. 对负载内容屏蔽的消息传输机制。
    3. 对传输消息有三种服务质量(QoS):
      • 最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
      • 最少一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
      • 只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
    4. 数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量
    5. 通知机制,异常中断时通知传输双方

     

    2. MQTT协议原理

    2.1 MQTT协议实现方式

    • 实现MQTT协议需要:客户端服务器端
    • MQTT协议中有三种身份:发布者(Publish)代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
    • MQTT传输的消息分为:主题(Topic)负载(payload)两部分
      • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload
      • payload,可以理解为消息的内容,是指订阅者具体要使用的内容

     

    2.2 网络传输与应用消息

    MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。

    当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。

     

    2.3 MQTT客户端

    一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

    • 发布其他客户端可能会订阅的信息
    • 订阅其它客户端发布的消息
    • 退订或删除应用程序的消息
    • 断开与服务器连接

     

    2.4 MQTT服务器

    MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者订阅者之间,它可以:

    • 接受来自客户的网络连接
    • 接受客户发布的应用信息
    • 处理来自客户端的订阅和退订请求
    • 向订阅的客户转发应用程序消息

     

    2.5 MQTT协议中的订阅、主题、会话

    订阅(Subscription)

    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

    会话(Session)

    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

    主题名(Topic Name)

    连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

    主题筛选器(Topic Filter)

    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

    负载(Payload)

    消息订阅者所具体接收的内容

     

    2.6 MQTT协议中的方法

    MQTT协议中定义了一些方法(也被称为动作), 来于表示对确定资源所进行操作。 这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。

    Connect,等待与服务器建立连接

    Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话

    Subscribe,等待完成订阅

    UnSubscribe,等待服务器取消客户端的一个或多个topics订阅

    Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程

    http://itbilu.com/other/relate/4kHBsx_Pg.html

    展开全文
  • MQTT协议_MQTT协议简介

    2017-11-14 12:57:15
    MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。 它的设计思想是轻巧、开放、简单、规范,因此...

    MQTT简介

    2.1.1 概述

    MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。

    它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。

    MQTT提供的服务可使应用建立和维持会话,并能使会话获得同步,选择需要的运输服务质量参数(QOS),传送有限的透明用户数据。

    2.1.2 MQTT的设计原则

    l  精简,不添加可有可无的功能。

    l  发布/订阅(Pub/Sub)模式,提供了一对多的消息分发和应用之间的解耦。

    l  允许用户动态创建主题,零运维成本。

    l  很小的传输消耗和协议数据交换,最大限度减少网络流量。

    l  把低带宽、高延迟、不稳定的网络等因素考虑在内。

    l  支持连续的会话控制,异常连接断开发生时,能通知到相关各方。

    l  理解客户端计算能力可能很低。

    l  提供三种服务质量管理。

    l  透明的内容负载。假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

    2.1.3 发布/订阅模式

    与请求/回答这种同步模式不同,发布/定义模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。

    该模式带来了这些好处:

    l  发布者与订阅者不比了解彼此,只要认识同一个消息代理即可。

    l  发布者和订阅者不需要交互,发布者无需等待订阅者确认而导致锁定。

    l  发布者和订阅者不需要同时在线,可以自由选择时间来消费消息

    2.1.4 MQTT中的角色

    MQTT协议中从网络架构的角度来看包括服务端和客户端,从消息传递的角度来说包括发布者,代理器(服务器)和订阅者。或者可以这样说,客户端包括了发布者和订阅者。

    2.1.5 MQTT在网络中的位置

    MQTT是基于底层传输协议基础设施(wifi,bt,ble等)之上的传输层的协议,如果从网络7层协议的角度来看,MQTT应该是传输层的协议。

    需要注意的是MQTT是基于TCP/IP协议的。而NB-IoT是基于UDP的,所以NB-IoT只能使用CoAP协议来支撑。

    2.1.6 网络连接支持

    MQTT协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端和从服务端到客户端)的字节流。

    MQTT 3.1使用的传输层协议是定义的TCP/IP协议。下面的协议也支持:

    l   TLS协议

    l   WebSocket协议

    TCP端口8883和1883已在IANA注册,分别用于MQTT的TLS和非TLS通信。

    无连接的网络传输协议如UDP是不支持的,因为他们可能会丢失数据包或对数据包重排序。

    版权所有,转载请注明出处:http://www.junsion.icoc.bz/ by 小丑


    展开全文
  • MQTT协议

    2021-07-14 14:20:33
    MQTT协议MQTT简介特性MQTT协议格式实现方式MQTT的搭建(ubuntu)MQTT权限配置修改配置文件添加用户信息添加Topic和用户的关系用户认证测试MQTT实现(Java语言)PomClientMQTTServerMQTTPushCallback MQTT简介 MQTT...

    MQTT简介

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级协议,该协议构建于TCP/IP协议之上,MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

    特性

    MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

    1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
    2. 对负载内容屏蔽的消息传输。
    3. 使用TCP/IP提供网络连接。
      主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。
    4. 有三种消息发布服务质量(QoS):
      • QoS0:“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
      • QoS1:“至少一次”,确保消息到达,但消息重复可能会发生。
      • QoS2:“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
    5. 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。

    这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。

    MQTT协议格式

    MQTT协议使用二进制数据包,包含三个部分,分别是固定头,可变头、消息体;

    • 固定头:存在于所有的MQTT数据包中,长度是2-5字节,包括3部分内容,数据包类型(4bit),标识位(4bit),数据包剩余长度大小(1~4Byte),具体含义参考MQTT协议

    • 可变头:部分MQTT数据包包含

    • 消息体:部分MQTT数据包包含

    MQTT协议中,固定头中的数据包剩余长度大小包括可变头和消息体长度,剩余长度可用1~4Byte表示,4Byte最大可表示256MB(0xFFFFFF7F)。有些数据包没有可变头和消息体,比如PINGREQ数据包只有2Byte,由此可以计算MQTT数据包的最大值和最小值

    • 最大值:256MB+5Byte,其中256MB是剩余长度最大值,包括可变头和消息体;5Byte是固定头,数据包类型(4bit),标识位(4bit),数据包剩余长度大小(4Byte);

    • 最小值:2Byte,比如PINGREQ数据包,只有固定头,没有可变头,消息体;

    实现方式

    实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

    MQTT Client: 只要设备基于MQTT协议连接了MQTT Broker ,就认为这个设备是MQTT Client, MQTT Client 可以单独作为发布者和订阅者,也可以同时是发布者和订阅者。

    MQTT Broker: MQTT Broker 是MQTT协议的核心,主要作用是接收发布者的消息,然后转发给对应的订阅者。Broker可以对Clinet接入进行授权,并对Client进行权限控制。常用的C语言编写的MQTT Broker 开源库有Mosquitto。如果学习MQTT需要Broker环境,可以通过这些开源库自建,也可以用各大云平台提供的Broker服务,如阿里云、腾讯云。

    MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

    • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
    • payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

    MQTT的搭建(ubuntu)

    1.apt-get安装mqtt相关包

    apt-get install mosquitto
    

    在这里插入图片描述
    安装客户端

    apt-get install mosquitto-clients
    

    在这里插入图片描述
    2.测试mosquitto是否正确运行

    service mosquitto status
    

    在这里插入图片描述
    3.本机终端测试mqtt

    打开一个终端,订阅主题

    mosquitto_sub -h 192.168.158.128 -t "mqtt" -v
    
    • -h 指定要连接的MQTT服务器
    • -t 订阅主题,此处为mqtt
    • -v 打印更多的调试信息

    在这里插入图片描述

    再打开一个终端,发布主题

    mosquitto_pub -h 192.168.158.128 -t "mqtt" -m "hello world"
    
    • -h 指定要连接的MQTT服务器
    • -t 向指定主题推送消息
    • -m 指定消息内容

    在这里插入图片描述

    MQTT权限配置

    前面我们基于Mosquitto服务器已经搭建成功了,但是默认是允许匿名用户登录,对于正式上线的项目则是需要进行用户认证(当然,用户一般都会与数据库映射,不过在这里我们就会直接将用户写入配置文件中)

    1.Mosquitto服务器的配置文件为/etc/mosquitto/mosquitto.conf,关于用户认证的方式和读取的配置都在这个文件中进行

    配置文件参数说明:

    IDallow_anonymouspassword_fileacl_fileresult
    1True(默认)允许匿名方式登录
    2Falsepassword_file开启用户验证机制
    3Falsepassword_fileacl_file开启用户验证机制,但访问控制不起作用
    4Truepassword_fileacl_file用户名及密码不为空,将自动进行用户验证且受到访问控制的限制;用户名及密码为空,将不进行用户验证且受到访问控制的限制
    5False无法启动服务

    allow_anonymous:允许匿名
    password-file:密码文件
    acl_file:访问控制列表

    修改配置文件

     vi /etc/mosquitto/mosquitto.conf
    

    在这里插入图片描述

    allow_anonymous false
    password_file /etc/mosquitto/pwfile
    acl_file /etc/mosquitto/acl
    

    添加用户信息

    mosquitto_passwd -c /etc/mosquitto/pwfile zysheep
    

    在这里插入图片描述

    添加Topic和用户的关系

    user zysheep
    topic write  mtopic/#
    
    user zysheep
    topic read mtopic/#
    

    主题层级分隔符 / : 用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号。 比方说: aaa/bbb和 aaa/bbb/ccc 和aaa/bbb/ccc/ddd ,这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。 这在现实场景中,可以应用到:公司的部门层级推送、国家城市层级推送等包含层级关系的场景。

    单层通配符 +: 单层通配符只能匹配一层主题。比如: aaa/+ 可以匹配 aaa/bbb ,但是不能匹配aaa/bbb/ccc。单独的+号可以匹配单层的所有推送

    多层通配符 #: 多层通配符可以匹配于多层主题。比如: aaa/# ,不但可以匹配aaa/bbb,还可以匹配aaa/bbb/ccc/ddd。也就是说,多层通配符可以匹配符合通配符之前主题层级的所有子集主题。单独的#匹配所有的消息主题.
    在这里插入图片描述

    用户认证测试

    1.重启Mosquitto步骤,查看mosquitto的进程

    ps -aux|grep mosquitto
    

    在这里插入图片描述
    2. 杀死进程

    sudo kill -9 25372
    

    在这里插入图片描述
    3.重新启动mosquitto

    mosquitto -c /etc/mosquitto/mosquitto.conf 
    

    在这里插入图片描述
    4.订阅端启动(不加用户)

    mosquitto_sub -h 192.168.158.128 -t "mtopic" -v
    

    在这里插入图片描述

    拒绝连接:未授权

    5.订阅端启动(加用户)

    mosquitto_sub -h 192.168.158.128 -t "mtopic" -v -u zysheep -P 123456
    
    • -h 指定要连接的MQTT服务器
    • -t 订阅主题,此处为mqtt
    • -v 打印更多的调试信息
    • -u 设置的用户
    • -P 用户密码

    在这里插入图片描述

    6.发布端启动

    mosquitto_pub -h 192.168.158.128 -t mtopic -u zysheep  -p 123456 -m "hello world"
    

    在这里插入图片描述

    MQTT实现(Java语言)

    Pom

    <dependency>
      <groupId>org.eclipse.paho</groupId>
      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
      <version>1.1.1</version>
    </dependency>
    

    ClientMQTT

    package cn.zysheep.mybatisspringboot.mqtt;
    
    import java.util.concurrent.ScheduledExecutorService;
    import org.eclipse.paho.client.mqttv3.MqttClient;
    import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
    import org.eclipse.paho.client.mqttv3.MqttException;
    import org.eclipse.paho.client.mqttv3.MqttTopic;
    import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
    /**
     * Subscribe 客户端订阅主题
     */
    public class ClientMQTT {
        public static final String HOST = "tcp://192.168.158.128:1883";
        public static final String TOPIC = "mtopic/zysheep/123";
        private static final String clientid = "client11";
        private MqttClient client;
        private MqttConnectOptions options;
        private String userName = "zysheep";
        private String passWord = "123456";
    
        private ScheduledExecutorService scheduler;
    
        private void start() {
            try {
                // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
                client = new MqttClient(HOST, clientid, new MemoryPersistence());
                // MQTT的连接设置
                options = new MqttConnectOptions();
                // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
                options.setCleanSession(true);
                // 设置连接的用户名
                options.setUserName(userName);
                // 设置连接的密码
                options.setPassword(passWord.toCharArray());
                // 设置超时时间 单位为秒
                options.setConnectionTimeout(10);
                // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
                options.setKeepAliveInterval(20);
                // 设置回调
                client.setCallback(new PushCallback());
                MqttTopic topic = client.getTopic(TOPIC);
                //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
                options.setWill(topic, "close".getBytes(), 2, true);
    
                client.connect(options);
                //订阅消息
                int[] Qos  = {1};
                // qos 对消息处理的几种机制。
                // 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。   最多一次,即:<=1
                // 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。  至少一次,即:>=1
                // 2 多了一次去重的动作,确保订阅者收到的消息有一次。   一次,即:=1
                String[] topic1 = {TOPIC};
                client.subscribe(topic1, Qos);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
    
    
        public static void main(String[] args) throws MqttException {
            ClientMQTT client = new ClientMQTT();
            client.start();
        }
    }
    

    ServerMQTT

    package cn.zysheep.mybatisspringboot.mqtt;
    import cn.zysheep.mybatisspringboot.entity.Wares;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.eclipse.paho.client.mqttv3.MqttClient;
    import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
    import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
    import org.eclipse.paho.client.mqttv3.MqttException;
    import org.eclipse.paho.client.mqttv3.MqttMessage;
    import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
    import org.eclipse.paho.client.mqttv3.MqttTopic;
    import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
    
    /**
     * 服务器向多个客户端推送主题,即不同客户端可向服务端订阅相同的主题
     *
     * Publish 服务端向主题发布消息
     */
    
    public class ServerMQTT {
        //tcp://MQTT安装的服务器地址:MQTT定义的端口号
        public static final String HOST = "tcp://192.168.158.128:1883";
        //定义一个主题
        public static final String TOPIC = "mtopic/zysheep/123";
        //定义MQTT的ID,可以在MQTT服务配置中指定
        private static final String clientid = "server11";
    
        private MqttClient client;
        private MqttTopic topic11;
        private String userName = "zysheep";
        private String passWord = "123456";
    
        private MqttMessage message;
    
        /**
         * 构造函数
         * @throws MqttException
         */
        public ServerMQTT() throws MqttException {
            // MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(HOST, clientid, new MemoryPersistence());
            connect();
        }
    
        /**
         *  用来连接服务器
         */
        private void connect() {
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(false);
            options.setUserName(userName);
            options.setPassword(passWord.toCharArray());
            // 设置超时时间
            options.setConnectionTimeout(10);
            // 设置会话心跳时间
            options.setKeepAliveInterval(20);
            try {
                client.setCallback(new PushCallback());
                client.connect(options);
    
                topic11 = client.getTopic(TOPIC);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         *
         * @param topic
         * @param message
         * @throws MqttPersistenceException
         * @throws MqttException
         */
        public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException,
                MqttException {
            MqttDeliveryToken token = topic.publish(message);
            token.waitForCompletion();
            System.out.println("message is published completely! "
                    + token.isComplete());
        }
    
        /**
         *  启动入口
         * @param args
         * @throws MqttException
         */
        public static void main(String[] args) throws MqttException, JsonProcessingException, InterruptedException {
            ServerMQTT server = new ServerMQTT();
    
            server.message = new MqttMessage();
            server.message.setQos(1);
            server.message.setRetained(true);
            Wares wares = new Wares();
            wares.setName("常德牌水表");
            wares.setPicAddress("常德");
            ObjectMapper objectMapper = new ObjectMapper();
            String s = objectMapper.writeValueAsString(wares);
            server.message.setPayload(s.getBytes());
            for (int i = 0; i < 10; i++) {
                if (i%2 == 0){
                    Thread.sleep(5000);
                }
                server.publish(server.topic11 , server.message);
            }
    
    
            System.out.println(server.message.isRetained() + "------ratained状态");
        }
    }
    

    PushCallback

    package cn.zysheep.mybatisspringboot.mqtt;
    
    import cn.zysheep.mybatisspringboot.entity.Wares;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.eclipse.paho.client.mqttv3.MqttCallback;
    import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
    import org.eclipse.paho.client.mqttv3.MqttMessage;
    
    /**
     * 发布消息的回调类
     *
     * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
     * 每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。
     * 在回调中,将它用来标识已经启动了该回调的哪个实例。
     * 必须在回调类中实现三个方法:
     *
     *  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
     *
     *  public void connectionLost(Throwable cause)在断开连接时调用。
     *
     *  public void deliveryComplete(MqttDeliveryToken token))
     *  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
     *  由 MqttClient.connect 激活此回调。
     */
    public class PushCallback implements MqttCallback{
        public void connectionLost(Throwable cause) {
            // 连接丢失后,一般在这里面进行重连
            System.out.println("连接断开,可以做重连");
        }
    
        public void deliveryComplete(IMqttDeliveryToken token) {
            System.out.println("deliveryComplete---------" + token.isComplete());
        }
    
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            // subscribe后得到的消息会执行到这里面
            System.out.println("接收消息主题 : " + topic);
            System.out.println("接收消息Qos : " + message.getQos());
            String s = new String(message.getPayload());
            ObjectMapper objectMapper = new ObjectMapper();
            Wares wares = objectMapper.readValue(s, Wares.class);
            System.out.println(wares);
    
    
            //System.out.println("接收消息内容 : " + new String(message.getPayload()));
        }
    }
    

    展开全文
  • MQTT协议介绍

    万次阅读 2021-06-26 07:59:59
    MQTT协议 概览 MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计。 MQTT官网: http://mqtt.org MQTT V3.1.1协议规范: ...

    MQTT协议

    概览


    MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计。

    MQTT官网: http://mqtt.org

    MQTT V3.1.1协议规范: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

    特点

    1. 开放消息协议,简单易实现
    2. 发布订阅模式,一对多消息发布
    3. 基于TCP/IP网络连接
    4. 1字节固定报头,2字节心跳报文,报文结构紧凑
    5. 消息QoS支持,可靠传输保证

    应用

    MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

    1. 物联网M2M通信,物联网大数据采集
    2. Android消息推送,WEB消息推送
    3. 移动即时消息,例如Facebook Messenger
    4. 智能硬件、智能家具、智能电器
    5. 车联网通信,电动车站桩采集
    6. 智慧城市、远程医疗、远程教育
    7. 电力、石油与能源等行业市场

    MQTT基于主题(Topic)消息路由

    MQTT协议基于主题(Topic)进行消息路由,主题(Topic)类似URL路径,例如:

    chat/room/1
    
    sensor/10/temperature
    
    sensor/+/temperature
    
    $SYS/broker/metrics/packets/received
    
    $SYS/broker/metrics/#
    
    

    主题(Topic)通过’/‘分割层级,支持’+’, '#'通配符:

    '+': 表示通配一个层级,例如a/+,匹配a/x, a/y
        
    '#': 表示通配多个层级,例如a/#,匹配a/x, a/b/c/d
    
    

    订阅者与发布者之间通过主题路由消息进行通信,例如采用mosquitto命令行发布订阅消息:

    mosquitto_sub -t a/b/+ -q 1
    
    mosquitto_pub -t a/b/c -m hello -q 1
    
    

    订阅者可以订阅含通配符主题,但发布者不允许向含通配符主题发布消息。

    MQTT V3.1.1协议报文

    报文结构

    • 固定报头(Fixed header)
    • 可变报头(Variable header)
    • 报文有效载荷(Payload)

    固定报头

    +----------+-----+-----+-----+-----+-----+-----+-----+-----+
    | Bit      |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
    +----------+-----+-----+-----+-----+-----+-----+-----+-----+
    | byte1    |   MQTT Packet type    |         Flags         |
    +----------+-----------------------+-----------------------+
    | byte2... |   Remaining Length                            |
    +----------+-----------------------------------------------+
    

    报文类型

    类型名称类型值报文说明
    CONNECT1发起连接
    CONNACK2连接回执
    PUBLISH3发布消息
    PUBACK4发布回执
    PUBREC5QoS2消息回执
    PUBREL6QoS2消息释放
    PUBCOMP7QoS2消息完成
    SUBSCRIBE8订阅主题
    SUBACK9订阅回执
    UNSUBSCRIBE10取消订阅
    UNSUBACK11取消订阅回执
    PINGREQ12PING请求
    PINGRESP13PING响应
    DISCONNECT14断开连接

    PUBLISH发布消息

    PUBLISH报文承载客户端与服务器间双向的发布消息。 PUBACK报文用于接收端确认QoS1报文,PUBREC/PUBREL/PUBCOMP报文用于QoS2消息流程。

    PINGREQ/PINGRESP心跳

    客户端在无报文发送时,按保活周期(KeepAlive)定时向服务端发送PINGREQ心跳报文,服务端响应PINGRESP报文。PINGREQ/PINGRESP报文均2个字节。

    Qos0消息发布订阅

    在这里插入图片描述

    Qos1消息发布订阅

    在这里插入图片描述

    Qos2消息发布订阅

    在这里插入图片描述

    MQTT会话(Clean Session)

    MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话。

    'Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。

    'Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。

    MQTT连接保活心跳

    MQTT客户端向服务器发起CONNECT请求时,通过KeepAlive参数设置保活周期。

    客户端在无报文发送时,按KeepAlive周期定时发送2字节的PINGREQ心跳报文,服务端收到PINGREQ报文后,回复2字节的PINGRESP报文。

    服务端在1.5个心跳周期内,既没有收到客户端发布订阅报文,也没有收到PINGREQ心跳报文时,主动心跳超时断开客户端TCP连接。

    MQTT遗愿消息(Last Will)

    MQTT客户端向服务器端CONNECT请求时,可以设置是否发送遗愿消息(Will Message)标志,和遗愿消息主题(Topic)与内容(Payload)。

    MQTT客户端异常下线时(客户端断开前未向服务器发送DISCONNECT消息),MQTT消息服务器会发布遗愿消息。

    MQTT保留消息(Retained Message)

    MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(Retained Message)标志。保留消息(Retained Message)会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息。

    例如mosquitto命令行发布一条保留消息到主题’a/b/c’:

    mosquitto_pub -r -q 1 -t a/b/c -m 'hello'
    
    

    之后连接上来的MQTT客户端订阅主题’a/b/c’时候,仍可收到该消息:

    $ mosquitto_sub -t a/b/c -q 1
    hello
    
    

    保留消息(Retained Message)有两种清除方式:

    客户端向有保留消息的主题发布一个空消息:

    mosquitto_pub -r -q 1 -t a/b/c -m ''
    
    

    消息服务器设置保留消息的超期时间。

    MQTT WebSocket连接

    MQTT协议除支持TCP传输层外,还支持WebSocket作为传输层。通过WebSocket浏览器可以直连MQTT消息服务器,发布订阅模式与其他MQTT客户端通信。

    MQTT协议的WebSocket连接,必须采用binary模式,并携带子协议Header:

    Sec-WebSocket-Protocol: mqttv3.1 或 mqttv3.1.1
    
    

    MQTT 与 XMPP 协议对比

    MQTT协议设计简单轻量、路由灵活,将在移动互联网物联网消息领域,全面取代PC时代的XMPP协议:

    1. MQTT协议一个字节固定报头,两个字节心跳报文,报文体积小编解码容易。XMPP协议基于繁重的XML,报文体积大且交互繁琐。
    2. MQTT协议基于主题(Topic)发布订阅模式消息路由,相比XMPP基于JID的点对点消息路由更为灵活。
    3. MQTT协议未定义报文内容格式,可以承载JSON、二进制等不同类型报文。XMPP协议采用XML承载报文,二进制必须Base64编码等处理。
    4. MQTT协议支持消息收发确认和QoS保证,XMPP主协议并未定义类似机制。MQTT协议有更好的消息可靠性保证。

    MQTT-SN 协议

    MQTT-SN 协议是 MQTT 的直系亲属,它使用 UDP 进行通信,标准的端口是1884。MQTT-SN 的主要目的是为了适应受限的设备和网络,比如一些传感器,只有很小的内存和 CPU,TCP 对于这些设备来说非常奢侈。还有一些网络,比如 ZIGBEE,报文的长度在300字节以下,无法承载太大的数据包。所以 MQTT-SN 的数据包更小巧。

    MQTT-SN 的官方标准下载地址: http://mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf

    MQTT-SN 和 MQTT 的区别

    MQTT-SN 的信令和 MQTT 大部分都相同,比如都有 Will, 都有 Connect/Subscribe/Publish 命令.

    MQTT-SN 最大的不同是,Topic 使用 TopicId 来代替,而 TopicId 是一个16比特的数字。每一个数字对应一个 Topic, 设备和云端需要使用 REGISTER 命令映射 TopicId 和 Topic 的对应关系。

    MQTT-SN 可以随时更改 Will 的内容, 甚至可以取消. 而 MQTT 只允许在 CONNECT 时设定 Will 的内容, 而且不允许更改.

    MQTT-SN 的网络中有网关这种设备,它负责把 MQTT-SN 转换成 MQTT,和云端的 MQTT Broker 通信. MQTT-SN 的协议支持自动发现网关的功能。

    MQTT-SN 还支持设备的睡眠功能,如果设备进入睡眠状态,无法接收 UDP 数据,网关将把下行的 PUBLISH 消息缓存起来,直到设备苏醒后再传送。

    MQTT-SN 客户端库

    1. https://github.com/eclipse/paho.mqtt-sn.embedded-c/
    2. https://github.com/ty4tw/MQTT-SN
    3. https://github.com/njh/mqtt-sn-tools
    4. https://github.com/arobenko/mqtt-sn

    LWM2M 协议

    LwM2M 全称是 Lightweight Machine-To-Machine,是由 Open Mobile Alliance(OMA) 定义的一套适用于物联网的轻量级协议,它提供了设备管理和通讯的功能,尤其适用于资源有限的终端设备。协议可以在 这里 (opens new window)下载。

    LwM2M 基于 REST 架构,使用 CoAP 作为底层的传输协议,承载在 UDP 或者 SMS 上,因而报文结构简单小巧,并且在网络资源有限及无法确保设备始终在线的环境里同样适用。

    LwM2M 最主要的实体包括 LwM2M Server 和 LwM2M Client。

    LwM2M Server 作为服务器,部署在 M2M 服务供应商处或网络服务供应商处。LwM2M 定义了两种服务器

    LwM2M Client 作为客户端,部署在各个 LwM2M 设备上。

    在 LwM2M Server 和 LwM2M Client 之间,LwM2M 协议定义了4个接口。

    1. 引导接口 Bootstrap:向 LwM2M 客户端提供注册到 LwM2M 服务器的必要信息,例如服务器访问信息、客户端支持的资源信息等。
    2. 客户端注册接口 Client Registration:使 LwM2M 客户端与 LwM2M 服务器互联,将 LwM2M 客户端的相关信息存储在 LwM2M 服务器上。只有完成注册后,LwM2M 客户端与服务器端之间的通信与管理才成为可能。
    3. 设备管理与服务实现接口 Device Management and Service Enablement:该接口的主控方为 LwM2M 服务器,服务器向客户端发送指令,客户端对指令做出回应并将回应消息发送给服务器。
    4. 信息上报接口 Information Reporting:允许 LwM2M 服务器端向客户端订阅资源信息,客户端接收订阅后按照约定的模式向服务器端报告自己的资源变化情况。

    LwM2M 把设备上的服务抽象为 Object 和 Resource, 在 XML 文件中定义各种 Object 的属性和功能。可以在 这里找到 XML 的各种定义。

    LwM2M 协议预定义了8种 Object 来满足基本的需求,分别是:

    • Security 安全对象
    • Server 服务器对象
    • Access Control 访问控制对象
    • Device 设备对象
    • Connectivity Monitoring 连通性监控对象
    • Firmware 固件对象
    • Location 位置对象
    • Connectivity Statistics 连通性统计对象
    展开全文
  • MQTT 协议是什么

    万次阅读 2021-06-26 09:44:19
    MQTT 协议是什么 随着 5G 时代的来临,万物互联的伟大构想正在成为现实。联网的 物联网设备 在 2018 年已经达到了 70 亿,在未来两年,仅智能水电气表就将超过10亿。 海量的设备接入和设备管理对网络带宽、通信协议...
  • MQTT协议了解 文章目录MQTT协议了解1. 前言2. MQTT简介(1). 概述(2). 相关名称(3). 协议应用(4). 开源方案3. 适用于FreeRTOS的MQTT库4. 最后 1. 前言 MQTT可以说是专门为IOT而设计的协议,相较于http协议来说,更加...
  • mqtt协议

    万次阅读 2018-12-20 16:00:18
    物联网下,物理设备内存CPU有限、4G网络不可靠、网络带宽小等,公司设备准备用MQTT协议实现P/S模式的消息传递,目前有emqttd、mosquitto、activemq等支持mqtt协议。对于点对点的消息传递直接使用一般的通信方式不...
  • MQTT协议简介

    2021-03-20 22:48:45
    MQTT工作在应用层,一般借助TCP/IP实现数据包传输功能,MQTT传输层上传输的是流数据,因此理论上MQTT可以使用任何有线或无线的传输介质实现数据包传输。 MQTT基于发布/订阅机制,一个通讯链路分工主要分为三种...
  • MQTT协议学习笔记

    2020-05-18 22:48:02
    MQTT协议 文章目录MQTT协议MQTT协议的概念MQTT协议的特点MQTT协议通信流程1.消息类型2.MQTT控制报文3.Wireshark抓包 MQTT协议的概念 ...TCP/IP参考模型可分为四层:应用层、传输层、网络层、链路层。TC
  • MQTT协议入门

    千次阅读 多人点赞 2021-02-25 01:38:51
    MQTT协议可以说是目前应用最广的物联网应用协议,MQTT解决了物联网中的一个最基础问题,即设备和设备、设备和云端服务之间的通信。主要应用场景是可以为大量低功耗、网络环境不可靠的物联网设备提供通信保障。 ...
  • MQTT协议结构

    2020-08-27 16:21:59
    MQTT协议结构 前言 最近在了解MQTT协议相关的内容,内容有点多,特此把MQTT协议,以及其从服务端到客户端的流程整理出来,记录如下。 一,MQTT协议介绍 1.1 术语 Terminology 本规范中用到的关键字 必须 MUST,不能 ...
  • MQTT 协议快速入门

    千次阅读 2018-11-26 13:17:39
    本课程深入浅出地介绍了 MQTT 协议的各种特性,对每个协议特性都辅以具体代码进行讲解,并通过一个 IoT+AI 项目实战来具体展现 MQTT 在移动端、Web 端的使用,MQTT Broker 的架设等场景。 作者介绍 付强,十余年从业...
  • MQTT协议简介及协议原理

    千次阅读 2020-06-13 15:24:00
    带你看看MQTT协议简介及协议原理
  • 这里写目录标题一.对MQTT协议和TCP协议的基本认识二.TCP与UDP的区别三.IP,端口号,域名与DNS简介以及之间的关系四.MQTT报文的...基于MQTT协议传输数据的方式? MQTT协议规定了双方之间通信的方式,即彼此之间通过订阅
  • MQTT协议3.1

    2019-04-20 09:49:48
    MQTT协议¶ MQTT轻量发布订阅消息协议¶ 概览¶ MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计。 MQTT官网: http://mqtt.org MQTT V3.1.1协议规范: ...
  • MQTT协议入门介绍

    2020-02-05 14:45:07
    MQTT协议的主要特性 MQTT主要应用 MQTT基于主题(Topic)消息路由 MQTT V3.1.1协议报文 MQTT消息QoS MQTT会话(Clean Session) MQTT连接保活心跳 MQTT遗愿消息(Last Will) MQTT保留消息(Retained Message) ...
  • MQTT协议相关

    2020-08-11 10:44:28
    TCP是面向连接,可靠的,基于字节流的传输层的通信协议 MQTT是在低带宽,高延迟,不可靠的网络下进行数据相对可靠的传输的应用层协议 HTTP(超文本传输协议),基于TCP/IP通信协议来传输数据,端口是80 传输单位:...
  • MQTT协议与EMQ

    2021-08-10 09:45:53
    文章目录前言一、MQTT协议介绍1. 物联网的通信协议:2.MQTT 协议特点3. MQTT协议设计规范4.MQTT协议主要特性5.MQTT协议实现方式6.MQTT客户端7.MQTT服务器端8. 发布/订阅、主题、会话9. MQTT协议中的方法10.MQTT协议...
  • MQTT协议整理

    千次阅读 2019-07-06 11:35:37
    MQTT协议整理 1、定义 MQTT是一个轻量级的采用Broker的基于TCP(默认端口号1833)的发布/订阅式异步遥信消息队列传输应用协议。设计初始目的是为大量计算能力有限、工作在低带宽、不可靠的远程传感器和控制器...
  • 浅谈物联网开发最热协议—MQTT协议

    千次阅读 多人点赞 2020-07-18 08:26:58
    MQTT协议通信模型 消息主题 服务质量定义 MQTT客户端的功能 MQTT服务器的功能 MQTT协议会话 MQTT协议的报文详情 Hello,大家好,我是灰小猿! 最近在在物联网相关项目的开发的时候,有用到物联网常用的通信...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,165
精华内容 1,666
关键字:

mqtt协议传输层