APP下载

基于消息队列遥测传输协议的灌溉系统

2020-05-07康云川李若枫

科学技术与工程 2020年8期
关键词:报头消息报加密

康云川, 钟 静*, 李若枫

(1.重庆三峡学院计算机科学与工程学院,重庆 404120;2.物联网与智能控制技术重庆市工程研究中心,重庆 404120)

近年来,农业智能化在人类社会中的地位逐年提高。随着物联网与传感器技术的不断完善,农业智能化的手段越来越丰富。如今,数据实时监测与设施设备的远程控制不管在科学层面还是经济层面,对推动农业的发展都具有重要意义[1]。因此,数据传输的实时性与安全性尤为重要,特别是对实时性要求较高的农作物精准化灌溉作业,需要保证消息推送的实时性与准确性、网络下发设施设备操作指令的可靠性与安全性。虽然目前有多种消息推送方式,最主要的有Polling 、SMS Push、IP Push等,但都存在一些的问题,例如服务受限、需要收费、安全漏洞、个性化智能推送不足等,其中,网络与信息安全问题较为明显,因大多数系统在互联网上透明运行,任何人只需知道消息服务器 IP地址和端口就可以连接运行,而消息传输过程中也未进行加密与校验,导致面临消息被窃取、被恶意篡改等威胁[2]。有些系统虽然增加了用户名、密码等身份鉴别,但这些信息很容易被暴力猜解,很难保证消息可靠安全的传输[3]。并且目前物联网硬件控制单元与客户端的通信方式大多数是基于超文本传输协议(hyper text transfer protocol,HTTP),实现与服务器中转间接通信,这些协议在物联网应用中存在网络资源消耗大、传输时延高、数据包丢失、稳定性低、安全性差等问题[4]。

针对以上问题,以作物智能灌溉系统为例,提出一种基于消息队列遥测传输(message queuing telemetry transport,MQTT)协议,并对消息进行加密与校验的设备联网的方案。利用该方案使用NodeMCU、土壤墒情传感器、无线网络、MQTT代理服务器和全球广域网(world wide web,WEB)技术构建一个高效安全的智能灌溉系统,用户根据作物生长所需含水量,精确控制土壤水分,保证作物生长,同时避免灌溉水资源的浪费。

1 系统总体设计

系统总体结构如图1所示。目前大多数物联网硬件微控制器采用STM32、51、AVR等传统单片机,开发人员需要熟悉单片机寄存器知识,还需要熟悉常用的开发语言,由于技术门槛很高,开发难度大[5]。为了使系统开发便捷、容易、高效,系统硬件主要使用NodeMCU微控制器、DHT11温湿度传感器、电容式土壤湿度传感器、HC-SR04超声测距传感器等,采用MQTT协议的通信方法来实现客户端与微控制器的交互,消息与应用服务器端基于AliYun平台、Mosquitto、LNMP(Linux、Nginx、MySQL、PHP)平台构建,消息通知软件采用阿里钉钉客户端软件。

图1 系统总体结构Fig.1 System overall structure

系统主要功能如下。

(1)数据采集。传感器采集空气温湿度、作物土壤墒情、灌溉系统蓄水容器水位等数据。

(2)消息订阅与发布。NodeMCU微控制器向用户终端发布消息,获取所订阅消息主题的指令,在整个消息发布与订阅传输过程中,将对消息报文进行加签与验签;在消息发布时根据私钥对协议有效载荷负载内容数据进行加密传输。

(3)实时监测与控制。灌溉系统蓄水容器水位不足或数据出现异常时,用户的阿里钉钉作为用户的消息通知软件,实时接收服务器推送的警告信息;用户也可通过软件终端对数据进行实时监测,对灌溉水泵进行远程控制。

(4)通信失效保护。当用户使用终端软件进行作物灌溉时,服务器会自动检测网络状态,如果服务器与网络通信中断,服务器会识别并自动发送停止命令给NodeMCU微控制单元,避免作物一直处于被浇灌状态;在系统程序设置蓄水位最低安全阈值,当水位低于某个阈值时水泵停止工作,同时用户消息通知软件将会收到告警信息。

2 MQTT协议改进

