可视化网关编程系列教程-----(8)MQTT设备接入与控制

可视化网关编程系列教程-----(8)MQTT设备接入与控制,第1张

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

这里我们使用轻量级 mosquitto 为例

我一般都是用这个方法安装,如果这个方法不可行,请自行百度尝试其他方案。

使用MQTT 节点就行,一个是订阅,一个是发布。如图所示

这里只做简单介绍,如果需要配置安全或者其他方面的信息,可以查看节点的信息介绍。

这样一个订阅节点就做好了。发布信息的话一样,用的是发布节点。

因为现场花园灯没有将线布置到智能控制箱,所以只能采用MQTT继电器来实现控制。

购买MQTT 继电器(淘宝买sonoff 刷 固件,也可以上闲鱼买我刷好的)

配置设备的无线网,可以看我这篇文章怎么配置 KNX无线继电器使用说明

,并且启用MQTT协议即可。

通过这一系列骚操作,成功将花园灯控制了起来。

可以自行导入测试

根据实地观察,单台mqtt服务如果并发达到5w以上,就经常出故障;在2w左右内网访问服务器就比较卡了。

注:配置是4核 16G内存,虚机。配置有点差。对CPU的消耗比较高,内存基本没啥消耗,所以建议把CPU整好点。

1目标:测试Mosquitto使用MQTT协议发消息的相关性能指标,包含发送速度,并发负载能力,资源占用,消息到达率。

2MQTT协议简介:

  1)建立长连接。客户端发起请求和服务端建立长连接,建立成功后,服务端会返回ACK(CONNACK)

  2)客户端订阅:客户端发起订阅,订阅成功后,服务端会返回ACK(SUBACK)

  3)发消息:发布者会给服务端发消息,服务端在把消息给合适的客户端。

Qos=0(服务质量):客户端消息收到后,不会发出ACK给服务端(PUBACK)。

       Qos =1:服务端会发ACK给发布者,客户端收到消息后会发ACK给服务端。

  4)取消订阅:客户端发起取消订阅,服务端返回ACK(UNSUBACK)  

  5)Pingreq&Pingresp:客户端和服务端会保持心跳。

3存在问题:

  1 如何模拟出40W的用户

  2 如何长连接,订阅,发消息,取消订阅,Pingreq行为如何实现。

4 python开源库 Mosquittopy,解决所有问题

  1 模拟40W用户

    a)可以使用虚拟机和Mosquittopy实现,具体为:一般一台虚拟机最多是6W+的模拟数据(需要修改句柄数,我使用5W),方法是Client_id可以简单的做出5W个来,然后调用Mosquitto里面的connect方法,建立长连接。准备8台虚拟机就可以实现40W客户端的模拟

  2行为的模拟

    a)订阅:Mosquittosubscribe / 发消息:Mosquittopublish / 取消订阅:Mosquittounsubscribe。 简单一句话 Mosquitto库实现所有的行为

5 指标:发送速度,到达率,并发负载,资源占用。

  a 发送速度:服务端日志记录,分析解决

  b 到达率: 1客户端记录下收到消息,分析计算。2计算服务端收到的PUBACK(客户端收到消息返回的ACK),进行计算

  c 并发负载:5W 用户不断增加,注意观察服务端的负载情况。

  e资源占用:其实主要是cpu/mem/带宽:cpu多核的话需要观察top命令下的_id字段, mem可以观察free -h命令的剩余mem, 带宽可以使用mpstat进行观察

6 可以遇见问题:

  a 模拟客户端的虚拟机需要修改句柄数才能支持5W的客户端模拟数量

  b 要先吃透MQTT协议的流程,吃透了进行测试会非常的方便

  c Clear session,设置为true则不为客户端保留休息,设置为false保留消息。其实就是客户端离线后在连接上可以收到之前推出的消息。

MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。

MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。

这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。

第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。

第二步:下载mosquitto需要的依赖

sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake

第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是151

tar xzvf mosquitto-151targz

第四步:编译

cd mosquitto-151/

make

make install

第五步:启动mosquitto

/mosquitto -v

1535473957: mosquitto version 151 starting

1535473957: Using default config

1535473957: Opening ipv4 listen socket on port 1883

1535473957: Opening ipv6 listen socket on port 1883

这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquittoconf,

启动时候加上参数 -c,

/mosquitto -c mosquittoconf

可以看到,mosquitto监听的端口为1883

这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。

先发布一个主题“home/garden/fountain/2”

内容是“hello world”

这时候在mosquitto会打印出下面的log

535474247: New connection from 1921681105 on port 1883

1535474247: New client connected from 1921681105 as MQTT_FX_Client (c1, k60)

1535474247: No will message specified

1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)

1535474307: Received PINGREQ from MQTT_FX_Client

1535474307: Sending PINGRESP to MQTT_FX_Client

1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', (12 bytes))

1535474367: Received PINGREQ from MQTT_FX_Client

1535474367: Sending PINGRESP to MQTT_FX_Client

订阅主题“home/garden/fountain/2”

可以看到收到了自己发布的消息。

用wireshark抓包

可以看到抓到了一个MQTT的publish的报文。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 可视化网关编程系列教程-----(8)MQTT设备接入与控制

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情