探索EMQ

目标

1.安装EMQ

2.使用java发布消息到EMQ、订阅消费EMQ消息

3.常见MQTT客户端

概述

1,MQTT 介绍

(1)MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,它是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议。

(2)MQTT 具有协议简洁、小巧、可扩展性强、省流量、省电等优点,比较适合于在低带宽、不可靠的网络的进行远程传感器和控制设备通讯等,正在日益成为物联网通信协议的重要组成部分。

2,MQTT 特性

MQTT 协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

(2)对负载内容屏蔽的消息传输。

(3)使用 TCP/IP 提供网络连接。

  • 主流的 MQTT 是基于 TCP 连接进行数据推送的,但是同样有基于 UDP 的版本,叫做 MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。

(4)有三种消息发布服务质量:

  • “至多一次”:消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通 APP 的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
  • “至少一次”:确保消息到达,但消息重复可能会发生。
  • “只有一次”:确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的 APP 的推送,确保用户收到且只会收到一次。 

(5)小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

  • 这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。

3,实现方式

(1)实现 MQTT 协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT 协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中:

  • 消息的发布者和订阅者都是客户端
  • 消息代理是服务器
  • 消息发布者可以同时是订阅者

(2)MQTT 传输的消息分为:主题(Topic)和负载(payload)两部分:

  • Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  • payload:可以理解为消息的内容,是指订阅者具体要使用的内容。
 

4,MQTT 发布订阅模式简述

(1)MQTT 是发布、订阅(Publish/Subscribe) 模式的消息协议,与 HTTP 协议请求、响应(Request/Response) 模式不同。

(2)MQTT 发布者与订阅者之间通过“主题”(Topic) 进行消息路由,主题(Topic) 格式类似 Unix 文件路径,例如:

MQTT 主题(Topic) 支持’+’, ‘#’的通配符:

  • +:通配一个层级
  • #:通配多个层级(必须在末尾)

sensor/1/temperature

chat/room/subject

presence/user/feng

sensor/1/#

sensor/+/temperature

uber/drivers/joe/inbox
 

(3)发布、订阅的主题说明:

  • MQTT 消息发布者(Publisher)只能向特定“名称主题”(不支持通配符)发布消息
  • 订阅者(Subscriber)通过订阅“过滤主题”(支持通配符)来匹配消息

安装EMQ

MQTT消息中间件常见的主要有EMQX:github 4882 stars、Mosquitto:github 1645 stars、Apollo:ActiveMQ的升级版,github 109 stars。本文讲解使用较多的EMQ。

1.本文基于Centos7 x86_64

x86_64,x64,AMD64基本上是同一个东西

x86是intel开发的一种32位指令集

x86_64是一种64位的指令集,x86_64是x86指令的超集,在x86上可以运行的程序,在x86_64上也可以运行,x86_64是AMD发明的,也叫AMD64

2.按照官网 https://www.emqx.cn/downloads 安装

1. 下载 emqx-ee-centos7-4.3.1-amd64.rpmSHA256

wget -P /home https://www.emqx.cn/downloads/enterprise/v4.3.1/emqx-ee-centos7-4.3.1-amd64.rpm

-P指定下载目录

2. 安装

sudo yum install emqx-ee-centos7-4.3.1-amd64.rpm

3. 运行

sudo emqx start 

Centos 7 关闭防火墙 

1、开放EMQ服务器常用的TCP端口

firewall-cmd --permanent --add-port=1883/tcp   # 开放1883端口

firewall-cmd --permanent --add-port=18083/tcp #Dashboard 管理控制台端口

firewall-cmd --reload # 配置立即生效

1883:MQTT 协议端口 8883:MQTT/SSL 端口

8083:MQTT/WebSocket 端口 8080:HTTP API 端口 18083:Dashboard 管理控制台端口

2、查看防火墙所有开放的端口

firewall-cmd --zone=public --list-ports

3.、关闭防火墙

如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估

systemctl stop firewalld.service

4、查看防火墙状态

 firewall-cmd --state

查看 Dashboard

EMQ X Dashboard 是一个 Web 应用程序,你可以直接通过浏览器来访问它,无需安装任何其他软件。

