【学习笔记】基于eclipse.paho的Java端mqtt发布者和订阅者实例

1 篇文章 0 订阅
1 篇文章 0 订阅

mqtt介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

特点

  1. 基于发布/订阅模型
  2. 使用二进制协议,紧凑,占用空间小
  3. 提供三种qos保障:0-最多一次,1-至少一次,2-仅一次

mqtt服务安装

mqtt服务器

比较常用的是mosquitto作为mqtt的服务器。
因公司需要搭建emqx,故本文将以emqx作为服务器,mosquitto可自行百度查阅相关文章。

emqx安装

emqx安装可直接参考官方文档emqx官方文档

基于paho的生产者实例

maven 依赖

    <dependency>
      <groupId>org.eclipse.paho</groupId>
      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
      <version>1.2.0</version>
    </dependency>

发布者实现

注:项目运行在spring环境里
发布者客户端构建

    @Bean
   public MqttClient buildMqttClient(){
       try {
           MqttClient client=new MqttClient(MqttConfig.HOST,"server11",new MemoryPersistence());
           MqttConnectOptions options = new MqttConnectOptions();
           options.setCleanSession(false);
           options.setUserName(MqttConfig.USERNAME);
           options.setPassword(MqttConfig.PASSWORD.toCharArray());
           // 设置超时时间
           options.setConnectionTimeout(10);
           // 设置会话心跳时间
           options.setKeepAliveInterval(20);
           client.setCallback(new PushCallback());
           client.connect(options);
           return client;
       } catch (MqttException e) {
           e.printStackTrace();
       }
       return null;
   }

使用

MqttTopic topic=mqttClient.getTopic("test_topic");
MqttMessage msg=new MqttMessage();
 msg.setQos(1);
 msg.setPayload(("this is test info from mqtt server\t"+LocalDateTime.now()).getBytes());
 msg.setRetained(true);
 try {
     MqttDeliveryToken token=topic.publish(msg);
     token.waitForCompletion();
     System.out.println("消息推送成功:"+LocalDateTime.now());
 } catch (MqttException e) {
     System.err.println("消息推送失败:"+LocalDateTime.now());
     e.printStackTrace();
 }

基于paho的消费者实例

maven 依赖

    <dependency>
      <groupId>org.eclipse.paho</groupId>
      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
      <version>1.2.0</version>
    </dependency>

订阅者实现

MqttClient client=new MqttClient("tcp://127.0.0.1:1883","client11",new MemoryPersistence());
MqttConnectOptions options=new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
// 设置连接的用户名
options.setUserName("admin");
// 设置连接的密码
options.setPassword("public".toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
// 设置回调
client.setCallback(new PushCallback());
//MqttTopic topic = client.getTopic(TOPIC1);
client.connect(options);
//订阅消息
int[] Qos  = {1};
String[] topic1 = {"test_topic"};
client.subscribe(topic1, Qos);
System.out.println("消息订阅:"+topic1[0]+"\n");

pushcallback

class PushCallback implements MqttCallback {

   @Override
   public void connectionLost(Throwable throwable) {
       System.out.println("连接断开");
   }

   @Override
   public void messageArrived(String s, MqttMessage msg) throws Exception {
       System.out.println("消费消息");
       System.out.println("主题:"+s);
       System.out.println("消息qos:"+msg.getQos());
       System.out.println("消息内容:"+new String(msg.getPayload())+"\n");
   }

   @Override
   public void deliveryComplete(IMqttDeliveryToken token) {
       System.out.println("deliveryComplete-----"+token.isComplete());
   }
}

注意事项

mqtt端口

mqtt默认端口如下

端口协议及作用
1883MQTT protoc port
8883MQTT/SSL port
8083MQTT/WebSocket port
8080HTTP API port
18083Dashboard Management Console Port

这里面需要注意的是8080与tomcat默认端口冲突,需要注意下。

关于qos

qos等级说明
0最多一次的传输
1至少一次的传输
2只有一次的传输
  1. 订阅和发布都可以指定qos,但最终qos是他们当中的最小值
  2. 如果qos为1,publisher发布的消息必须设置setRetained(true),这样才能保存重发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走的怪兽君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值