MQTT-Client-fusesource源码(pub/sub)

本文提供了一个使用Java实现的FuseSource MQTT客户端示例,包括如何发布和订阅消息。通过代码展示了如何连接到MQTT代理,设置客户端参数,发布消息至指定主题,以及如何订阅并接收消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大佬写的,看的懵懵懂懂,记录下来收藏

1、publish发布主题发布消息

package jmh.fusesource;

import java.net.URISyntaxException;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.FutureConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.QoS;

public class FuseSourceMQTT {
  private static int qos = 2; //只有一次
  private static String broker = "tcp://192.168.0.103:1883";
  private static String userName = "fusepub";
  private static String passWord = "fusepub";


  public static BlockingConnection connect(String clientId,String userName,
      String password) throws MqttException, URISyntaxException {
    MQTT mqttClient = create(clientId, userName, password);
    BlockingConnection bc = mqttClient.blockingConnection();
    try {
      bc.connect();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return bc;

  }

  public static MQTT create(String clientId, String userName, String password)
      throws URISyntaxException {
    MQTT mqttClient = new MQTT();
    mqttClient.setHost(broker);
    mqttClient.setClientId(clientId);
    mqttClient.setCleanSession(true);
    mqttClient.setVersion("3.1.1");
    mqttClient.setKeepAlive((short) 20);
    mqttClient.setUserName(userName);
    mqttClient.setPassword(password);
    mqttClient.setConnectAttemptsMax(10);
    return mqttClient;
  }

  public static FutureConnection asyncConnect(String clientId,String userName,
      String password) throws MqttException, URISyntaxException {
    MQTT mqttClient = create(clientId, userName, password);
    FutureConnection fc = mqttClient.futureConnection();
    fc.connect();

    return fc;

  }
  private static void publish(String message_content, String clientId, String topic)
      throws Exception {
    connect(clientId,userName,passWord).publish(topic,message_content.getBytes("UTF-8"),
        QoS.EXACTLY_ONCE,true);
  }


  public static void main(String[] args) throws Exception {
//    publish("message content","fusesource-client-1","jmh/fusesource/blocking/retain");
    asyncConnect("fusesource-async-client-1","fuse-pub","fuse-pub").publish(
        "jmh/fusesource/future/retain","message content2".getBytes(),QoS.EXACTLY_ONCE,true)
    ;
    Thread.sleep(50000);
  }


}

2、subscribe订阅主题接收消息

package jmh.fusesource;

import java.io.UnsupportedEncodingException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.fusesource.mqtt.client.Callback;
import org.fusesource.mqtt.client.Future;
import org.fusesource.mqtt.client.FutureConnection;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;

public class FuseSourceSubMsg {
  private static AtomicInteger count = new AtomicInteger();
  private static AtomicLong preTimestamp = new AtomicLong();
  public static void main(String[] args) throws Exception {
//    publish("message content","fusesource-client-1","jmh/fusesource/blocking/retain");
    FutureConnection fc = FuseSourceMQTT
        .asyncConnect("fusesource-async-client-2", "fusesub", "fusesub");

    fc.subscribe(new Topic[]{
        new Topic("jmh/fusesource/future/retain", QoS.AT_MOST_ONCE)
    }).then(new Callback<byte[]>() {
      public void onSuccess(byte[] bytes) {
        try {
          System.out.println("sub :" + new String(bytes, "utf-8"));
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }
      }

      public void onFailure(Throwable throwable) {

      }
    });
    Future[] futureRecv = new Future[1];


    recv(fc,futureRecv);
    Thread.sleep(500000);
  }

  private static void recv(FutureConnection fc,final Future<Message>[] messageFutures) {
    messageFutures[0] = fc.receive();
    messageFutures[0].then(new Callback<Message>() {
      public void onSuccess(Message message) {
        try {
       //   System.out.println("recv :" + new String(message.getPayload(), "utf-8"));
          int c = count.incrementAndGet();

          if(c%10000==0){
            long ts = System.currentTimeMillis();
            if(preTimestamp.get()==0L){
              System.out.println("time:"+ts+" count:"+c);
              preTimestamp.set(ts);
            }
            else{
              long offset = ts - preTimestamp.get();
              System.out.println("time:"+ts+" offset: "+offset+" count:"+c);
              preTimestamp.set(ts);
            }

          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        recv(fc, messageFutures);
      }

      public void onFailure(Throwable throwable) {
        recv(fc, messageFutures);
      }
    });
  }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值