emqx-物联网消息服务器

EMQX指南

一、安装EMQX

1、下载

wget https://www.emqx.io/cn/downloads/broker/v4.2.2/emqx-centos7-4.2.2-x86_64.rpm

2、安装

rpm -ivh emqx-centos7-4.2.2-x86_64.rpm

3、运行

#sudo emqx start
systemctl start emqx.service

二、组建集群

1、静态集群

#集群方式:静态
cluster.discovery = static

#配置静态集群节点列表,以“,”分隔
cluster.static.seeds = emqx1@192.168.0.10,emqx2@192.168.0.20

#配置节点名
node.name = emqx1@192.168.0.10

2、组播集群

#集群方式:组播
cluster.discovery = mcast

cluster.mcast.addr = 239.192.0.1
cluster.mcast.ports = 4369,4370
cluster.mcast.iface = 0.0.0.0
cluster.mcast.ttl = 255
cluster.mcast.loop = on

#节点名
node.name = emqx1@192.168.1.162
#可以通过如下命令查看集群状态:
emqx_ctl cluster status

三、使用 Java 开发 MQTT 客户端

1、引入依赖

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

2、订阅消息

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.text.MessageFormat;

public class Subscribe {
    public static void main(String[] args) {
        String broker = "tcp://127.0.0.1:1883";
        String clientId = "JavaSample Subscribe";
        //Use the memory persistence
        MemoryPersistence persistence = new MemoryPersistence();

        try{
            MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
            MqttConnectOptions connOpts = new MqttConnectOptions();
            
            //使用用户名密码认证登陆
            //connOpts.setUserName("admin");
            //connOpts.setPassword("public".toCharArray());
            connOpts.setCleanSession(true);
            System.out.println("Connecting to broker:" + broker);
            sampleClient.connect(connOpts);
            System.out.println("Connected");

            //连接建立成功之后,可以进行主题订阅。`MqttClient` 提供了多个 `subscribe` 方法,可以实现不同方式的主题订阅。主题可以是明确的单个主题,也可以用通配符 `#` 或者 `+`。
            String topic = "demo/topics";
            System.out.println("Subscribe to topic:" + topic);
            sampleClient.subscribe(topic);

			//订阅主题后,设置一个回调实例 `MqttCallback`,在消息转发过来的时候将调用该实例的方法。
            sampleClient.setCallback(new MqttCallback() {
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    //在消息接收成功后,控制台打印转发的消息以及针对的主题。
                    String theMsg = MessageFormat.format("{0} is arrived for topic {1}.", new String(message.getPayload()), topic);
                    System.out.println(theMsg);
                }

                public void deliveryComplete(IMqttDeliveryToken token) {
                }

                public void connectionLost(Throwable throwable) {
                }
            });

        } catch(MqttException me){
            System.out.println("reason" + me.getReasonCode());
            System.out.println("msg" + me.getMessage());
            System.out.println("loc" + me.getLocalizedMessage());
            System.out.println("cause" + me.getCause());
            System.out.println("excep" + me);
            me.printStackTrace();
        }
    }
}

3、发布消息

MqttClientpublish 方法用于发布消息

  • topic:主题名称
  • MqttMessage:消息内容
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.text.MessageFormat;

public class Publish {
    public static void main(String[] args) {
        String broker = "tcp://127.0.0.1:1883";
        String clientId = "JavaSample Publish";
        //Use the memory persistence
        MemoryPersistence persistence = new MemoryPersistence();

        try {
            MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
            MqttConnectOptions connOpts = new MqttConnectOptions();
            
            //使用用户名密码认证登陆
            //connOpts.setUserName("admin");
            //connOpts.setPassword("public".toCharArray());
            connOpts.setCleanSession(true);
            System.out.println("Connecting to broker:" + broker);
            sampleClient.connect(connOpts);
            System.out.println("Connected");

            //发布消息
            String topic = "demo/topics";
            String content = "Message from MqttPublishSample";
            int qos = 2;
            System.out.println("Publishing message:" + content);
            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(qos);
            sampleClient.publish(topic, message);
            System.out.println("Message published");

        } catch (MqttException me) {
            System.out.println("reason" + me.getReasonCode());
            System.out.println("msg" + me.getMessage());
            System.out.println("loc" + me.getLocalizedMessage());
            System.out.println("cause" + me.getCause());
            System.out.println("excep" + me);
            me.printStackTrace();
        }

    }
}

四:HTTP 认证模式

1、编辑配置文件

vim /etc/emqx/plugins/emqx_auth_http.conf

#修改http认证服务器地址为自己编写的接口
#EMQX服务器接收到客户端连接后将向此接口发送请求,并根据其返回参数决定是否放行该客户端的连接请求
auth.http.auth_req = http://127.0.0.1:8080/mqtt/auth

2、重启EMQX服务器使修改后的配置文件生效

3、开启http插件(通过控制面板 或 命令行都可以)

4、编写认证接口

//http://127.0.0.1:8080/mqtt/auth
@RequestMapping("/mqtt/auth")
public Object mqttAuth(@RequestParam String clientid,
                       @RequestParam String username,
                       @RequestParam String password){

	//认证失败:返回 4xx 状态码
	//认证成功:返回 200 状态码
	//忽略认证:返回 200 状态码且消息体 ignore
}

5、使用客户端连接到emqx

下载MQTTBox:http://workswithweb.com/mqttbox.html

image-20201117144501506

新建客户端

MQTT Client Name:任意填写

Protocolmqtt / tcp

Host:emqx 服务器地址 + 默认 1883 端口:127.0.0.1:1883

UsernamePassword:在emqx服务器内新建的 user

保存并连接成功后即可新建发布或订阅

posted @   谭五月  阅读(173)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示