MQTT协议由IBM公司提出,最初用于远程医疗服务通信,该协议基于TCP/IP协议栈,是一种异步通信的轻量级消息发布/订阅传输协议,由于其开销小、时延低、可靠性高等优点,在时间和空间上,将消息发送者与接受者分离,可以在不可靠的网络环境中进行扩展,适用于硬件性能低下的远程设备以及不可靠网络的环境,在物联网中得到了广泛的应用[6]。

MQTT协议的消息报文最多由3个部分组成:固定报头、可变报头和有效载荷。

(1)固定报头。MessageType:表示14 种消息类型;Dup Flag:当客户端或服务端试图重新传送 PUBLISH、PUBREL、SUBSCRIBE或UNSUBSCRIBE命令消息时设置此标志;QoSlevel:服务质量级别。

(2)可变报头。报头位于固定报头和有效载荷之间,不同报文的可变报头是不同的。可变报头主要包括 Protocol name、Protocol version、Clean session、Will 标志等头域。

(3)有效载荷。载荷位于报文最后一部分,其负载内容有需要发布的消息,如PUBLISH。

MQTT协议通过控制服务质量(quality of service,QoS)等级来确定服务质量,消息在传输过程中由QoS的值来决定安全级别,但协议本身并没有提供消息加签、验签与加密的功能,数据以明文传输方式[7]。MQTT协议消息发布抓包如图2所示。

图2 MQTT协议消息发布抓包Fig.2 MQTT protocol message release capture

根据图2中Wireshark抓包工具可分析出消息的报文标记、类型、长度、主题、内容等信息,并且消息报文在传输过程中,MQTT协议已明文方式传输数据,报文也未进行加签处理。因此,MQTT协议在推送数据的过程中可能面临数据被恶意篡改或非法窃取的风险。结合MQTT通信协议的报文特征与数据推送的安全要求,提出一种协议的安全改进方案,改进后的协议传输流程如图3所示。

图3 改进后的协议传输流程Fig.3 Improved protocol transport flow

2.1 有效载荷负载内容加密传输

消息报文在传输过程中,有效载荷负载内容存在被非法窃取的风险。加密过程在数据推送前完成,加密时需要一个私钥“PrivateEncryption”来生成密文,PrivateEncryption是一个由用户随机生成的32位的字符串,图4展示了有效载荷负载内容加密与解密过程,其主要步骤有:第1步,将发送端传输的消息报文的载荷内容根据用户的PrivateEncryption进行AES算法加密,以密文方式传输;第2步,消息接收端根据用户的PrivateEncryption对载荷内容密文解密,还原原始负载内容。

图4 有效载荷负载内容加密与解密Fig.4 Payload content encryption and decryption

2.2 消息报文加签与验签

加签的过程是在MQTT消息报文形成之后,消息推送之前。加签时需要2.1节内容所用的私钥“PrivateEncryption”来生成验签。图5所示为消息报文加签的流程,其主要步骤有:第1步,将需要推送的消息报文“S”与PrivateEncryption组合,形成新的字符串“SP”;第2步,将新的字符串“SP”进行MD5算法加密,生成一个128位的数字签名“MD5(SP)”;第3步,将生成的数字签名“MD5(SP)”添加到报尾,组合为新的消息报文“SMD5(SP)”;最后修改MQTT报文的固定头部分,调整RemainLength,以适应报文总长度变化。

图5 消息报文加签Fig.5 Message signature

图6 消息报文验签Fig.6 Message check

图6所示为消息报文验签过程,主要有以下4个步骤:第1步,提取消息报文“SMD5(SP)”的最后128位“MD5(SP)”,作为原始验签,剩余部分为原始消息报文“OS”;第2步,将“OS” 与PrivateEncryption组合,形成新的字符串“SP2”;第3步,将新的字符串“SP2”进行 MD5 算法加密,生成一个128位的数字签名“MD5(SP2)”;最后判断“MD5(SP)==MD5(SP2)”是否成立,若成立,则消息合法未被篡改,若不成立,则表明数据已被篡改。

3 硬件系统设计

系统硬件电路如图7所示,系统控制单元采用NodeMCU微型开发板,NodeMCU微型开发板是一款开源的硬件产品,基于ESP8266 WIFI模块构建,具有WIFI、GPIO、PWM、I2C、1-Wire、ADC等功能[8]。

