上一篇文章讲了mosquitto的安装和用命令行来测试消息的发送和接收,这一篇文章讲如何用Java代码实现消息的发布和订阅。
1. 添加依赖
添加由eclipse基金会友情赞助的mqtt客户端开发包,我用的是1.2.0版本,目前最高版本是1.2.5
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
2. 代码实现
2.1 发布者
1)MqttPublisher
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MqttPublisher {
private static final Logger logger = LoggerFactory.getLogger(MqttPublisher.class);
//tcp://MQTT安装的服务器地址:MQTT定义的端口号
public static final String HOST = "tcp://localhost:1883";
//定义MQTT的ID,可以在MQTT服务配置中指定
private static final String clientid = "server11";
private MqttClient client;
private String userName = "mosquitto";
private String passWord = "";
/**
* 构造函数
* @throws MqttException
*/
public MqttPublisher() throws MqttException {
// MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(HOST, clientid, new MemoryPersistence());
connect();
}
/**
* 用来连接服务器
*/
private void connect() {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
// 设置超时时间
options.setConnectionTimeout(10);
// 设置会话心跳时间
options.setKeepAliveInterval(20);
try {
client.setCallback(new PushCallback());
client.connect(options);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param topic
* @param message
* @throws MqttPersistenceException
* @throws MqttException
*/
public void publish(String topic, MqttMessage message) throws MqttPersistenceException,
MqttException {
MqttDeliveryToken token = client.getTopic(topic).publish(message);
token.waitForCompletion();
logger.info("message is published completely! "
+ token.isComplete());
}
}
2)PushCallback (构造client使用)
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PushCallback implements MqttCallback {
private static final Logger logger = LoggerFactory.getLogger(PushCallback.class);
@Override
public void connectionLost(Throwable throwable) {
logger.info("连接丢失.............");
}
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
logger.info("接收消息主题 : " + topic);
logger.info("接收消息Qos : " + mqttMessage.getQos());
logger.info("接收消息内容 : " + new String(mqttMessage.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
logger.info("deliveryComplete.............");
}
}
3. 功能测试
3.1 启动mosquitto broker server
3.2 新起一个命令行cmd窗口,订阅topic为“newone”的主题
3.3 在idea中把你的本地应用起起来,当然你可以使用main方法调用一下,我这里是为了更接近生产做测试。我的本地应用是用的SpringBoot,起起来了在地址栏输入:
http://localhost:8090/mqtt/pub?topic="newone"&msg="hi,everyone"
3.4 可以在3.2的窗口中看到收到的消息
3.5 可以再起一个命令行cmd窗口,订阅topic为“newtwo”的主题
3.6 再地址栏输入下面的内容
http://localhost:8090/mqtt/pub?topic="newone"&msg="hi,boy"
这是会在3.5的窗口中看到收到的消息,3.2的窗口不会收到消息