MQTT发布订阅程序完整代码

  1. 工具类,包含有发布者方法和订阅者方法。
    package cn.com.bonc.wholeCode;
    
    import org.eclipse.paho.client.mqttv3.*;
    import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
    
    import java.util.UUID;
    
    /**
     * mqtt的发布和订阅
     *
     * @author wzq
     */
    public class PublishSubscribe {
    
    
        private static String serviceURI = "tcp://172.16.22.160:1883";
        private static String clientID = UUID.randomUUID().toString();
        private static MqttClientPersistence persistence = new MemoryPersistence();
        //如果mqtt服务配置了匿名访问,则不需要使用用户名和密码就可以实现消息的订阅和发布
    //    private static String username = "username";
    //    private static String password = "password";
        private static String topic = "cebPark";
        /*
            消息服务质量,一共有三个:
            0:尽力而为。消息可能会丢,但绝不会重复传输
            1:消息绝不会丢,但可能会重复传输
            2:恰好一次。每条消息肯定会被传输一次且仅传输一次
         */
        private static int qos = 0;
    
        /**
         * 消息发布
         *
         * @author wzq
         **/
        public static void publish() {
            try {
                MqttClient client = new MqttClient(serviceURI, clientID, persistence);
                MqttConnectOptions connectOptions = new MqttConnectOptions();
    //            connectOptions.setUserName(username);
    //            connectOptions.setPassword(password.toCharArray());
                connectOptions.setCleanSession(false);
                //发布者连接服务
                client.connect(connectOptions);
                System.out.println("发布者连接状态: " + client.isConnected());
                MqttTopic mqttTopic = client.getTopic(topic);
                //MqttMessage mqttMessage = new MqttMessage(message.getBytes());
                MqttMessage mqttMessage = new MqttMessage();
                mqttMessage.setQos(qos);
                int i = 1;
                String message = "hello,智能公厕-";
                while (true) {
                    String payLoad = message + i++;
                    mqttMessage.setPayload(payLoad.getBytes());
                    MqttDeliveryToken deliveryToken = mqttTopic.publish(mqttMessage);
                    if (!deliveryToken.isComplete()) {
                        System.out.println("发布者发布消息: " + payLoad + " 失败");
                        deliveryToken.waitForCompletion();
                    } else {
                        System.out.println("发布者发布消息: " + payLoad + " 成功");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 消息订阅
         *
         * @author wzq
         **/
        public static void subscribe() {
            try {
                MqttClient client = new MqttClient(serviceURI, clientID, persistence);
                client.setCallback(new MqttCallback() {
                    @Override
                    public void connectionLost(Throwable cause) {
                        System.out.println("订阅者连接丢失...");
                        System.out.println(cause.getMessage());
                    }
    
                    @Override
                    public void messageArrived(String topic, MqttMessage message) {
                        System.out.println("订阅者接收到消息: " + message.toString());
                    }
    
                    @Override
                    public void deliveryComplete(IMqttDeliveryToken token) {
                    }
                });
                MqttConnectOptions connectOptions = new MqttConnectOptions();
    //            connectOptions.setUserName(username);
    //            connectOptions.setPassword(password.toCharArray());
                connectOptions.setCleanSession(false);
                //订阅者连接订阅主题
                client.connect(connectOptions);
                client.subscribe(topic, qos);
                System.out.println("订阅者连接状态: " + client.isConnected());
            } catch (MqttException e) {
                e.printStackTrace();
            }
    
        }
    
    
    }
    
  2. 发布者
    package cn.com.bonc.wholeCode;
    
    /**
     * mqtt发布
     * @author: wzq
     * @time: 2018-07-27 16:43
     */
    public class Publish {
        public static void main(String[] args) {
            PublishSubscribe.publish();
        }
    }
    
  3. 订阅者
    package cn.com.bonc.wholeCode;
    
    /**
     * mqtt订阅
     * @author: wzq
     * @time: 2018-07-27 16:43
     */
    public class Subscribe {
        public static void main(String[] args) {
            PublishSubscribe.subscribe();
        }
    }
    

 

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
在C语言中使用MQTT协议进行发布/订阅操作的步骤如下: 1. 安装MQTT C语言客户端库,例如Eclipse Paho或MQTT-C。 2. 创建MQTT客户端,并设置连接参数,例如服务器地址、端口、客户端ID等。 3. 连接MQTT服务器。 4. 订阅主题,可以使用subscribe函数。 5. 发布消息,可以使用publish函数。 6. 处理接收到的消息,可以使用回调函数on_message。 以下是一个使用MQTT-C库进行发布/订阅操作的简单示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #define ADDRESS "tcp://localhost:1883" #define CLIENTID "ExampleClientSub" #define TOPIC "test" #define QOS 1 #define TIMEOUT 10000L volatile MQTTClient_deliveryToken deliveredtoken; void delivered(void *context, MQTTClient_deliveryToken dt) { printf("Message with token value %d delivery confirmed\n", dt); deliveredtoken = dt; } int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("Message arrived\n"); printf(" topic: %s\n", topicName); printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } void connlost(void *context, char *cause) { printf("\nConnection lost\n"); printf(" cause: %s\n", cause); } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_deliveryToken token; int rc; MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(-1); } printf("Connected to MQTT broker at %s\n", ADDRESS); if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS) { printf("Failed to subscribe to topic %s, return code %d\n", TOPIC, rc); exit(-1); } printf("Subscribed to topic %s\n", TOPIC); pubmsg.payload = "Hello, world!"; pubmsg.payloadlen = strlen(pubmsg.payload); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); printf("Message sent with delivery token %d\n", token); MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered); while (1) { MQTTClient_yield(); } MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } ``` 这个示例代码实现了一个MQTT客户端,它连接到本地的MQTT服务器(地址为tcp://localhost:1883),订阅主题为test,并发布一条消息(内容为“Hello, world!”)。在程序运行过程中,它会不断接收和处理从MQTT服务器上收到的消息。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第一片心意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值