图7 系统硬件电路Fig.7 System hardware circuit

NodeMCU其主要特点有:①开发板体积较小,价格低廉,Flash和RAM的存储容量较大,具有丰富的外围接口,输入电压为5 V,工作电压为3.3 V,可采用USB接口或GPIO针脚接口供电[9]。②NodeMCU烧录程序比传统的单片机更简单方便,不需要额外的烧录器,直接通过USB接口上传程序[10]。③采用NodeJS语言语法进行编写网络应用事件驱动型API,开发人员不需要熟悉芯片寄存器就可实现程序开发,这样一来编写代码容易,开发效率更高[11]。本系统NodeMCU主要作用有:获取传感器感知的数据,并将数据进行加密处理;与Mosquitto消息服务器进行无线通信;根据用户终端下发的指令对灌溉系统的水泵进行控制。使用NodeMCU时,首先需要烧写固件并预装Crypto库与MQTT库,Crypto库提供了AES、MD5、SHA1、HASH等加密算法功能,用于实现传感器感知数据与终端下发的指令的加解密处理,MQTT库则提供与消息服务器通信功能,硬件系统程序签名与加密参考代码如下。

(1)MQTT_Header_Flags="0x30"--[MQTT固定报头]

(2)MQTT_Message_Type="0011"

(3)MQTT_Dup_Flag=0

(4)MQTT_QoS_Level=0

(5)MQTT_MSG_Length=45

(6)MQTT_Topic_Length=41

(7)MQTT_Topic_Addr="/IoT_Product/user/temperature"--[MQTT有效载荷负载内容]

(8)MQTT_Message=30--[MQTT有效载荷负载内容]

(9)Str=MQTT_Header_Flags + MQTT_Message_Type

(10)+ MQTT_Dup_Flag + MQTT_QoS_Level + MQTT_MSG_Length

(11)+MQTT_Topic_Length + MQTT_Topic_Addr + MQTT_Message

(12)MD5_SP=crypto.hmac("MD5", Str, PrivateEncryption)--[生成签名]

(13)SMD5_SP=str + MD5_SP--[报文加签]

(14)status, temp, humi, temp_dec, humi_dec=dht.read11(D4)--[返回DHT11状态、温湿度]

(15)temparature_encrypted=crypto.encrypt("AES-ECB", PrivateEncryption, temp)--[数据加密]

