hivemq-mqtt-client

1 网址

MQTT BROKER
https://github.com/hivemq/hivemq-community-edition
https://github.com/mtsoleimani/cassandana
https://github.com/longkerdandy/mithqtt
https://github.com/Cicizz/jmqtt
https://github.com/Wizzercn/MqttWk


MQTT CLIENT
https://github.com/hivemq/hivemq-mqtt-client
https://hivemq.github.io/hivemq-mqtt-client/

2 MqttSender.java

package com.sunxu.mqttclient;


import com.hivemq.client.mqtt.datatypes.MqttQos;
import com.hivemq.client.mqtt.mqtt3.Mqtt3AsyncClient;
import com.hivemq.client.mqtt.mqtt3.Mqtt3BlockingClient;
import com.hivemq.client.mqtt.mqtt3.Mqtt3Client;
import com.hivemq.client.mqtt.mqtt5.Mqtt5AsyncClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5BlockingClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5Client;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

@Component
@Slf4j
public class MqttSender {

    @PostConstruct
    public void subscribe() throws InterruptedException {

        Mqtt3BlockingClient client = Mqtt3Client.builder()
                .identifier(UUID.randomUUID().toString())
                .serverHost("127.0.0.1")
                .serverPort(8885)
                .buildBlocking();

        client.connect();

        client.toAsync().subscribeWith()
                .topicFilter("test/topic")
                .qos(MqttQos.AT_LEAST_ONCE)
                .callback(publish -> {
                    System.out.println("receive topic :" + publish.getTopic() + "  message: " +
                            new String(publish.getPayloadAsBytes(), StandardCharsets.UTF_8));
                })
                .send();

        Mqtt3AsyncClient publish_client = Mqtt3Client.builder()
                .identifier(UUID.randomUUID().toString())
                .serverHost("127.0.0.1")
                .serverPort(8885)
                .buildAsync();

        for (int i=0;i<1000;i++) {
            if(i==10) break;
            final String j = String.valueOf(i);
            publish_client.connect()
                    .thenCompose(connAck -> publish_client.publishWith().topic("test/topic").payload(j.getBytes()).send())
                    .thenCompose(publishResult -> publish_client.disconnect());
            Thread.sleep(1000);
        }

        client.disconnect();
    }

}

3 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sunxu</groupId>
    <artifactId>mqttclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mqttclient</name>
    <description>mqttclient</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.hivemq</groupId>
            <artifactId>hivemq-mqtt-client</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.hivemq</groupId>
            <artifactId>hivemq-mqtt-client-websocket</artifactId>
            <version>1.3.0</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>com.hivemq</groupId>
            <artifactId>hivemq-mqtt-client-proxy</artifactId>
            <version>1.3.0</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>com.hivemq</groupId>
            <artifactId>hivemq-mqtt-client-epoll</artifactId>
            <version>1.3.0</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>com.hivemq</groupId>
            <artifactId>hivemq-mqtt-client-reactor</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.4</version>
                <configuration>

                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


import com.fasterxml.jackson.core.JsonProcessingException;
import com.hivemq.client.mqtt.MqttGlobalPublishFilter;
import com.hivemq.client.mqtt.datatypes.MqttQos;
import com.hivemq.client.mqtt.lifecycle.MqttClientConnectedContext;
import com.hivemq.client.mqtt.lifecycle.MqttClientConnectedListener;
import com.hivemq.client.mqtt.lifecycle.MqttClientDisconnectedContext;
import com.hivemq.client.mqtt.lifecycle.MqttClientDisconnectedListener;
import com.hivemq.client.mqtt.mqtt5.Mqtt5AsyncClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5BlockingClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5Client;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hivemq.client.mqtt.mqtt5.lifecycle.Mqtt5ClientConnectedContext;
import com.hivemq.client.mqtt.mqtt5.message.auth.Mqtt5SimpleAuth;
import com.hivemq.client.mqtt.mqtt5.message.connect.connack.Mqtt5ConnAck;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;

import static
import static java.nio.charset.StandardCharsets.UTF_8;


@Slf4j
@Service
public class ClientMessageDispatchService implements MessageDispatchService {
    @Autowired
    private MqttClientConfig mqttClientConfig;
    @Autowired
    private HttpAgent httpAgent;
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private ThreadPoolTaskExecutor clusterSendMessageExecutor;
    @Autowired
    private SessionManager sessionManager;

    private Mqtt5BlockingClient client;
    private Mqtt5AsyncClient asyncClient;
    private boolean registerSuccess = false;

