使用eclipse paho在java端实现MQTT消息的收发(客户端与服务端实例)

一、MQTT(消息队列)简介

MQTT(MQ Telemetry Transport)是IBM开发的一种网络应用层的协议,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。
常用的有eclipse paho、activeMQ、阿里MQTT和其他的实现,本实例使用paho

1、使用场景:

1、不可靠、网络带宽小的网络
2、运行的设备CPU、内存非常有限
(我个人主要是用在服务端与嵌入式客户端进行消息和广告的通信)

2、特点:

1、基于发布/订阅模型的协议
2、他是二进制协议,二进制的特点就是紧凑、占用空间小。他的协议头只有2个字节
3、提供了三种消息可能性保障(Qos):0:最多一次 、1:最少一次 、2:只有一次

3、关键字

1、HOST:搭载MQTT的服务器地址
2、TOPIC:消息主题,可以被客户端订阅,实现对应消息的收发
3、clientId:客户端ID,用于服务器对不同客户端的识别
4、subscribe/unsubscribe:客户端对消息主题的订阅和取消订阅
5、Qos:消息的服务质量,当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃
6、Callback:当客户端收到消息后对消息的处理(回调)
7、KeepAliveInterval:客户端与服务器之间的连接是通过发送心跳包来保持存活

二、JAVA端实例

首先导入所依赖jar包

1、服务端代码(负责消息的发送)

package com.sc.util.paho;

import org.eclipse.paho.client.mqttv3.MqttClient;  
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;  
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;  
import org.eclipse.paho.client.mqttv3.MqttException;  
import org.eclipse.paho.client.mqttv3.MqttMessage;  
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;  
import org.eclipse.paho.client.mqttv3.MqttTopic;  
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
/** 
 * Title:Server 这是发送消息的服务端
 * Description: 服务器向多个客户端推送主题,即不同客户端可向服务器订阅相同主题 
 * @author rao
 */  
public class ServerMQTT {
     

    //tcp://MQTT安装的服务器地址:MQTT定义的端口号  
    public static final String HOST = "tcp://dev.****.com.cn:1883";  
    //定义一个主题  
    public static final String TOPIC = "pos_message_all";  
    //定义MQTT的ID,可以在MQTT服务配置中指定  
    private static final String clientid = "server11";  

    private MqttClient client;  
    private MqttTopic topic11;  
    private String userName = "paho";  //非必须
    private String passWord = "";  //非必须

    private MqttMessage message;  

    /** 
     * 构造函数 
     * @throws MqttException 
     */  
    public ServerMQTT() 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);  

            topic11 = client.getTopic(TOPIC);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

    /** 
     * 
     * @param topic 
     * @param message 
     * @throws MqttPersistenceException 
     * @throws MqttException 
     */  
    public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException,  
            MqttException {  
        MqttDeliveryToken token = topic.publish(message);  
        token.waitForCompletion();  
        System.out.println("message is published completely! "  
                + token.isComplete());  
    }  

    /** 
     *  启动入口 
     * @param args 
     * @throws MqttException 
     */  
    public static void main(String[] args) throws MqttException {  
        ServerMQTT server = new ServerMQTT();  

        server.message = new MqttMessage();  
        server.message.setQos(1);  //保证消息能到达一次
        server.message.setRetained(true);  
        server.message.setPayload("这是推送消息的内容".getBytes());  
        server.publish(server.topic11 , server.message);  
        System.out.println(server.message.isRetained() + "------ratained状态");  
    }  
}  
  • 15
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
您可以使用 Eclipse Paho 提供的 Java 客户库来编写 MQTT 客户服务。以下是使用 Eclipse Paho 的示例代码: 客户: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttClientSample { public static void main(String[] args) { String broker = "tcp://localhost:1883"; String clientId = "JavaSample"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient mqttClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); mqttClient.connect(connOpts); System.out.println("Connected"); String topic = "test"; String content = "Hello World"; int qos = 2; System.out.println("Publishing message: " + content); MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(qos); mqttClient.publish(topic, message); System.out.println("Message published"); mqttClient.disconnect(); System.out.println("Disconnected"); System.exit(0); } catch (MqttException e) { System.out.println("Reason: " + e.getReasonCode()); System.out.println("Message: " + e.getMessage()); System.out.println("Loc: " + e.getLocalizedMessage()); System.out.println("Cause: " + e.getCause()); System.out.println("Excep: " + e); e.printStackTrace(); } } } ``` 服务: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttServerSample { public static void main(String[] args) { String broker = "tcp://localhost:1883"; String clientId = "JavaServer"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient mqttClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); mqttClient.connect(connOpts); System.out.println("Connected"); mqttClient.setCallback(new MqttCallback() { public void connectionLost(Throwable cause) { System.out.println("Connection lost"); } public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println("Message received: " + new String(message.getPayload())); } public void deliveryComplete(IMqttDeliveryToken token) { System.out.println("Delivery complete"); } }); mqttClient.subscribe("test"); System.out.println("Subscribed to topic: test"); while (true) { // do nothing } } catch (MqttException e) { System.out.println("Reason: " + e.getReasonCode()); System.out.println("Message: " + e.getMessage()); System.out.println("Loc: " + e.getLocalizedMessage()); System.out.println("Cause: " + e.getCause()); System.out.println("Excep: " + e); e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值