(16)myMQTT:publish(MQTT_Topic_Addr,temparature_encrypted,0,0,function(client)--[MQTT消息发布]

第12行代码中的crypto.hmac函数用于生成签名,第15行代码对DHT11传感器温度数据进行AES加密,最后一行代码为MQTT传输协议把数据发布至消息与应用服务器。

空气温湿度传感器采用DHT11,用于环境的温度与湿度的测量,DHT11型数字温湿度传感器是一种含复合传感器,体积较小、低功耗,已被校准过的数字信号输出温度、湿度,其专用的数字模块采集技术和温度、湿度传感器技术,确保了传感器可靠性高,能长期稳定运行[12]。

土壤湿度传感器采用DFROBOT moisture sensor v1.0电容式传感器,适用于测量土壤水分,电容式传感器精确度高,响应快,受土壤盐度影响小,耐电解,耐腐蚀,防水防锈,适用于各种土壤类型,可长期埋于土壤中[13]。由于土壤传感器采用模拟信号输入,NodeMCU调用adc.force_init_mode(adc.INIT_ADC)、adc.read(0)函数获取土壤电阻值,根据所测电阻值计算出土壤水分。

蓄水容器水位测量采用HC-SR04超声测距传感器,HC-SR04超声模块精确度能达到0.3 cm,模块高精度,盲区小,常应用于机器人避障、物体测距、液位检测、公共安防、停车场检测等领域[14]。HC-SR04模块基本原理:NodeMCU提供10 μs的高电平给模块的触发控制信号输入引脚Trig,模块会自动发送频率为40 kHz的8个方波信号,同时,模块会自动检测信号的返回情况;当存在信号返回时,通过Echo引脚端输出一个高电平信号,通过记录高电平信号的持续时间的长短,可判断出超声波从发射到结束返回的时间,从而通过测试距离公式计算声波与相邻物体的距离S:

S=tECHOc/2

(1)

式(1)中:tECHO为ECHO持续的时间;c为声音的速度。为了防止发射信号影响回响信号,一般测试周期时间持续60 ms以上。超声波的传播距离S与温度密切相关,因在空中传播时,S随周围环境温度升高而加快,当温度变化显著时,需要进行温度补偿[15],近似公式为

(2)

式(2)中:331.4表示超声波在0 ℃下的传播速度,m/s;T表示当前环境下的实际温度。最终用已知容器深度减去HC-SR04测出的水面距离就可得出容器的当前水位。水位测量参考代码如下。

(1)Trig_pin=5--[定义Trig针脚]

(2)Echo_pin=6--[定义Echo针脚]

(3)container_heigh=10--[定义蓄水容器深度]

(4)time_start=0--[Echo持续开始时间初始化]

(5)time_end=0--[Echo持续结束时间初始化]

(6)gpio.mode(Trig_pin,gpio.OUTPUT)--[定义针脚5模式为输出]

(7)gpio.mode(Echo_pin,gpio.INPUT)--[定针脚6模式为输入]

(8)gpio.write(Trig_pin,gpio.LOW)--[定义针脚5为低电平]

(9)tmr.delay(2000000)--[延时2000000 ms]

(10)gpio.write(Trig_pin,gpio.HIGH)--[定义针脚5为高电平]

(11)tmr.delay(60)--[延时60 ms]

(12)gpio.write(Trig_pin,gpio.LOW)--[定义针脚5为低电平]

(13)while gpio.read(Echo_pin)==0 do--[持续读取针脚6数据]

(14)time_start=tmr.now()

(15)end

(16)while gpio.read(Echo_pin)==1 do--[持续读取针脚6数据]

(17)time_end=tmr.now()

(18)end

(19)time_duration=time_end-time_start--[超声波的结束时间与发射时间之差]

(20)distance_cm=time_duration / 58--[求出距离]

(21)water_position=container_heigh-distance_cm--[当前水位]

4 软件系统设计

4.1 用户终端软件

图8 用户终端软件流程Fig.8 User terminal software flow

用户终端软件流程如图8所示,终端软件基于B/S架构开发,采用Linux、PHP与MySQL数据库,遵循HTML5标准。HTML5作为新一代WEB应用标准,其不仅支持PC端,而且适用于各种移动终端,采用HTML5进行移动应用程序开发,开发成本低,效率高[16],并且易于维护,不但支持传统多媒体等应用功能,还支持离线存储、图像绘制、微数据与智能表单、用户交互、语义标签等功能,并具有强大API接口[17]。用户访问终端软件时,需要鉴别身份才能进行下一步操作,防止非法用户越权访问系统。

4.2 用户消息通知

采用阿里钉钉软件向用户通知灌溉系统蓄水容器水位不足或告警信息。阿里钉钉属于轻量级应用,具有零门槛、体验好、流量少、无需多次下载安装等特点,更易被用户所接受和广泛应用,同时,钉钉是免费平台,基于其基础功能的应用部署,比起购买或者自主开发独立APP,更节约成本[18]。钉钉开发平台提供其个人服务器通信接口,借助其接口,开发人员可以快速实现消息通知类APP。消息服务器与钉钉开放平台通信采用NodeJS语言,通信实现参考代码如下。

(1)const accessToken=" "; //钉钉开发平台访问令牌

(2)module.exports.handler=function(event, context, callback) {

(3)var eventJson=JSON.parse(event.toString());

(4)const postData=JSON.stringify({"msgtype": "markdown",

(5)//消息类型为支持markdown格式的正文内容

(6)"markdown": {"title": "提示信息","text": "####数据上报 " +

(7)">水箱水位" + eventJson.items['waterPosition'].value + "CM "+ },"at": {"isAtAll": false}});

(8)const options={

(9)hostname: 'oapi.dingtalk.com', port: 443, //钉钉开放平台接口地址

(10)path: '/robot/send?access_token='+accessToken, //机器人消息发送路径

(11)method: 'POST', //消息推送方式

(12)headers: {

(13)'Content-Type': 'application/json', //数据类型

(14)'Content-Length': Buffer.byteLength(postData)

(15)}

(16)};const req=require('https').request(options, (res)=> {

(17)res.setEncoding('utf8'); res.on('data', (chunk)=> {}); //字符集设置

(18)res.on('end', ()=> {callback(null, 'success'); });

(19)});req.write(postData); req.end();}; //消息推送

5 实验结果与分析

在完成系统设计后,对本系统的功能、性能、安全性进行测试。功能测试主要测试用户移动WEB端数据实时推送、远程灌溉功能和阿里钉钉客户端告警信息推送功能。用户登录进入移动WEB平台后,平台将实时刷新数据,当环境温度过高,土壤水分低于系统设置最低阈值,蓄水容器水位低于正常阈值,阿里钉钉客户端及时主动向用户推送告警信息。图9所示的是阿里钉钉告警信息推送与用户终端界面。

图9 告警消息推送与用户终端Fig.9 Alert message push and user WEB

性能测试主要测试消息服务器在高负载情况下能正常运行,运用MQTT-JMeter插件测试服务器性能,利用用户插件创建2个虚拟用户组,用户组分别为消息发布者与消息订阅者进行发布、订阅操作,虚拟用户数量分别为100、200、300、500、600、800、1 000,消息数量分别为100、300、500、700,每隔1 s发送一条32字节的随机串,附加时间戳,时间戳用于数据传输时延计算,循环10次结束,发送时间和接收时间结果如表1所示。

表1 消息推送性能测试结果Table 1 Message push performance test results

从表1可以看出,在消息推送数量不变的情况下,增加用户数,则消息推送时间与接收时间会随着用户数的增加而延长,但延长的趋势并不太明显,用户数量的增加对灌溉系统的性能影响不大;随着消息发送数量的增多,在用户数量不变情况下,消息推送时间和接收时间增幅较大,消息推送时间明显增加,可看出消息的推送数量对系统性能影响较大。

MQTT与HTTP性能对比如图10所示,利用测试插件分别对MQTT、HTTP协议进行了发送与接收测试,消息数量为500,测试用户数为1 000,测试表明两协议用户数量在500以内时,数据接收时的性能差异不明显,但数据在发送时性能差异较大,MQTT协议性能明显比HTTP协议更具有优势,总体上MQTT协议性能比HTTP协议更好。

图10 性能测试对比结果Fig.10 Performance tests comparison

从总体上分析,系统传输时延低,并且性能稳定良好,用户能实时无缝获取信息,并且能远程精确执行灌溉指令。安全性测试主要测试NodeMCU微控制单元、用户终端与MQTT消息服务器推送数据过程中,消息报文是否存在被非法篡改、窃取风险。利用Wireshark抓包软件分析消息报文加签,数据加密,如图11所示。

图11 消息报文加签与数据加密Fig.11 Message signature and data encryption

从图11可看出,消息报文Msg-Header在传输过程中已被加签,同时,推送的数据Temperature也进行了加密,因此,消息服务器只需进行验证签名就可防止报文在传输中被非法篡改,并且消息接收端利用私钥就能还原推送过来的数据,防止数据被非法窃取,从而保证系统安全运行。

6 结论

提出一种基于消息队列遥测传输的灌溉系统,讨论了利用MD5算法对MQTT传输协议的消息报文进行了加签,利用AES算法对感知数据进行了加密,避免了数据在推送过程中被非法篡改与窃取的安全风险,从而提高了系统的安全性与可靠性。最后通过实验对系统的功能、性能、安全3个指标进行了分析,实验结果表明:本系统比已有的研究成果性能更加高效稳定、安全、实用,更能实时无缝推送数据,并且更能远程精确执行灌溉指令;用户端移动WEB平台能长期稳定运行,能实时刷新数据,能远程精确控制灌溉水泵;阿里钉钉APP能向用户及时推送异常数据,运行效果良好;系统的稳定性与安全性较高,为智慧农业提供了一种安全可靠的解决方案。

猜你喜欢

报头消息报加密
一种新型离散忆阻混沌系统及其图像加密应用
2019年俄罗斯媒体中的中国形象分析
对河
报业文化中的一道独特风景
加密与解密
总理为正面报道 “收买”报纸
DES 对称加密和解密算法的安全性应用
淡妆浓抹总相宜
——对中国晚报报头变化的研究与欣赏
SQL server 2005数据库加密技术
简论报纸的报头设计