#MQTT协议客户端实现

1、协议简单介绍

Message Queuing Telemetry Transport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与 HTTP 一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。

Java MQTT 获取客户端列表 mqtt客户端编写_物联网

原理:

(1)MQTT协议身份和消息格式

有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

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

Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
payload,消息的内容
(2) 网络传输与应用消息

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

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

(3)MQTT客户端作用

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

可以是一个应用程序或一台设备

接受来自客户的网络连接
接受客户发布的应用信息
处理来自客户端的订阅和退订请求
向订阅的客户转发应用程序消息
(5) MQTT协议中的订阅、主题、会话

订阅(Subscription):

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

每个客户端与服务器建立连接后就是一个会话

主题名(Topic Name):

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

主题筛选器(Topic Filter):

表示订阅所匹配到的多个主题

负载(Payload):

其实就是内容。消息订阅者所具体接收的内容

2、实现MQTT简单客户端实现通信

MQTT客户端的订阅部分

// host为主机名,clientId即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientId的保存形式,默认为以内存保存
            client = new MqttClient(host, clientId, new
                    MemoryPersistence());
// MQTT的连接设置
            options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
// 设置连接的用户名
            options.setUserName(userName);
// 设置连接的密码
            options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(20);
//断开重连
            options.setAutomaticReconnect(true);
// 设置回调
            client.setCallback(uwbPushCallback);
            MqttTopic posTopic = client.getTopic(POS_TOPIC);

// setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
            options.setWill(posTopic, "close".getBytes(), 2, true);
            client.connect(options);
//连接成功清除重连的次数
            count = 0;
// 订阅消息
            int[] Qos = {1};
            String[] topic = {POS_TOPIC, INFO_TOPIC};
            client.subscribe(topic);

MQTT客户端处理信息部分

客户端订阅之前设置回调 回调实现MqttCallback

Java MQTT 获取客户端列表 mqtt客户端编写_网络协议_02

实现回调接口里面的几个方法 接收信息的方法:

Java MQTT 获取客户端列表 mqtt客户端编写_Java MQTT 获取客户端列表_03

MQTT客户端发送信息

直接调用方法,入参为发送的主题和信息

Java MQTT 获取客户端列表 mqtt客户端编写_网络_04

3、无设备环境 进行模拟测试

服务端工具:

EMQX 作为测试用的 mqtt服务端

Java MQTT 获取客户端列表 mqtt客户端编写_网络协议_05


启动后可在本地访问18083端口,可查看信息流通数据 订阅的一些客户端数据

Java MQTT 获取客户端列表 mqtt客户端编写_物联网_06

客户端工具:

MQTTX 作为测试用的 mqtt客户端

Java MQTT 获取客户端列表 mqtt客户端编写_物联网_07


连接我们刚才的服务端 地址和主题不能填错

Java MQTT 获取客户端列表 mqtt客户端编写_物联网_08

测试流程:

客户端测试工具内发送信息->服务端测试工具->我们的程序(是否可以收到信息)
向服务端测试工具发送信息->服务端测试工具->客户端测试工具(聊天框是否有信息)