赞
踩
一、简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议 上,由IBM在1999年发布。
二、优点
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
三、版本
目前MQTT主流版本有两个,分别是MQTT3.1.1和MQTT5,MQTT5是完全兼容MQTT3.1.1。
实现MQTT协议需要客户端和服务器端通讯完成。在通讯过程中,MQTT协议中有三种身份 :发布者(Publish) 、代理(Broker)(服务器) 、订阅者(Subscribe) 。
其中,消息的发布者和订阅者都是客户端,消息代理是服务器。
客户端
MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。
我们把客户端发送信息的行为称为发布信息。而客户端要想从服务端收取信息,则首先要向服务端订阅信息。订阅信息这一操作很像我们在视频网站订阅某一类型电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。
服务器
MQTT 服务端通常是一台服务器,也称为“消息代理”(Broker)。位于消息发布者和订阅者之间,它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。
MQTT 服务端还负责管理 MQTT 客户端。确保客户端之间的通讯顺畅,保证 MQTT 消息得以正确接收和准确投递。
刚刚我们在讲解 MQTT 客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在 MQTT 通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个主题。MQTT 服务端在管理 MQTT 信息通讯时,就是使用主题来控制的。
从上述列子可以看出,MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。
MQTT客户端是一个个独立的个体。它们无需了解彼此的存在,依然可以实现信息交流。
MQTT客户端在通讯时必要条件是连接到了同一个MQTT通讯网络。这个网络可以是互联网或者局域网。只要客户端联网,无论在哪里,都可以实现彼此间的通讯交流。
MQTT客户端在发送和接收信息时无需同步。这一特点对物联网设备尤为重要。有时物联网设备会发生意外离线的情况。
从客户端向服务端发起 MQTT 连接请求开始,到连接中断,直到会话过期为止的消息收发序列称之为会话。
因此,会话可能仅持续一个网络连接,如果客户端能在会话过期之前重新建立了连接的话,会话也可能跨越多个网络连接存在。
一个物联网系统中有些信息非常重要,我们需要确保这类重要信息可以准确无误的发送和接收。如果有些信息在传输中丢失但是不会影响系统的运行,则相对不那么重要。
MQTT服务质量(Quality of Service 缩写 QoS)正是用于告知物联网系统,哪些信息是重要信息需要准确无误的传输,而哪些信息不那么重要,即使丢失也没有问题。
MQTT 设计了 3 个 QoS 等级:
发送端一旦发送完消息后,就完成任务了。发送端不会检查发出的消息能否被正确接收到。
在网络环境稳定的情况下,信息传输一般是不会出现问题的。但是在环境不稳定的情况下,可能会在传输过程中出现MQTT消息丢失的情况,所以适用于传输重要性较低的信息。
发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。
发送端将消息发送给接收端后,会等待接收端的确认。接收端成功接收消息后,会发送一条确认报文PUBACK给发送端。如果发送端收到了这条PUBACK确认报文,那么它就知道消息已经成功接收。
假如过了一段时间后,发送端没有收到PUBACK报文,那么发送端会再次发送消息,然后再次等待接收端的PUBACK确认报文。因此,发送端在没有收到接收端的PUBACK确认报文以前,会重复发送同一条消息。
当发送端重复发送一条消息时,PUBLISH报文中的dupFlag会被设置为True,为了告诉接收端,此消息为重复发送的消息。
MQTT协议可以确保接收端只接收一次消息。但是收发过程相对更加复杂,发送端需要接收端进行两次消息确认。因此,QoS 2最安全的服务级别,也是最慢的服务级别。此类服务等级适用于重要消息传输。
服务质量降级
对于发布和订阅消息的客户端,服务端会主动采用较低级别的QoS来实现消息传输。
室温客户端每到整点才发布一次温度信息。上一次发布时间是7:00,7点10分的时候,显示客户端的插头被碰掉了,下一次发布时间是8:00。所以,尽管显示客户端订阅了室温主题,它还要等到8:00钟才能收到最新室温消息。在8:00前的几十分钟里,显示客户端无法获知当前室温信息。
为了避免以上情况出现,可以让室温测量客户端在每次向室温主题发布消息时都使用保留消息这一模式将温度信息发布到服务端。这样无论显示客户端在任何时间订阅室温主题,都会马上收到该主题中的保留消息。
客户端在没有向服务端发送信息时,可以定时向服务端发送一条消息。这条用于心跳机制的消息也被称作心跳请求(PINGREQ)。
心跳请求的作用正是**用于告知服务端,当前客户端依然在线 **。
服务端在收到客户端的心跳请求后,会回复一条消息。这条回复消息被称作心跳响应(PINGRESP)。
心跳时间间隔
我们在开发客户端时,可以对其进行设置。
设置好心跳时间间隔后,客户端就知道多久要发送一条心跳请求给服务端。当客户端连接服务端时,会将心跳时间间隔信息放入CONNECT报文中的keepAlive。
客户端掉线
另外,在实际运行中,如果服务端没有在1.5倍心跳时间间隔内收到客户端发布消息(PUBLISH)或发来心跳请求(PINGREQ),那么服务端就会认为这个客户端已经掉线。
为了让客户端可以更好的发挥作用,便于服务端管理,MQTT 协议允许客户端在“活着”的时候就写好遗嘱,这样一旦客户端意外断线 ,服务端就可以将客户端的遗嘱公之于众。
CONNECT报文中还有两个参数:username(用户名)和 password(密码),这里的用户名和密码是客户端连接服务端时进行认证所需要的。有些 MQTT 服务端需要客户端在连接时提供用户名和密码,只有客户端正确提供了用户名和密码后,才能连接服务端,否则服务端将会拒绝客户端连接。
mqtt服务默认端口是1883,allow_anonymous 默认值是true,表示支持匿名访问
想要配置连接用户名密码,需要打开etc\plugins文件夹下面的emqx_auth_mnesia.conf文件
auth.user.1.username = admin
auth.user.1.password = public
auth.user.2.username = root
auth.user.2.password = root
保存配置之后,cmd使用命令加载配置
.\bin\emqx_ctl plugins load emqx_auth_mnesia
配置成功之后重启emq生效
ClientId是MQTT客户端的标识。MQTT服务端用该标识来识别客户端。因此ClientId必须是独立的。如果两个MQTT客户端使用相同ClientId标识,服务端会把它们当成同一个客户端来处理。通常ClientId是由一串字符所构成的,如上图所示,此示例中的clientID是“client-1”。
打开网站
1,选择版本
下载压缩包
wget https://www.emqx.com/zh/downloads/broker/4.2.14/emqx-centos7-4.2.14-x86_64.zip
2,解压
unzip -n emqx-centos7-4.2.14-x86_64.zip
cd /usr/local/emqx
./emqx/bin/emqx start
4,开放端口
/sbin/iptables -I INPUT -p tcp --dport 18083 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 1883 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8083 -j ACCEPT
admin/publish
6,在“客户端”页面可以剔除连接的客户端
限制最大连接数
vim emqx/etc/emqx.conf
## TCP Listener
listener.tcp.external = 0.0.0.0:1883
listener.tcp.external.acceptors = 2
listener.tcp.external.max_connections = 1024000
查了资料,因为Erlang有端口限制,还需要改这里 node.max_ports:
## Sets the maximum number of simultaneously existing ports for this system.
## See: http://erlang.org/doc/man/erl.html
## Value: Number [1024-134217727]
## vm.args: +Q Number
node.max_ports = 65535
emqx设置用户名和密码连接
编辑用户名/密码配置文件
vim /etc/emqx/plugins/emqx_auth_username.conf
##--------------------------------------------------------------------
## Username Authentication Plugin
##--------------------------------------------------------------------
## Examples:
auth.user.1.username = admin
auth.user.1.password = admin888
## Password hash.
##
## Value: plain | md5 | sha | sha256
auth.user.password_hash = plain #plain 表示透传
关闭匿名访问
vim /etc/emqx/emqx.conf
allow_anonymous = false
启用插件
然后就可以用mqtt工具设置用户名和密码连接了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。