#MQTT协议客户端实现
1、协议简单介绍
Message Queuing Telemetry Transport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与 HTTP 一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。
原理:
(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
实现回调接口里面的几个方法 接收信息的方法:
MQTT客户端发送信息
直接调用方法,入参为发送的主题和信息
3、无设备环境 进行模拟测试
服务端工具:
EMQX 作为测试用的 mqtt服务端
启动后可在本地访问18083端口,可查看信息流通数据 订阅的一些客户端数据
客户端工具:
MQTTX 作为测试用的 mqtt客户端
连接我们刚才的服务端 地址和主题不能填错
测试流程:
客户端测试工具内发送信息->服务端测试工具->我们的程序(是否可以收到信息)
向服务端测试工具发送信息->服务端测试工具->客户端测试工具(聊天框是否有信息)