基于EMQX协议的物联网设备管理平台研究与实现

发表时间:2021/4/16   来源:《基层建设》2020年第32期   作者:陈华平
[导读] 摘要:MQTT 是基于发布/订阅模式的轻量级物联网消息传输协议,凭借轻量、简单、开放、易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。EMQX 是专业支持MQTT协议,本文基于EMQX研究并实现物联网设备管理平台,可以为大量计算能力有限,工作在低宽带、不可靠的网络下的远程终端设备提供和服务器通讯、信息收集、设备控制等功能。
        天津市大数据管理中心  天津  300000
        摘要:MQTT 是基于发布/订阅模式的轻量级物联网消息传输协议,凭借轻量、简单、开放、易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。EMQX 是专业支持MQTT协议,本文基于EMQX研究并实现物联网设备管理平台,可以为大量计算能力有限,工作在低宽带、不可靠的网络下的远程终端设备提供和服务器通讯、信息收集、设备控制等功能。
        关键词:MQTT ;EMQX;物联网;终端设备
        MQTT是ISO 标准(ISO/IEC、PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件处理器和内存资源有限以及网络带宽低、不可靠的情况下而设计的发布/订阅型消息协议。EMQX则是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器,重点是专业支持MQTT协议,可以支持物联网数据的大并发数据收发。
        1 MQTT
        MQTT协议基于发布/订阅消息模式,提供一对多的消息发布方式;解除应用程序耦合;可以对负载内容屏蔽的消息传输;基于 TCP/IP 提供网络连接,保证网络可靠;开销很小,固定长度的头部是 2 字节,确保协议交换最小化,以降低网络流量;使用 Last Will 和 Testament 特性检测并通知有关各终端设备异常中断的机制。同时还提供三种消息发布服务质量:
         至多一次:由于消息发布完全依赖于底层 TCP/IP 网络,在发布消息时会发生消息丢失或重复的情况。该模式适用于,终端设备丢失一次读记录无所谓,因为不久后还会有第二次发送的情况,如间隔时间短的设备状态数据传输。
         至少一次:该模式可以确保消息到达,但由于网络的不稳定性,可能会导致消息重复,适用于一些关键的时间,如终端设备的时钟校验,可以重复传输但是不能丢的情况。
         只有一次:该模式确保消息仅到达一次。适用于类似终端设备的交易事件,消息重复或丢失会导致不正确的结果。
        2 EMQX
        EMQX可以实现高可靠、承载大规模物联网终端的MQTT连接,支持在大规模物联网设备间低延时、高可靠的消息路由。
         可靠、稳定承载大规模MQTT物联网终端MQTT连接,单服务器节点能支持百万级连接;
         支持分布式集群节点部署,快速、可靠、低延时的消息路由,单集群可支持千万级规模的路由;还可以分发设备的MQTT连接与消息到集群,利用负载均衡功能提升集群的可实用性、实现负载均衡平衡以及动态扩容。
         支持定制多种认证模式,可以通过和后端数据库设置存储订阅关系,高效存储消息到后端数据库,包括Redis、MySQL、PostgreSQL、MongoDB等;
         支持消息桥接转发,直接转发MQTT消息到RabbitMQ、Kafka等,可作为百万级物联网接入服务器;
         支持完整的物联网协议,MQTT、CoAP以及私有协议等。
         可跨平台运行在Linux、FreeBSD、Mac OS X、Windows服务器。
        3 系统搭建
 
                                          图1
        本平台负载均衡可以使用硬件负载均衡,也可以使用Nginx等软负载完成,平台所有服务器安装使用的是CentOS操作系统,Web服务器使用的中间件是Apache,数据库服务器使用的是MySQL数据库,EMQX集群则在服务上安装EMQX组件并配置即可,同时平台通过发布Web接口方式对外提供服务。平台拓扑如下:(图1)
        系统特点:
         后台服务器基于EMQX的共享订阅模式;并使用多进程池方式处理发布和订阅消息;
         后台服务器进程池和EMQX集群连接采用的是长连接方式,避免每次发布和订阅时重新连接,消耗大量资源;
         后台服务器和数据库服务器采用的也是一次连接多次使用的方式;
         平台日志功能,系统运行过程中,有完整的日志模块记录系统及设备的运行情况,便于后续产生问题时定位;
         平台告警功能,在设备运行过程中出现故障时,及时通过邮件或短信通知用户。
        4 处理过程
        设备向EMQX发布和订阅消息时,主题都需要包含设备ID,这样便于后台服务器区分设备,同时设备也能订阅到发送给自己的消息。后台服务器订阅消息时,则是用公共主题的方式实现共享订阅,发送消息时,则主题也需要包含设备ID。(图2)
 
                                              图2
        主要操作流程如下:
        设备上报消息流程:设备将主题消息发布到EMQX集群(消息2),后台服务器进程池从EMQX集群订阅公共主题消息(消息4),处理完后将结果发布给EMQX集群(消息4),设备通过订阅主题方式获取到该设备的处理结果(消息2)。需要存储消息的情况下,可以将设备消息存储在数据库里面(消息5),比如保存设备状态信息,便于后续告警处理。
        设备配置流程:用户通过管理页面下发指定设备的配置命令(消息1),后台服务器收到命令(消息3),给EMQX集群发布包含该设备ID的主题消息(消息4),设备从EMQX集群订阅到自己的消息后(消息2),根据消息进行处理,然后将处理结果以主题形式发布给EMQX集群(消息2),后台服务器进程池获取到设备主题消息(消息4),反馈给WEB页面(消息3),显示给用户(消息1)。
        设备告警处理:后台服务器通过定时任务检查设备状态(消息5),当发现设备状态异常时,通过邮件或者短信告知管理员(消息1)。
        其他流程则主要是在这三种流程上进行组合、拆分。
        $_arr_child = array();
        for ($_cnt = 0; $_cnt < $proc_num; $_cnt++) { 创建进程池
            $_pid = pcntl_fork();
            if ($_pid < 0) {
                exit;
            } elseif ($_pid) {
                $_arr_child[$_cnt] = $_pid;
        } else {
            //创建进程成功,在该进程中启动该进程的共享订阅
            }
            usleep(100000) ;
        }
        for ($_idx = 0; $_idx < count($_arr_child); $_idx++) {
            if ($_arr_child[$_idx]) {
                pcntl_waitpid($_arr_child[$_idx], $status);
            }
        }
        启动平台运行:
 
        查看后台服务器进程池
 
        查看系统运行和设备运行日志:
 
        进程池的大小基于服务器计算资源及内存空间配置,一般情况下,进程数和CPU核数按1:4配置即可。
        结论:
        该平台在实际应用中,运行稳定,可以及时处理设备消息,取得了良好的效果,但依然存在一些不足,如后台服务器进程数根据设备量自动增减、Web管理页面在设备统计、分析上展示不够友好,运行产生的大量日志没有很好的得到分析。下一步研究如何对产生的大量日志进行分析,并在实际应用中检测平台的使用效果,进一步对平台进行完善。
        参考文献:
        [1]韩丽,杨宏,卓兰,柏文彦.基于多种底层承载协议的物联网应用层协议.物联网技术,2021.
        [2]沈林涛;王凯.基于物联网技术的实验设备监控系统设计与实现.软件导刊,2021.
        [3]董志刚,宋维,周新虹.基于MQTT协议的智慧校园多传感器融合监测系统的设计与实现.信息技术与信息化,2020.
        [4]李大洲.基于大数据的用户行为日志系统设计与实现.南京邮电大学,2020.
        [5]何长鹏.基于分布式平台的实时网络日志分析系统设计.江苏科技信息,2020.
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: