Java 连接 MQTT 服务器

可用方案

方案描述GitHub链接
mqtt-client由 Red Hat 子公司 FuseSource 开发mqtt-client
paho.mqtt由独立的非营利性公司 Eclipse Foundation 开发paho.mqtt

Maven 依赖

        <!--paho.mqtt-->
        <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--mqtt-client-->
        <dependency>
            <groupId>org.fusesource.mqtt-client</groupId>
            <artifactId>mqtt-client</artifactId>
            <version>1.14</version>
        </dependency>

样例

公共配置文件

public class Config {
    private String ac;
    private String pw;
    private String topic;
    private String clientId;
    private String host;

    public Config() {
    }

    public void init(){
        this.ac="XX";
        this.pw="XX";
        this.topic="XX";
        this.clientId="XXXX";
        this.host="tcp://XXXX:1883";
    }

    public String getAc() {
        return ac;
    }

    public void setAc(String ac) {
        this.ac = ac;
    }

    public String getPw() {
        return pw;
    }

    public void setPw(String pw) {
        this.pw = pw;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }
}

paho.mqtt

    public static void main(String[] args) throws MqttException, InterruptedException {
        Config config = new Config();
        config.init();
        MemoryPersistence persistence = new MemoryPersistence();

        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName(config.getAc());
        options.setPassword(config.getPw().toCharArray());
        options.setCleanSession(true);
        options.setConnectionTimeout(10);


        MqttClient client = new MqttClient(config.getHost(), config.getClientId(), persistence);
        client.setCallback(new DeviceMqttCallback(config.getAc()));
        client.connect(options);
        client.subscribe(config.getTopic());

//        MqttTopic topic = client.getTopic(config.getTopic());
//        MqttMessage message = new MqttMessage(new byte[0]);// 清空之前的 retain 消息
//        message.setRetained(true);
//        topic.publish(message);

        Thread.sleep(2000);
        client.disconnect();
        client.close();
    }

回调类

public class DeviceMqttCallback implements MqttCallback {

    public DeviceMqttCallback() {
    }

    @Override
    public void connectionLost(Throwable cause) {
        System.out.println("connectionLost:" + cause.getMessage());
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        System.out.println("receive: [topic]:" + topic + "  [msg]:" + message.toString());
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("[isComplete]:" + token.isComplete() + "       " + token.getTopics());
    }
}

mqtt-client

    public static void main(String[] args) throws URISyntaxException, InterruptedException {
        Config config = new Config();
        config.init();

        MQTT mqtt = new MQTT();
        mqtt.setHost(config.getHost());
        mqtt.setClientId(UUID.randomUUID().toString().replace("-",""));
        mqtt.setUserName(config.getAc());
        mqtt.setPassword(config.getPw());
        mqtt.setClientId(config.getClientId());
        CallbackConnection connection = mqtt.callbackConnection();
        connection.connect(new Callback<Void>() {
            @Override
            public void onSuccess(Void value) {
                System.out.println("连接成功");
                Topic topic = new Topic(config.getTopic(), QoS.AT_MOST_ONCE);
                connection.subscribe(new Topic[]{topic}, new Callback<byte[]>() {
                    @Override
                    public void onSuccess(byte[] value) {
                        System.out.println("订阅成功");
                    }

                    @Override
                    public void onFailure(Throwable value) {
                        System.out.println("订阅失败");
                    }
                });
            }

            @Override
            public void onFailure(Throwable value) {
                System.out.println("连接失败");
                value.printStackTrace();
            }
        });
        connection.listener(new DeviceMsgListener());
        Thread.sleep(1000 * 10);// 防止瞬间主线程关闭导致连接被关闭
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用Eclipse Paho MQTT客户端库来实现Java连接MQTT服务器。 以下是使用gradle构建的示例代码: 1. 在build.gradle文件中添加以下依赖项: ``` dependencies { implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.3' } ``` 2. 编写Java代码: ```java import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttClientExample { public static void main(String[] args) { String broker = "tcp://mqtt.eclipse.org:1883"; String clientId = "JavaMqttClient"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient client = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); client.connect(connOpts); System.out.println("Connected"); // 订阅主题 String topic = "test/topic"; int qos = 2; System.out.println("Subscribing to topic: " + topic); client.subscribe(topic, qos); System.out.println("Subscribed"); // 发布消息 String content = "Hello from Java MQTT client"; System.out.println("Publishing message: " + content); client.publish(topic, content.getBytes(), qos); // 断开连接 client.disconnect(); System.out.println("Disconnected"); } catch (MqttException e) { System.out.println("Exception: " + e.getMessage()); e.printStackTrace(); } } } ``` 此代码创建一个MqttClient实例并连接到指定的MQTT服务器。它还订阅一个主题并发布一条消息。在使用时,请更改broker和topic变量以适应您的环境。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值