coap-emqx:使用libcoap与emqx通信

# emqx开启CoAP网关

请参考【https://blog.csdn.net/chenhz2284/article/details/139562749?spm=1001.2014.3001.5502

# 写一个emqx的客户端程序,不断地往topic【server/1】发消息

【pom.xml】

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.mqttv5.client</artifactId>
    <version>1.2.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.49</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

【MyDemo2MqttCallback.java】

package com.chz.myMqttV5.demo2;

@Slf4j
public class MyDemo2MqttCallback implements MqttCallback
{
    private String clientId;

    public MyDemo2MqttCallback(String clientId)
    {
        this.clientId = clientId;
    }

    public void connectComplete(boolean reconnect, String serverURI) {
        log.info("{}::MyMqttCallback, reconnect={}, serverURI={}", clientId, reconnect, serverURI);
    }

    public void disconnected(MqttDisconnectResponse disconnectResponse) {
        log.info("{}::disconnected, disconnectResponse={}", clientId, disconnectResponse.getReasonString());
    }

    public void deliveryComplete(IMqttToken token) {
        log.info("{}::deliveryComplete, disconnectResponse={}", clientId, token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        log.info("{}::messageArrived, topic={}, qos={}, message={}", clientId, topic, message.getQos(), new String(message.getPayload()));
    }

    public void mqttErrorOccurred(MqttException exception) {
        log.info("{}::mqttErrorOccurred, disconnectResponse={}", clientId, exception.getMessage());
    }

    public void authPacketArrived(int reasonCode, MqttProperties properties) {
        log.info("{}::authPacketArrived, reasonCode={}", clientId, reasonCode);
    }
}

【MyDemo2MqttV5Sender.java】

package com.chz.myMqttV5.demo2;

@Slf4j
public class MyDemo2MqttV5Sender {

    private static String clientId = MyDemo2MqttV5Sender.class.getSimpleName();

    public static void main(String[] args) throws InterruptedException {
        String broker = "tcp://192.168.44.228:1883";
        int subQos = 1;
        int pubQos = 1;
        String msg;

        try {
            MqttClient client = new MqttClient(broker, clientId);
            MqttConnectionOptions options = new MqttConnectionOptions();
            client.setCallback(new MyDemo2MqttCallback(clientId));
            client.connect(options);
            client.subscribe("device/#", subQos);

            for(int i=0; i<10000; i++){
                msg = "I am "+clientId+":" + i + "\r\n";
                MqttMessage message = new MqttMessage(msg.getBytes());
                message.setQos(pubQos);
                client.publish("server/1", message);
                Thread.sleep(3000L);
            }

            client.disconnect();
            client.close();

        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}

启动【MyDemo2MqttV5Sender】,每隔3秒不断地往topic【server/1】发消息。

# 下面使用libcoap对emqx进行测试

创建与emqx的连接,执行:

coap-client -m post -e "" "coap://192.168.44.228/mqtt/connection?clientid=123&username=admin&password=public"

在这里插入图片描述
注意url里面带有clientid,下面还会继续用到。
返回的那个数据是token,下面也会用到。

向emqx发送消息,执行:

coap-client -m post -e "Hi, this is libcoap" "coap://192.168.44.228/ps/device/1?clientid=123&token=3167748641"

注意url参数里面带有token,clientid也必须跟上面建立连接时候的clientid一样

在这里插入图片描述
从截图可以看到mqtt的消息订阅者接收到libcoap发出的消息了。

使用libcoap从emqx订阅消息,执行:

coap-client -m get -s 6000 -O 6,0x00 -o - -T "obstoken" "coap://192.168.44.228/ps/server/%23?clientid=123&token=3167748641"

注意订阅的主题【server/%23】是经过url编码的,编码之前的主题名是【server/#】

在这里插入图片描述
从截图可以看到消费到消息了

# 总结

从上面的测试可以看出,只要emqx安装了CoAP网关,通过CoAP协议也是可以跟emqx进行通讯,发布和订阅消息的。不过尽量使用mqtt协议比较好

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 18:20:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 18:20:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 18:20:05       87 阅读
  4. Python语言-面向对象

    2024-06-09 18:20:05       96 阅读

热门阅读

  1. SQL的入门基础教程

    2024-06-09 18:20:05       29 阅读
  2. 设计模式之策略模式

    2024-06-09 18:20:05       28 阅读
  3. 富格林:利用正规经验安全做单

    2024-06-09 18:20:05       27 阅读
  4. 《科学,无尽的前沿》—— 程序员必读

    2024-06-09 18:20:05       33 阅读
  5. 对象业务的重命名接口

    2024-06-09 18:20:05       35 阅读
  6. 简单的项目部署脚本(转载)

    2024-06-09 18:20:05       21 阅读
  7. Django按照文章ID更新文章

    2024-06-09 18:20:05       31 阅读
  8. 2903. 找出满足差值条件的下标 I

    2024-06-09 18:20:05       27 阅读
  9. 更新pip版本(在自己工程中的虚拟环境中)

    2024-06-09 18:20:05       28 阅读