EMQ - 百万级开源MQTT消息服务器——安装部署及客户端调试

EMQ 的基本介绍

EMQ 2.0 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源 MQTT 消息服务器。

注解:
2.0 版本开始 emqttd 消息服务器自正式简称为 EMQ

EMQ 2.0 完整支持 MQTT V3.1/V3.1.1 版本协议规范,并扩展支持 WebSocket、Stomp、CoAP、MQTT-SN 或私有 TCP 协议。EMQ 2.0 消息服务器支持单节点100万连接与多节点分布式集群:

TODO: 2.0-rc.1 图片更新.
这里写图片描述
EMQ 2.0 为大规模客户端连接 (C1000K+) 的移动推送、移动消息、物联网、车联网、智能硬件等应用,提供一个完全开放源码、安装部署简便、企业级稳定可靠、可弹性扩展、易于定制开发的 MQTT 消息服务器。

注解
MQTT-SN、CoAP 协议已在2.0-rc.1版本发布,LWM2M、LoRaWan 协议在2.3-beta.1版本发布。

安装部署

CentOS的安装

EMQ 2.0 消息服务器每个版本会发布 Ubuntu、CentOS、FreeBSD、Mac OS X、Windows 平台程序包与 Docker 镜像。
下载地址: http://emqtt.com/downloads

RPM 包安装
系统版本 地址
CentOS6.8 http://emqtt.com/downloads/latest/centos6-rpm
CentOS7 http://emqtt.com/downloads/latest/centos7-rpm

安装包命名由平台、版本、操纵系统位数组成,例如: emqttd-centos7-v2.0_x86_64.rpm

CentOS、RedHat 操作系统下,推荐 RPM 包安装。RPM 包安装后可通过操作系统,直接管理启停 EMQ 服务。

RPM 安装
rpm -ivh emqttd-centos7-v2.1.2-1.el7.centos.x86_64.rpm

注解
Erlang/OTP R19 依赖 lksctp-tools 库

yum install lksctp-tools
配置文件

EMQ 配置文件: /etc/emqttd/emq.conf,插件配置文件: /etc/emqttd/plugins/*.conf。

日志文件

日志文件目录: /var/log/emqttd

数据文件

数据文件目录:/var/lib/emqttd/

启动停止
systemctl start|stop|restart emqttd.service

Windows 服务器安装

Windows 平台程序包下载: http://emqtt.com/downloads/latest/windows10

程序包下载解压后,打开 Windows 命令行窗口,cd 到程序目录。

控制台模式启动:

bin\emqttd console

如启动成功,会弹出控制台窗口。

关闭控制台窗口,停止emqttd进程,准备注册 Windows 服务。

警告
EMQ-2.0 暂不支持服务注册

EMQ 注册为 Windows 服务:
bin\emqttd install
EMQ 服务启动:
bin\emqttd start
EMQ 服务停止:
bin\emqttd stop
EMQ 服务卸载:
bin\emqttd uninstall

启动后再浏览器中输入控制台地址: http://127.0.0.1:18083,默认用户: admin,密码:public
这里写图片描述

参考资料:http://www.emqtt.com/docs/v2/index.html

开发测试

新建一个Maven项目,加入pom.xml文件中加入org.eclipse.paho.client.mqttv3,引入相应的镜像地址:https://repo.eclipse.org/content/repositories/paho-releases/

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

  <repositories>
        <repository>
            <id>Eclipse Paho Repo</id>
            <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
        </repository>
        ...
    </repositories>

    ...
</project>

Server 为生产者类:

package EmqttTest.emqtt;

import java.util.Scanner;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class Server {

    public static void main(String[] args) throws Exception {
        String host = "tcp://127.0.0.1:1833";
        String topic = "hello";
        String clientId = "server";// clientId不能重复
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(true);

        MqttClient client = new MqttClient(host, clientId);
        client.connect(options);

        MqttMessage message = new MqttMessage();

        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要发送的内容:");
        while (true) {
            String line = scanner.nextLine();
            message.setPayload(line.getBytes());
            client.publish(topic, message);
        }
    }

}

Client 为消费者类:

package EmqttTest.emqtt;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

public class Client {

    public static void main(String[] args) throws Exception {
        String host = "tcp://127.0.0.1:1883";
        String topic = "hello";
        String clientId = "12345";// clientId不能重复
        // 1.设置mqtt连接属性
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(true);
        // 2.实例化mqtt客户端
        MqttClient client = new MqttClient(host, clientId);
        // 3.连接
        client.connect(options);

        client.setCallback(new PushCallback());
        while (true) {
            client.subscribe(topic, 2);
        }
        // client.disconnect();
    }

}

PushCallback 为消费信息处理类:

package EmqttTest.emqtt;

import java.util.Date;

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

public class PushCallback implements MqttCallback {

    public void connectionLost(Throwable cause) {
        // 连接丢失后,一般在这里面进行重连
        System.out.println("连接断开,可以做重连,掉线时间:{}"+ new Date());
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        // System.out.println(message);
        System.out.println("接收消息主题 : " + topic);
        System.out.println("接收消息Qos : " + message.getQos());
        System.out.println("接收消息内容 : " + new String(message.getPayload()));
    }
}

这里只是提供了EMQ作为消息服务最基础(所有的的消息服务必备的生产、消费)的用法,有兴趣可以去看官方文档进行深入学习。

猜你喜欢

转载自blog.csdn.net/zx711166/article/details/81170681