    @Override
    public void MqttConnect() throws JsonProcessingException {

        Mqtt5SimpleAuth auth = Mqtt5SimpleAuth.builder()
                .username(mqttClientConfig.getUsername())
                .password(UTF_8.encode(mqttClientConfig.getPassword()))
                .build();

        client = Mqtt5Client.builder()
            .identifier(mqttClientConfig.getClientid())
            .serverHost(mqttClientConfig.getBrokeraddress())
            .serverPort(Integer.parseInt(mqttClientConfig.getBrokerport()))
            .sslConfig()
                .trustManagerFactory(InsecureTrustManagerFactory.INSTANCE)
                .applySslConfig()
            .addConnectedListener(new MqttClientConnectedListener() {
                @Override
                public void onConnected(MqttClientConnectedContext context) {
                    log.info("mqttclient: {} is connected",mqttClientConfig.getClientid());
                    Mqtt5ClientConnectedContext mqtt5ClientConnectedContext = (Mqtt5ClientConnectedContext) context;
                    Mqtt5ConnAck mqtt5ConnAck = mqtt5ClientConnectedContext.getConnAck();
                    boolean isSessionPresent = mqtt5ConnAck.isSessionPresent();
                    if (!isSessionPresent) {
                        log.info("【CLIENT-SUB】client: {} subscribe to topic {}:",mqttClientConfig.getClientid(),mqttClientConfig.getIntertopic());
                        asyncClient.subscribeWith()
                            .topicFilter(mqttClientConfig.getIntertopic())
                            .qos(MqttQos.AT_LEAST_ONCE)
                            .send();
                    }
                }
            })
            .addDisconnectedListener(new MqttClientDisconnectedListener() {
                @Override
                public void onDisconnected(MqttClientDisconnectedContext context) {
                    log.warn("mqttclient: {} is disconnected",mqttClientConfig.getClientid());
                    if (!registerSuccess) {
                        log.warn("mqttclient: {} registration failed",mqttClientConfig.getClientid());
                        try {
                            if (MqttRegister()) {
                                setRegisterSuccess(true);
                            }
                        } catch (JsonProcessingException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            })
            .automaticReconnectWithDefaultConfig()
                .simpleAuth(auth)
                .sslConfig()
                .trustManagerFactory(InsecureTrustManagerFactory.INSTANCE)
                .applySslConfig()
            .buildBlocking();
        asyncClient = client.toAsync();

        asyncClient.publishes(MqttGlobalPublishFilter.SUBSCRIBED, mqtt5Publish -> {
            byte[] msg = mqtt5Publish.getPayloadAsBytes();
            StoredMessage storedMessage = SerializeHelper.deserialize(msg, StoredMessage.class);

            if (storedMessage != null) {
                storedMessage.setReceiveTime(System.currentTimeMillis());
                clusterSendMessageExecutor.submit(RunnableWrapper.of(() ->
                        sessionManager.publishToLocalSubscribers(storedMessage)
                ));
            } else {
                throw new BusinessException(CG_EMPTY_MQTT_MESSAGE);
            }

        });

        client.connectWith()
            .simpleAuth(auth)
            .keepAlive(235)
            .send();
    }

    @Override
    public void MqttPublish(StoredMessage storedMessage) {
        byte[] bytedata = SerializeHelper.serialize(storedMessage);
        asyncClient.publishWith()
            .topic(mqttClientConfig.getIntertopic())
            .qos(MqttQos.AT_LEAST_ONCE)
            .payload(bytedata)
            .send();
    }

    @Override
    public boolean MqttRegister() throws JsonProcessingException {
        UspInfoDTO uspInfoDTO = UspInfoDTO.builder()
                .user(mqttClientConfig.getUsername())
                .host("localhost")
                .password(mqttClientConfig.getPassword())
                .build();
        HashMap<String, Object> params = objectMapper.readValue(objectMapper.writeValueAsString(uspInfoDTO), HashMap.class);

        String response = httpAgent.post(mqttClientConfig.getRegisterurl(), params);
        if (response.contains("successfully registered")) {
            log.info("register to msg broker success, response is {}", response);
            return true;
        }

        if(response.contains("already registered")) {
            log.info("register to msg broker success, response is {}", response);
            return true;
        }
        return false;
    }

    @Override
    public void MqttShowdown() {
        client.disconnect();
        return;
    }

    public boolean getRegisterSuccess() {
        return this.registerSuccess;
    }

    public void setRegisterSuccess(boolean registerSuccess) {
        this.registerSuccess = registerSuccess;
        return;
    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Paho-MQTT是Python中使用MQTT协议的一个库。下面是一个使用Paho-MQTT库的例子: ```python import paho.mqtt.client as mqtt # 定义回调函数,当客户端连接到服务器时调用 def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # 定义回调函数,当接收到消息时调用 def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) # 创建一个客户端实例 client = mqtt.Client() # 设置回调函数 client.on_connect = on_connect client.on_message = on_message # 连接到MQTT代理服务器 client.connect("localhost", 1883, 60) # 订阅主题 client.subscribe("test/topic") # 发布一条消息到主题 client.publish("test/topic", "Hello, world!") # 开始循环,等待接收消息 client.loop_forever() ``` 这个例子创建了一个MQTT客户端实例,连接到本地的MQTT代理服务器,订阅了一个主题,并发布了一条消息到这个主题。然后,它进入一个循环,等待接收消息。当接收到消息时,它会调用`on_message`函数来处理消息。在这个例子中,它只是简单地打印出收到的消息。 ### 回答2: paho-mqtt 是一个 Python 的 MQTT 客户端库,它提供了一种简单和方便的方法来连接和与 MQTT 代理进行通信。以下是使用 paho-mqtt 的基本步骤: 1. 安装 paho-mqtt:在终端中运行 "pip install paho-mqtt" 命令,即可安装 paho-mqtt 库。 2. 导入库:在 Python 脚本的开头,使用 "import paho.mqtt.client as mqtt" 导入 paho-mqtt 库。 3. 创建 MQTT 客户端对象:使用 "mqtt.Client()" 创建一个 MQTT 客户端对象。 4. 设置回调函数:通过设置回调函数来处理 MQTT 代理返回的消息,例如使用 "client.on_message = on_message" 将名为 "on_message" 的回调函数与客户端对象关联。 5. 连接到 MQTT 代理:使用 "client.connect(broker_address, port)" 方法连接到指定的 MQTT 代理。broker_address 是代理的 IP 地址或域名,port 是代理的端口号。 6. 订阅主题:使用 "client.subscribe(topic)" 方法订阅指定的主题。 7. 发布消息:使用 "client.publish(topic, message)" 方法发布消息到指定的主题。 8. 处理消息循环:使用 "client.loop_start()" 方法开始一个循环,在循环中持续接收和处理来自 MQTT 代理的消息。 9. 断开连接:使用 "client.loop_stop()" 方法停止消息循环,并使用 "client.disconnect()" 方法断开与 MQTT 代理的连接。 以下是一个简单的 paho-mqtt 使用示例: ``` import paho.mqtt.client as mqtt def on_message(client, userdata, message): print("Received message: " + str(message.payload.decode())) broker_address = "mqtt.eclipse.org" port = 1883 topic = "test/topic" client = mqtt.Client() client.on_message = on_message client.connect(broker_address, port) client.subscribe(topic) client.loop_start() while True: message = input("Enter message to publish: ") client.publish(topic, message) client.loop_stop() client.disconnect() ``` 上述示例演示了一个简单的 MQTT 客户端,它连接到 "mqtt.eclipse.org" 代理,订阅了名为 "test/topic" 的主题,并可以通过用户输入来发布消息。通过处理回调函数 on_message,可以在收到消息时打印出来。请注意,循环中的输入是阻塞的,可以根据实际需求进行修改。 ### 回答3: paho-mqtt是Python中用于实现MQTT(Message Queuing Telemetry Transport)协议的一个库。它提供了一种方便的方式来与MQTT代理进行通信。 要使用paho-mqtt,首先需要安装该库。可以使用pip命令来安装: ``` pip install paho-mqtt ``` 安装完成后,我们可以开始使用该库来实现MQTT通信。 首先,需要导入paho.mqtt.client模块: ```python import paho.mqtt.client as mqtt ``` 然后,我们可以创建一个MQTT客户端对象以连接到MQTT代理: ```python client = mqtt.Client() ``` 接下来,可以设置一些回调函数来处理连接、订阅和消息接收等事件。例如,可以设置on_connect回调函数来处理连接成功的事件: ```python def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.on_connect = on_connect ``` 然后,可以使用connect方法连接到MQTT代理: ```python client.connect("broker.hivemq.com", 1883, 60) ``` 要发送消息,可以使用publish方法: ```python client.publish("topic/test", "Hello, MQTT!") ``` 要订阅主题并接收消息,可以使用subscribe方法和on_message回调函数: ```python def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client.on_message = on_message client.subscribe("topic/test") ``` 最后,可以使用loop_start方法启动一个循环,以便在后台监听和处理消息: ```python client.loop_start() ``` 以上是使用paho-mqtt库实现MQTT通信的基本步骤。可以根据具体需求,来进一步设置其他回调函数和处理逻辑。使用paho-mqtt库能够很方便地实现与MQTT代理的通信和消息发布/订阅操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值