大家可以在gitee或者Maven库网站上面找到对应的的Maven 引用 或者 Gradle 引用
GItee 地址: 点击进入
Maven 库地址:点击进入
这两个上面 都 有相关的依赖引用
下面说一下 这个库的配置:
org.fusesource.mqtt-client 这个库里提供了三种调用库的方式:
BlockingConnection connection = mqtt.blockingConnection();
connection.connect();
FutureConnection connection = mqtt.futureConnection();
Future<Void> f1 = connection.connect();
f1.await();
Future<byte[]> f2 = connection.subscribe(new Topic[]{new Topic(utf8("foo"), QoS.AT_LEAST_ONCE)});
byte[] qoses = f2.await();
// We can start future receive..
Future<Message> receive = connection.receive();
// send the message..
Future<Void> f3 = connection.publish("foo", "Hello".getBytes(), QoS.AT_LEAST_ONCE, false);
// Then the receive will get the message.
Message message = receive.await();
message.ack();
Future<Void> f4 = connection.disconnect();
f4.await();
上面两种 我不做细讲 感兴趣的朋友 可以去看一下 这篇文章
传送门 ==========================>
MQtt初始化:
private static MQTT mqttClient = null;
private static CallbackConnection connection=null;
/*
* Mqttbase初始化
*/
public static void MqttCreate(String TargetAddress) {
try {
//创建实例
MQTT mqttClient= new MQTT();
//创建客服端ID
mqttClient.setClientId("设置客户端ID");
mqttClient.setUserName("用户名"); //"BOD_PC_DVC"
mqttClient.setHost("目标地址IP", "端口号");
// 设置会话心跳时间 单位为秒
// 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
mqttClient.setKeepAlive((short) 60);
//连接Mqtt时候 获取设备离线状态下 主机设置信息(设备上线的时候会重新获取到离线时候收到的消息) 默认为true
//mqttClient.setCleanSession(false);
//第一次尝试连接不上时 重新连接Mqtt服务器次数 -1为无限制
mqttClient.setConnectAttemptsMax(-1);
//如果客户端掉线尝试 连接次数 -1为无限制连接
mqttClient.setReconnectAttemptsMax(-1);
//mqttClient 设置遗嘱 掉线或者意外关闭时会调用遗嘱信息
//设备非正常断开连接的时候调用 遗嘱:数据会 在遗嘱的主题里面发送对应内容
mqttClient.setWillTopic("遗嘱主题");
//设置遗嘱内容
mqttClient.setWillMessage("遗嘱内容");
//设置发送默认模式
mqttClient.setWillQos(QoS.AT_LEAST_ONCE);
//设置指数避退 设置为1 为重新连接时间等待间距按照指数增加 默认为2
mqttClient.setReconnectBackOffMultiplier(1);//设置重连接指数回归。设置为1则停用指数回归,默认为2
//打印版本号
//System.out.println(mqttClient.getVersion());
//创建一个回调连接
connection = mqttClient.callbackConnection();
//设置监听回调
connection.listener(new ExtendedListener() {
//当前Mqtt客户端接收到 对应订阅主题时 会调用这个方法↓↓
@Override
public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Callback<Callback<Void>> callback) {
callback.onSuccess(new Callback<Void>() {
@Override
public void onSuccess(Void unused) {
//数据接收成功
//暂时先打印出来
System.out.println("主题:" + utf8Buffer.toString() + "数据:" + buffer.toString());
//这里处理接收
}
@Override
public void onFailure(Throwable throwable) {
//数据接收失败
}
});
}
//连接到远端MQTT服务器成功时调用此方法
@Override
public void onConnected() {
System.out.println("连接服务器成功");
}
//意外断开或者主动断开 都会调用此方法
@Override
public void onDisconnected() {
//connection
System.out.println("断开连接");
//MqttConnect();
}
@Override
public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Runnable runnable) {
}
@Override
public void onFailure(Throwable throwable) {
System.out.println("连接失败");
}
});
MqttConnect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* Mqtt连接
*/
private static void MqttConnect() {
connection.connect(new Callback<Void>() {
@Override
public void onSuccess(Void unused) {
//公共部分上线和离线
Topic[] topics = {
new Topic("主题1", QoS.AT_LEAST_ONCE), //主题1订阅
new Topic("主题2", QoS.AT_LEAST_ONCE), //主题2订阅
};
AddMqttSubscribe(topics);
}
@Override
public void onFailure(Throwable throwable) {
System.out.println("连接失败");
}
});
}
下面时MQTT 发送数据:
/**
* Mqtt发送消息
*
* @param SendTheme 发送的主题
* @param SendValue 发送的数据值
*/
public static void MqttSendData(String SendTheme, String SendValue) {
if (connection != null) {
connection.publish(SendTheme, SendValue.getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() {
@Override
public void onSuccess(Void unused) {
//测试用
// System.out.println("发送成功");
}
@Override
public void onFailure(Throwable throwable) {
//发送失败 保留等待 后面处理
System.out.println("发送失败"+throwable);
}
});
}
}
下面是断开连接:
/**
* MQTT 断开连接调用方法
*/
public static void MqttDisConnect() {
if (connection != null) {
connection.disconnect(new Callback<Void>() {
@Override
public void onSuccess(Void unused) {
//MQTT断开连接成功
}
@Override
public void onFailure(Throwable throwable) {
//MQTT 断开连接失败
}
});
}
}
订阅和取消订阅主题:
/**
*MQTT 取消主题订阅
* @param topics 主题值
* @return
*/
public static void MqttUnsubscribe(final UTF8Buffer[] topics) {
if (connection != null) {
connection.unsubscribe(topics, new Callback<Void>() {
@Override
public void onSuccess(Void unused) {
System.out.println("取消订阅成功!");
}
@Override
public void onFailure(Throwable throwable) {
}
});
}
}
public static void AddMqttSubscribe(final Topic[] topics)
{
if (connection != null) {
connection.subscribe(topics, new Callback<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
System.out.println("订阅成功!");
}
@Override
public void onFailure(Throwable throwable) {
System.out.println("订阅失败");
}
});
}
}
以上就是基本的初始化 方法处理 各位有觉得不妥可以在下发评论区发表下。
下面是我这边在使用过程中有出现过的一些问题和一些需要注意的地方。
public void unsubscribe(final UTF8Buffer[] topics, Callback<Void> cb)
connection.unsubscribe 传入参数是 UTF8Buffer[]类型; 传值需要处理下。