目录标题

  • 一、MQTT协议介绍
  • (一)什么是MQTT
  • (二)MQTT角色组成
  • (三)三种消息发布服务质量:QoS
  • (四)消息的组成
  • (五) MQTT协议数据包结构
  • 二、安装EMQX
  • (一)安装单机版
  • (二)集群
  • 三、Websocket发布与订阅


一、MQTT协议介绍

(一)什么是MQTT

MQTT 是基于 Publish/Subscribe(发布/订阅) 模式的物联网通信协议,凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。
简单来说:MQTT是一种通讯协议,不能直接使用,如果需要使用这个协议就需要使用实现了这种协议的组件,比如:EMQX 。

推荐观看:MQTT中文文档

(二)MQTT角色组成

  1. 服务端(Broker)
    EMQX就是一个MQTT的Broker,此外还要其他的Broker如下:

到目前为止,比较流行的 MQTT Broker 有几个:
1. Eclipse Mosquitto: https://github.com/eclipse/mosquitto
使用 C 语言实现的 MQTT Broker。Eclipse 组织还还包含了大量的 MQTT 客户端项目:https://www.eclipse.org/paho/#
2. EMQX: https://github.com/emqx/emqx
使用 Erlang 语言开发的 MQTT Broker,支持许多其他 IoT 协议比如 CoAP、LwM2M 等
3. Mosca: https://github.com/mcollina/mosca
使用 Node.JS 开发的 MQTT Broker,简单易用。
4. VerneMQ: https://github.com/vernemq/vernemq
同样使用 Erlang 开发的 MQTT Broker

  1. 客户端(消费者【订阅】、生产者【发布】)
  • EMQX 通过里面的websocket 可以实现消息的发布与订阅
  • 当然我们常常会通过java代码来实现我们消息的生产者和消费者

MQTT与EMQX
MQTT属于是物联网的通信协议,在MQTT协议中有两大角色:客户端(发布者/订阅者),服务端(Mqttbroker);针对客户端和服务端需要有遵循该协议的的具体实现, EMQ/EMQ X就是MQTT Broker的一种实现。

注意:

在安装好EMQX代理服务器后,EMQX 不仅仅为我们提供了Mqtt broker,EMQX 的dashboard(一个EMQX的web界面)可以通过 websocket 这个功能实现消息的发布与订阅

EMQX 的dashboard如下:

emqtt 集群架构_bash

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

MQTT有三种消息发布服务质量:

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

(四)消息的组成

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1) Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容。
(2) payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

(五) MQTT协议数据包结构

