直接上代码啦,至于原理什么的大家可以自行搜索
这个是带用户名和密码的
public static void main(String[] args) {
String broker = ""; // MQTT Broker的地址
String clientId = "zyf"; // 客户端ID,可以自定义
MemoryPersistence persistence = new MemoryPersistence();
// 设置用户名和密码
String username = "your-username"; // 替换为你的用户名
String password = "your-password"; // 替换为你的密码
try {
MqttClient client = new MqttClient(broker, clientId, persistence);
// 设置回调处理类
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
System.out.println("连接丢失");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("收到消息:Topic=" + topic + ", Message=" + new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("消息发送完成");
}
});
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(false);
// 添加用户名和密码
connOpts.setUserName(username);
connOpts.setPassword(password.toCharArray());
System.out.println("连接到 " + broker);
client.connect(connOpts);
System.out.println("连接成功");
String topic = "data/jszx/group1/1"; // 订阅的主题
int qos = 2; // 消息质量服务等级 (0:最多一次,1:至少一次,2:只有一次)
// 等待一段时间后关闭连接
Thread.sleep(1000);
// client.disconnect();
// System.out.println("连接已断开");
} catch (MqttException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
匿名的
public class MqttTest {
private static final String BROKER = ""; // MQTT Broker的地址
private static final String CLIENT_ID = "zyf"; // 客户端ID,可以自定义
private MqttClient client;
@Before
public void setup() {
MemoryPersistence persistence = new MemoryPersistence();
try {
client = new MqttClient(BROKER, CLIENT_ID, persistence);
} catch (MqttException e) {
e.printStackTrace();
}
}
@Test
public void testSubscribe() {
try {
// 设置回调处理类
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
System.out.println("连接丢失");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("收到消息:Topic=" + topic + ", Message=" + new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("消息发送完成");
}
});
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(false);
System.out.println("连接到 " + BROKER);
client.connect(connOpts);
System.out.println("连接成功");
String subscribeTopic = "data/jszx/group1/1"; // 订阅的主题
int subscribeQos = 0; // 订阅的消息质量服务等级 (0:最多一次,1:至少一次,2:只有一次)
subscribeToTopic(subscribeTopic, subscribeQos);
// 等待一段时间后关闭连接
Thread.sleep(5000);
client.disconnect();
System.out.println("连接已断开");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testPublish() {
try {
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(false);
System.out.println("连接到 " + BROKER);
client.connect(connOpts);
System.out.println("连接成功");
// 发布消息
publishSampleMessage();
// 等待一段时间后关闭连接
Thread.sleep(1000);
client.disconnect();
System.out.println("连接已断开");
} catch (Exception e) {
e.printStackTrace();
}
}
// 订阅方法
private void subscribeToTopic(String topic, int qos) throws MqttException {
client.subscribe(topic, qos);
}
// 发布消息方法
private void publishSampleMessage() throws MqttException {
// 创建一个Map表示要发送的数据
Map<String, Object> data = new HashMap<String, Object>();
data.put("type", "set_var");
Map<String, String> payload = new HashMap<String, String>();
payload.put("do1", "1");
data.put("payload", payload);
// 将Map转换为JSON字符串
Gson gson = new Gson();
String jsonData = gson.toJson(data);
// 创建消息对象
MqttMessage message = new MqttMessage(jsonData.getBytes());
message.setQos(0);
String publishTopic = "cmd/jszx/group1/1"; // 发布的主题
client.publish(publishTopic, message);
System.out.println("已发布消息:" + jsonData);
}
附上maven,里面有一些没用的啊,是我实现其他功能的,大家
<dependencies>
<!-- Eclipse Paho MQTT Client -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version> <!-- 版本号可能会有所不同 -->
</dependency>
</dependencies>