当 EMQ X 成功运行在你的本地计算机上且 EMQ X Dashboard 被默认启用时,你可以访问 http://localhost:18083 来查看你的 Dashboard,默认用户名是 admin,密码是 public

MQTT Box

        MQTT客户端工具有很多,比如MQTT.fx,Mosquito CLI、MQTTX、MQTT Box、mqtt-spy、MQTT Lens,选择一个项目组已经使用的 MQTT Box来介绍。推荐使用MQTTX,和EMQ配套客户端程序。

        MQTT Box 是 Sathya Vikram 个人开发的 MQTT 客户端工具,最初仅在 Chrome (https://chrome.google.com/webstore/detail/mqtt-client-tcp-and-ws/kaajoficamnjijhkeomgfljpicifbkaf?utm_source=chrome-ntp-launcher) 上使用,作为浏览器拓展安装使用, 后经重写开源成为桌面端跨平台独立软件。

1.windows、mac版本下载页面打不开 使用Chrome插件方式

2.Menu---MQTT CLIENTS 新建MQTT客户端

EMQ服务器默认的用户名/密码 admin/public

默认的TCP连接端口为1883

3.发布、订阅主题实现消息通信

发布的主题名字随意,只要订阅者订阅相同名字主题即可实现消费

Java发布、订阅EMQ

通过 Maven 安装 Paho Java

通过包管理工具 Maven 可以方便地安装 Paho Java 客户端库,截止目前最新版本安装如下:

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

Paho Java 使用示例

Java 体系中 Paho Java 是比较稳定、广泛应用的 MQTT 客户端库,本示例包含 Java 语言的 Paho Java 连接 EMQ X Broker,并进行消息收发完整代码:

App.java

package io.emqx;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;


public class App {
    public static void main(String[] args) {
        String subTopic = "testtopic/#";
        String pubTopic = "testtopic/1";
        String content = "Hello World";
        int qos = 2;
        # emqx官方服务器
        String broker = "tcp://broker.emqx.io:1883";
        String clientId = "emqx_test";
        MemoryPersistence persistence = new MemoryPersistence();

        try {
            MqttClient client = new MqttClient(broker, clientId, persistence);

            // MQTT 连接选项
            MqttConnectOptions connOpts = new MqttConnectOptions();
            connOpts.setUserName("emqx_test");
            connOpts.setPassword("emqx_test_password".toCharArray());
            // 保留会话
            connOpts.setCleanSession(true);

            // 设置回调
            client.setCallback(new OnMessageCallback());

            // 建立连接
            System.out.println("Connecting to broker: " + broker);
            client.connect(connOpts);

            System.out.println("Connected");
            System.out.println("Publishing message: " + content);

            // 订阅
            client.subscribe(subTopic);

            // 消息发布所需参数
            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(qos);
            client.publish(pubTopic, message);
            System.out.println("Message published");

            client.disconnect();
            System.out.println("Disconnected");
            client.close();
            System.exit(0);
        } 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();
        }
    }
}

回调消息处理类 OnMessageCallback.java

package io.emqx;

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

public class OnMessageCallback implements MqttCallback {
    public void connectionLost(Throwable cause) {
        // 连接丢失后,一般在这里面进行重连
        System.out.println("连接断开,可以做重连");
    }

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

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

内参资料

MQTT系列教程1(基本概念介绍)https://www.hangge.com/blog/cache/detail_2347.html

MQTT系列教程2(消息服务器EMQ的搭建和使用)https://www.hangge.com/blog/cache/detail_2348.html#

MQTT系列教程3(客户端工具MQTTBox的安装和使用)https://www.hangge.com/blog/cache/detail_2350.html

MQTT 客户端工具 https://segmentfault.com/a/1190000021106683

常见MQTT服务器搭建与试用  https://www.jianshu.com/p/e5cf0c1fd55c

中文官网资料

EMQ X Broker https://www.emqx.cn/products/broker

MQTT Java 客户端库  https://docs.emqx.cn/broker/v4.3/development/java.html#%E9%80%9A%E8%BF%87-maven-%E5%AE%89%E8%A3%85-paho-java

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fang·up·ad

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

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

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

打赏作者

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

抵扣说明:

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

余额充值