java实现简单的MQTT协议

简单实现一个MQTT协议,需要一个本地服务器
下载EMQX ,在本地安装好并运行起来,与Tomcat服务器类似,不过比Tomcat服务器安装的步骤少且简单不少。
EMQX链接
MQTT协议中文版

java实现MQTT协议需要有三个类,一个客户端类,一个服务端类,还有一个回调函数类。
第一步:创建maven工程,添加maven依赖

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

第二步:创建三个类(包名随意)
服务端类

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.util.Scanner;

public class ServiceMQTT {

    public static final String HOST = "tcp://localhost:1883";
    private String ServiceID = "ServiceFirst";
    private String topic;
    private MqttClient client;
    private MqttTopic mqttTopic;
    private MqttConnectOptions options;
    private String user = "admin";
    private String password = "public";

    private MqttMessage message;

    public ServiceMQTT() throws MqttException {
        //创建连接
        client = new MqttClient(HOST,ServiceID,new MemoryPersistence());
        options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setKeepAliveInterval(20);
        options.setConnectionTimeout(50);
        options.setUserName(user);
        options.setPassword(password.toCharArray());
        message = new MqttMessage();
    }

    public void getConnect(){
        try {
            client.setCallback(new PublishCallBack());
            client.connect(options);
            mqttTopic = client.getTopic(topic);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    public void publish(MqttTopic topic, MqttMessage message) throws MqttException {
        MqttDeliveryToken token = topic.publish(message);
        token.waitForCompletion();
        System.out.println("消息推送的状态--->"+token.isComplete());
    }


    public static void main(String[] args) throws MqttException {
        ServiceMQTT service = new ServiceMQTT();
        Scanner input = new Scanner(System.in);

        System.out.print("请输入消息的主题:");
        service.topic = input.next();

        System.out.print("请输入消息的内容:");
        String messageVal = input.next();

        service.getConnect();

        service.message.setQos(1);
        service.message.setRetained(true);
        service.message.setPayload(messageVal.getBytes());

        service.publish(service.mqttTopic,service.message);
        System.out.println("消息的保持状态:"+service.message.isRetained());
    }
}

客户端类

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.util.Scanner;

public class ClientMQTT {

    public static final String HOST = "tcp://localhost:1883";
    private static final String clientID = "clientFirst";
    private String TOPIC;
    private MqttClient client;
    private MqttConnectOptions options;
    private String user = "admin";
    private String password = "public";


    public void clientStart(){
        try {
            client = new MqttClient(HOST,clientID,new MemoryPersistence());
            options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setKeepAliveInterval(10);
            options.setConnectionTimeout(50);
            options.setUserName(user);
            options.setPassword(password.toCharArray());
            client.setCallback(new PublishCallBack());
            Scanner input = new Scanner(System.in);
            System.out.print("请输入订阅的主题:");
            TOPIC = input.next();
            MqttTopic topic = client.getTopic(TOPIC);
            //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
            options.setWill(topic,"close".getBytes(),1,true);
            client.connect(options);
            int[] Qos = {1};
            String[] topic1 = {TOPIC};
            client.subscribe(topic1,Qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws MqttException {
        ClientMQTT clientMQTT = new ClientMQTT();
        clientMQTT.clientStart();
    }
}

回调函数类

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class PublishCallBack implements MqttCallback {
    public void connectionLost(Throwable throwable) {
        //连接断掉会执行到这里
        System.out.println("连接以断,请重新连接!!!");
    }

    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        //subscribe后会执行到这里
        System.out.println("消息的主题是:"+s);
        System.out.println("消息的Qos是:"+mqttMessage.getQos());
        System.out.println("消息的ID是:"+mqttMessage.getId());
        System.out.println("消息的内容是:"+new String(mqttMessage.getPayload()));
    }

    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        //publish可以执行到这里
        System.out.println("This is deliveryComplete method----->"+iMqttDeliveryToken.isComplete());
    }
}

  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实现 MQTT 服务器,你可以使用 Eclipse Mosquitto,它是一个开源的 MQTT 消息代理软件,支持多种操作系统和编程语言,包括 Java。 以下是使用 Java 实现 MQTT 服务器的大致步骤: 1. 导入 Eclipse Paho MQTT 客户端库。 2. 创建一个 MQTT 服务器对象,并设置其监听端口。 3. 实现 MQTT 服务器的回调函数,包括连接、订阅、取消订阅和消息发布等。 4. 启动 MQTT 服务器并等待客户端连接。 5. 处理客户端发送的 MQTT 消息,并根据消息类型调用相应的回调函数。 6. 在需要的时候,关闭 MQTT 服务器。 以下是一个简单Java MQTT 服务器示例: ```java import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; public class MqttServer { private static final String BROKER_URL = "tcp://localhost:1883"; private static final String CLIENT_ID = "mqtt-server"; private MqttClient mqttClient; public void start() throws MqttException { mqttClient = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence()); mqttClient.setCallback(new MqttCallbackExtended() { @Override public void connectionLost(Throwable cause) { // 处理连接断开事件 } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理收到消息事件 } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 处理消息发送完成事件 } @Override public void connectComplete(boolean reconnect, String serverURI) { // 处理连接建立完成事件 } }); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); mqttClient.connect(connOpts); mqttClient.subscribe("test"); } public void stop() throws MqttException { mqttClient.disconnect(); mqttClient.close(); } public static void main(String[] args) throws MqttException { MqttServer mqttServer = new MqttServer(); mqttServer.start(); } } ``` 在上面的示例中,我们使用 Eclipse Paho MQTT 客户端库实现了一个简单MQTT 服务器。我们创建了一个 MqttClient 对象,并设置了回调函数来处理连接、消息等事件。在 start() 方法中,我们启动了 MQTT 服务器,并订阅了一个主题 "test"。在 stop() 方法中,我们关闭了 MQTT 服务器。 当客户端发送消息到主题 "test" 时,MqttCallbackExtended 接口中的 messageArrived() 方法会被调用,我们可以在该方法中处理收到消息的逻辑。 当然,这只是一个简单的示例,实际上,MQTT 服务器的实现可能会更加复杂,需要根据具体的需求来进行设计和开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值