(1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识,
连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的MQTT协议中,都必须包含固定头。
(2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其
具体内容。可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在
(3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。 与可变头一样,
在有些协议类型中有消息内容,有些协议类型中没有消息内容。

二、安装EMQX

(一)安装单机版

官方下载地址:https://www.emqx.com/zh/downloads?product=broker
官方文档:https://docs.emqx.cn/enterprise/v4.3/

注意:产品部署建议 Linux 服务器,不推荐 Windows 服务器。我们这里使用docker 进行安装

如果你不知道怎么使用docker可以参考一下内容:

  1. 搜索镜像
[root@iz2zedg4ylq9iqtwm11wecz ~]# docker search emqx
INDEX       NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/emqx/emqx                     An Open-Source, Cloud-Native, Massive-Scal...   126                  
docker.io   docker.io/emqx/emqx-ee                  EMQ X Enterprise - Cloud-Native IoT Messag...   8                    
docker.io   docker.io/emqx/emqx-edge                EMQ X Broker - Massively Scalable MQTT Mes...   2                    
docker.io   docker.io/emqx/kuiper                   A lightweight IoT edge analytics software ...   2                    
docker.io   docker.io/emqx/kuiper-manager                                                           2                    
docker.io   docker.io/emqx/edge-manager                                                             1                    
docker.io   docker.io/emqx/neuron                   Neuron - Industrial IoT Gateway Software f...   1                    
docker.io   docker.io/raymondmm/emqx                                                                1                    
docker.io   docker.io/alpine/emqx                   old versions of emqx (https://github.com/e...   0
  1. 拉取镜像
[root@iz2zedg4ylq9iqtwm11wecz ~]# docker pull docker.io/emqx/emqx
Using default tag: latest
Trying to pull repository docker.io/emqx/emqx ... 
latest: Pulling from docker.io/emqx/emqx
e519532ddf75: Pull complete 
3b27d5f517c7: Pull complete 
f859fdd14890: Pull complete 
f547136f53b1: Pull complete 
3b98da427992: Pull complete 
580d982288df: Pull complete 
d9267f25196b: Pull complete 
Digest: sha256:0f5db8f114f051a89f1d9ec4364773be853508a08c305da9e2a89844ef967086
  1. 开发端口号
    注意:如果你使用的是阿里云的服务器,那么你需要开发阿里云的端口号和服务器本机的端口号
    1883、 8083、 8883 、 8084 、 18083
Broker TCP 端口: 1883
Broker SSL 端口: 8883
emqx dashboard 需要的端口号:18083
emqx 自带的客户端端口号:8083

emqtt 集群架构_emqtt 集群架构_02


emqtt 集群架构_docker_03

  1. 运行镜像生产容器
# 先运行一个容器
[root@iz2zedg4ylq9iqtwm11wecz etc]# docker run  --name myemqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083  -d dc9ce1aa4b05
a226549fa8d75b1673904e1389e74e2f810a80f987729625a0e0137f6048bc7c
# 进入容器
[root@iz2zedg4ylq9iqtwm11wecz etc]# docker exec -it myemqx /bin/bash
bash-5.0$ pwd
/opt/emqx
bash-5.0$ ls
bin          data         erts-11.1.8  etc          lib          log          releases
bash-5.0$ cd etc/
bash-5.0$ ls
acl.conf       certs          emqx.conf      lwm2m_xml      plugins        psk.txt        ssl_dist.conf  vm.args 
bash-5.0$ pwd
/opt/emqx/etc
bash-5.0$ exit
# 将需要挂载的配置文件复制到宿主主机中
[root@iz2zedg4ylq9iqtwm11wecz conf]# pwd
/my/emqx/conf
[root@iz2zedg4ylq9iqtwm11wecz conf]# docker cp myemqx:/opt/emqx/etc .
[root@iz2zedg4ylq9iqtwm11wecz conf]# cd etc
[root@iz2zedg4ylq9iqtwm11wecz etc]# ls
acl.conf  certs  emqx.conf  lwm2m_xml  plugins  psk.txt  ssl_dist.conf  vm.args
[root@iz2zedg4ylq9iqtwm11wecz etc]# pwd
/my/emqx/conf/etc
# 删除容器
[root@iz2zedg4ylq9iqtwm11wecz conf]# docker rm myemqx -f
myemqx
# 再新建一个容器
[root@iz2zedg4ylq9iqtwm11wecz conf]# docker run  --name myemqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 -v /my/emqx/conf/etc:/opt/emqx/etc -d dc9ce1aa4b05
cc4e2017defe03705a331d0b73197079329abdc51d697972da5c4003189b8010

注意:这里目录挂载的是整个文件夹,因此需要确保,宿主主机和容器的etc目录下文件的数量和名字保持一致,也就是文件结构需要一样吗,文件写的内容可以不一样。因此,我们需要先运行一个不需要挂载目录的容器,将容器中etc目录的内容通过docker cp 复制到宿主主机中。再删除容器,最后再docker run 一个新的容器

  1. 测试
    浏览器输入:http://39.96.52.225:18083/

默认登录账号密码为:默认用户名是 admin ,密码是 public 。

emqtt 集群架构_emqtt 集群架构_04

(二)集群

可以参照官方文档进行搭建集群

三、Websocket发布与订阅

使用EMQX的Websocket实现发布与订阅消息

  1. 连接Websocket
  2. 订阅消息
  3. 发布消息
  4. 通过EMQX Broker进行收发消息