服务器:
搭建本地mqtt服务器:基于Mosquitto搭建MQTT服务器_月亮鞋业的博客-CSDN博客
也可以使用公共服务器:
官网地址:http://www.ranye-iot.net
MQTT服务器地址:test.ranye-iot.net
TCP 端口:1883
TCP/TLS 端口:8883
Java引用:
先引入依赖
<!--MQTT依赖-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
发布消息
调用这个sendMsg()方法就能向test.ranye-iot.net地址发送主题为testtopic的消息了;
public static void sendMsg() throws MqttException {
String clientId = "JavaSample1"; //客户ID,自己起名,不可重复
String content = "主题内容xxxxxxxxxxx"; //发送的信息
String topic = "testtopic"; //主题
int qos = 2; //服务质量等级
String broker = "tcp://test.ranye-iot.net:1883"; //服务器地址
MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());//创建客户累
MqttConnectOptions connect = new MqttConnectOptions();//创建连接类
connect.setConnectionTimeout(60);//超时时间
connect.setKeepAliveInterval(10);//心跳时间
connect.setCleanSession(true);//清除会话
client.connect(connect);//客户类通过连接类连接
MqttMessage message = new MqttMessage(content.getBytes());//发布消息类
message.setQos(qos);//发布消息类设置服务质量等级
client.publish(topic, message);//发布消息
// client.disconnect();//客户类关闭连接
// System.exit(0);//退出
}
接收消息
1、先写回调函数类,实现MqttCallback接口;
重写三个方法,第一个connectionLost是链接丢失时触发,第二个messageArrived是接收到消息触发,第三个deliveryComplete是消息发布完成触发;
public class MyCallBack implements MqttCallback {
//连接丢失时触发(不包括主动disconnect)
@Override
public void connectionLost(Throwable throwable) {
System.out.println("连接失败,请重新连接");
}
//接收到内容触发
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("接收到的主题为:" + s);
System.out.println("内容为:" + new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
}
//发布完消息触发
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("发布消息成功");
}
}
2、建立连接开启监听,当调用发送消息方法时就能接收到了;
public static void getMsg() throws MqttException {
String clientId = "JavaSample2"; //客户ID,不可重复
String topic = "testtopic"; //主题
int qos = 2; //服务质量等级
String broker = "tcp://test.ranye-iot.net:1883"; //服务器地址
MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());//创建客户累
client.setCallback(new MyCallBack());
MqttConnectOptions connect = new MqttConnectOptions();//创建连接类
connect.setConnectionTimeout(60);//超时时间
connect.setKeepAliveInterval(10);//心跳时间
connect.setCleanSession(true);//清除会话
client.connect(connect);//客户类通过连接类连接
client.subscribe(topic, qos);// qos:服务质量等级
}
测试
先调用接收消息getMsg(),然后调用发布消息sendMsg();
public static void main(String[] args) {
try {
getMsg();
sendMsg();
} catch (MqttException e) {
e.printStackTrace();
}
}
可以看到控制台打印回调函数里的内容;
MQTT.fx测试
也可以用MQTT.fx软件来测试,如下:
点击Publish后,在刚才的控制台就能看到了
接收的时候