赵 政 王彦冰
(中电科鹏跃电子科技有限公司,山西 太原030000)
目前,移动互联网正逐渐渗透到人们生活、工作的各个领域,各类丰富多彩的移动互联网应用迅猛发展,正在深刻改变信息时代的社会生活,近几年,更是实现了3G 经4G 到5G 的跨越式发展。
随着它的发展,物联网技术的发展也日趋完整、成熟,通过信息传感器将各种设备与互联网连接在一起而形成的巨大网络,是需要基础网络设施提供更多的支持,所以移动互联网对物联网的发展起到了重要的促进作用。
物联网的应用领域涉及到方方面面,在工业、农业、环境、交通、物流、安保等基础设施领域的应用,有效的推动了这些方面的智能化发展,使得有限的资源更加合理的使用分配,从而提高了行业效率、效益。所以,再结合移动互联网、云计算、人工智能等技术,可在基础设施领域发展更多远程智能化控制管理的应用。
物联网的核心是物与物、人与物之间的信息交互,因此,远程智能化控制管理应用的重要核心,是移动互联网的综合消息推送。
其中,由于MQTT 协议的特点,基于MQTT 协议的即时消息业务解决方案,更适合移动互联网,更符合可靠消息传输方式的设计和实现。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是ISO 标准下基于发布/订阅范式的消息协议。该协议构建于TCP/IP 协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器的通信协议。
MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;[3]
(2)对负载内容屏蔽的消息传输;
(3)使用TCP/IP 提供网络连接;
(4)有三种消息发布服务质量,“至多一次”、“至少一次”、“只有一次”,分别对应于有效值“0”、“1”、“2”,可供不同应用、不同情境下选择;[4]
(5)小型传输,开销很小,协议交换最小化,以降低网络流量;
(6)使用Last Will 和Testament 特性通知有关各方客户端异常中断的机制。
基于MQTT 的这些特点,它的适用范围就非常广泛,在很多情况下,包括受限的环境中,如机器与机器(M2M)通信和物联网(IoT)。
随着移动互联网的发展,MQTT 由于开放源码、耗电量小等特点,会在移动消息推送领域有更多的贡献,作为Android 手机客户端与服务器端推送消息的协议而被广泛使用;在物联网领域,传感器与服务器的通信,信息的收集,MQTT 都可作为考虑的方案之一。
服务是Android 中实现程序后台运行的解决方案,它非常适合执行那些不需要和用户交互且需长期运行的任务。服务的运行不依赖与任何用户界面,即时程序被切换到后台,或者用户打开了另一个应用程序,服务仍能保持独立运行。不过,服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。
当某个应用程序被杀掉时,所有依赖该进程的服务也会停止运行。
Service 的其中一种形式是本地服务,该服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外本地服务是在同一进程因此不需要IPC,也不需要AIDL。相应bindService 会方便很多,当主进程被Kill 后,服务便会终止。一般使用在不需要常驻的服务,故服务和启动服务的activity 在同一个进程中。[2]
在Android 开发中,有些任务不是当时就执行,而是过了一个规定时间再执行,那么就需要使用定时器。Java 提供了计时器工具类,即Timer 和TimerTask。Timer 是用来在主线程之外的一个后台线程执行指定计划任务,可执行一次或多次,TimerTask是一个实现了Runnable 接口的抽象类,其子类代表一个可以被Timer 执行的任务。[1]
远程管理智能化系统是一套物联网系统,总体主要包括了MQTT 公共云服务、监控点群部署与用户终端。
3.1 MQTT 公共云服务:是指物联网云平台,即为一个代理,转发各方发来的数据。
3.2 监控点群部署:主要包括物联网控制器、传感器、执行机构等,负责采集、上报环境中各类数据,同时控制执行机构的执行。
3.3 用户终端:主要功能有查看实时监测数据、发送控制指令使物联网控制器可执行。
系统的主要结构如下图1 所示:
图1 系统组织架构
本系统的主要结构与功能,通过MQTT 协议的实现方式即可满足。
实现MQTT 协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT 协议中有3 种身份:发布者、代理(服务器)、订阅者。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT 传输的消息分为主题和负载两部分:主题为消息类型,负载为消息内容,即具体使用的内容。订阅者订阅消息后,可收到该主题的负载。
在本系统中,代理(服务器)是MQTT 公共云服务;发布者和订阅者则根据功能不同而不同。在监控点上报数据、用户查看数据功能中,监控点是发布者,用户终端是订阅者;在用户根据具体情况控制监控点的执行机构功能中,用户终端是发布者,监控点是订阅者。
因此,监控点与用户终端均为MQTT 客户端,而用户终端APP 以Android 版本为主。在MQTT 客户端中,核心业务即为订阅- 发布消息,其流程图如下图2 所示:
图2 订阅- 发布消息流程图
使用手机APP 是用户操作本系统最重要的方式,提升了用户操作的便利性和友好性,且本系统Android 端的实现为后续远程控制方面的工业APP 开发提供范例,有重大意义。MQTT 在Android 端的具体实现方法如下:
①添加依赖:
首先,在项目根目录下的build.gradle 文件中添加如下代码:
②添加权限:
在AndroidManifest.xml 文件中添加使用权限,声明MQTT服务MqttService,代码如下:
MQTTService 类的功能中包括 MQTT 安卓客户端MqttAndroidClient () 的 初 始 化 ,MQTT 连 接 参 数MqttConnectOptions () 的 设 置,MQTT 连 接 服 务 器MqttAndroidClient.connect()、订阅MqttAndroidClient. subscribe()[5]并监听接受消息MqttCallback(),也包括一些公共方法,如消息发布方法publish(),Service 父类的绑定服务方法onBind()、解绑服务方法onUnbind()、销毁方法onDestroy()。
其次,为了代码模块的低耦合性,当获取从服务器推送过来的消息时,使用回调接口IGetMessageCallBack 去更新UI。
最后,为了实现通过回调接口去传递从服务器获取到的消息,创建MyServiceConnection 类,来实现ServiceConnection 接口,并通过绑定方法onBind()来在Service 和Activity 之间传递数据,更新UI。
根据对本系统Android 端的功能定义,进行了如下设计。
本系统Android 端基于MQTT 协议接受服务器推送的消息,并将消息显示在界面以供用户查看。具体实现方法如下:
①为了根据接受到的消息而定时更新UI,采用定时器类Timer 和TimerTask:在MQTTService 类中,MQTT 监听接受消息的变量MqttCallback()是接口,继承了接受服务器推送消息的方法messageArrived(),在此方法中添加Timer 和TimerTask。将消息的发送放在TimerTask 的Runnable 接口的后台线程中,Timer设置执行任务的频率为1 次/30s,且只有在退出本系统Android端时才终止定时器线程,否则会一直定时接受消息并更新;若在定时器任务中未定时接受到消息,则更新界面以提示用户“(控制器xxx)下线”。这样既可避免因主线程运行缓慢而导致用户体验差,也可实现实时的效果。[1]
②定时更新消息显示:主线程所在的Activity 继承了接口IGetMessageCallBack,根据本系统功能设计,具体实现了接口中的方法setMessage(),即接受到的消息以UI 界面定义的形式显示出来供用户方便查看。
③启动MQTT 服务:在主线程所在的Activity 中,调用bindService()来启动MQTT,即可开始定时接受消息数据。
用户根据显示的消息数据,可操作本APP 来控制监控点的设备状态。具体实现方法如下:
①在用户可操作界面的Activity 中,监听每个操作按钮、选择框、图标等的动作变化状态,在监听过程中调用消息发布方法publish()。
②在消息发布方法publish()中,使用MQTT 安卓客户端的发布方法MqttAndroidClient.publish(),通过对此方法传递特定参数,如消息主题、消息负载的有效字节数组、消息发布服务质量、服务器是否保留此消息,发送消息请求至服务器。[5]
本文主要描述了远程管理智能化系统Android 端的查看数据、发送指令等功能的实现。系统利用了具有低功耗和移动互联网带宽利用率高等特点的MQTT 协议来进行消息数据在客户端与服务端之间的传输,通过实时接受消息数据,用户可随时操作APP 发送指令来远程控制监控点各项设备。系统实现了消息数据与远程控制指令的实时传输,有效提高了用户操作的便利性与友好性,为“数据远传+实时控制”甚至更多功能模式的工业控制系统,包括APP 的开发,提供了范例基础,意义重大,可推广运用于工业、农业、环境等远程控制方面的应用。