利用ZigBee技术和安卓平台实现M2M通信
2021-01-06李琳
李琳
摘 要:M2M通信(Machine to Machine Communication)目前已在物联网范畴内获得巨大的应用,基于灵活易用和良好的移动性,M2M主要采用无线系统架构来实现,例如ZigBee、WiFi和蜂窝网络等。本文采用ZigBee技术,在Android平台采用Java语言设计实现了一种新的M2M应用:近距离即时通讯,该应用可在车联网或其它小区域内数据共享等低速率传输领域获得较好的推广。
关键词:M2M;异构网络;即时通讯;Android;ZigBee
中图分类号:TP393.0 文献标识码:A
Abstract:M2M (Machine to Machine) communication has been used widely in the Internet of things, based on the flexible and easy to use and good mobility, M2M mainly uses wireless architecture to realize, which includes ZigBee, WiFi and cellular networks. This article proposes a novel M2M application of short distance instant messaging uses ZigBee technology, Java language underlaying Android platform, the application can be used in the internet of vehicles or other low rate data transmission in small area for better promotion.
Key words:M2M; heterogeneous network; instant messaging; Android; ZigBe
M2M通信,即Machine to Machine Communication,字面含义是机器与机器之间的通信,也可理解为人对机器(Man-to-Machine)、机器对人(Machine-to-Man)等,旨在通过网络和通信技术实现人、机器和系统三者之间的智能化、交互式无缝连接。目前在实现M2M的网络架构上并未达成一致意见,通常采用的技术手段包括Bluetooth (IEEE 802.15.1)、ZigBee (IEEE 802.15.4)和WiFi (IEEE 802.11b) 等[1],或者通过移动运营商的网络基础设施,实现D2D(Device to Device)通信。正是由于技术架构的非唯一性,因此M2M通信网络通常也被称为异构网络[1-2]。
M2M通信在物联网范畴内已经被大量应用,例如环境监控、智能交通、智能家居、健康监护以及战场态势感知等等,以3GPP及更新的蜂窝网络无线技术为基础的D2D通信也正发展得如火如荼[3-4],也有研究者提出了M2M的通用系统框架和相关协议[5]。隸属于M2M通信中的人机交互或人与人之间通信在互联网时代早已经成为现实,而机器与机器间通信的MTC(Machine Type Communication)方式则成为M2M系统体现物联网之泛在互联特点的主要技术架构,同时也是M2M通信中研究和应用的热点与重点。基于Android平台和Java语言、利用ZigBee网络所设计的一种近距离即时通讯工具,为人们提供了一种不依赖于运营商的通信,同时也能提供MTC通信方式,在例如智能交通、健康监护等物联网领域得到较好的应用和推广。
1 相关技术与应用现状
1.1 Android平台上的即时通讯软件
最早的即时通讯软件ICQ诞生于1996年,它可以称得上是即时通讯软件的鼻祖,一经推出就得到了迅猛的发展;随后马化腾推出了OICQ,也就是现在的腾讯QQ,经过一段时间发展,一举成为全球使用人数最多的即时通讯软件;当时瓜分或者说是共享市场份额的还有MSN,后来经过不懈的努力,在国内成为办公室白领及IT从业者的身份标识;随着淘宝的兴起,阿里旺旺也在B2C及B2B实施过程中成为最主流的即时商业通讯软件。随后腾讯公司推出的微信由于其创新的应用在该领域旋即大放异彩,甚至声称改变了人们的生活方式;而后Web2.0时代的手机微博估计也只能称之为准即时通讯软件,当然也切走了部分市场份额。
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备[6],属于智能操作系统的一种。随着智能手机的普及,即时通讯软件的使用人群越来越庞大,除了传统的电话与短信业务,人与人的交流已经离不开这些即时通讯手段。然而在另一个细分领域,还亟待使用新的技术手段填补,那就是近距离即时通讯。目前移动终端上近距离即时通讯的软件很少,使用的技术包括红外与蓝牙等。红外技术在数据传输时对使用方式要求较高,速率也不大,因此现在主要被用于家电遥控等方面;蓝牙的使用方式虽说要简单一些,但数据传输距离十分有限,一般十米开外就无法传输数据,因此目前的主要用途并不是传输文件,而是蓝牙耳机和车载蓝牙电话。
1.2 ZigBee技术
ZigBee是在IEEE802.15.4的基础上规范一系列数据传输速率低、网络覆盖范围小的无线通信协议的准则。它的传输距离近、网络的复杂度低、成本小、功耗低,通常使用在自动控制和远程控制方面。ZigBee具有近距离、低复杂度、自组织、低功耗、低成本和可嵌入各种设备的特点[7]。如果无线通信的目的是发送或接收简单的命令,或从传感器收集信息,那么ZigBee将会提供比蓝牙和WiFi更有效、性价比更高的解决方案[8]。
ZigBee的数据传输速率低且功耗小,因此在其应用中,大多采用电池供电,使用寿命一般都在半年以上。在安全方面,ZigBee采用了三层安全模式以保证收发和转发数据的过程中不受安全方面的威胁。再加上ZigBee可嵌入各种设备(包括本文中使用的自带Android 2.3.4操作系统的Cortex-A8平台),这些特点使ZigBee在近距离无线传输中有很大的优势。
各ZigBee组织于2001年8月缔结盟约,正式创建ZigBee联盟[9]。ZigBee主要以工业领域(自动控制设备等)、现代农业领域、智能家庭领域(照明、温度、安全及控制等)、智能交通、医学领域(监视器和传感器)等方面为目标市场。
在智能家庭领域中,ZigBee应用于家庭的照明、温度、安全、控制等[10]。ZigBee模块可以嵌入在电视、电灯、电话里。当人们进入房间后,无需手动打开电灯开关,可以通过遥控打开。当人们打开电视时,电灯会根据电视的行为自动减弱灯光。当人们拿起电话准备拨通或是当电话铃响时,电视会根据电话的行为自动静音。家庭里使用的设备可以通过ZigBee模块收集到家庭中各种动态信息进行相关控制。ZigBee模块的装入给人类的家居生活创造了更加智能化的操作方式。
在工业领域中,ZigBee设备可通过自组网的模式覆盖较大的网络范围,在覆盖的范围内能自动收集各种信息。ZigBee采集到的信息被系统处理与分析,达到控制的目的。例如生产流程中,可以通过ZigBee网络检测到流程中生产的信息,环境的变化等,传回系统后,系统再根据工业与环境的改变进行相关控制。
在智能交通中,可在街道、高速公路大量安装ZigBee设备。相比于全球定位系统(GPS),在道路上大量安装ZigBee设备可以提供给人们更加精准和具体的道路信息。此系统能覆盖GPS覆盖不到的隧道,收集到更多的道路信息,如道路的行驶条数,是否限速,哪条路发生交通事故或是否堵车等,这样也加强了行驶的安全和方便。
在现代农业领域中,ZigBee设备采集土壤的成分,气温气压的变化,环境的改变等信息再通过它覆盖的网络反馈给中央控制设备,人们可以根据数据的统计对农田进行即时准确的防护和应急,从而保证农作物的健康生长,提高农作物的产量,给农民带来更大的收入[11]。
在医学领域中,给病人的病房安装ZigBee设备,可以将由传感器获得到的病人的身体状态收集并反馈给医生。这不仅帮助医生减少了查房的次数,也可以在病人出现紧急状况时做出最快速度的反应,对监护和治疗都有着重大的帮助[12]。
在建筑领域,可通过安装多个ZigBee设备收集传感器采集到的建筑参数,用于排除安全隐患,防止豆腐渣工程。以这样的形式检测建筑物,可以减少人工检测的漏洞和费用。
2 系统方案
图 1描绘了基于云的M2M通信系统网络架构示意图,由云,网关和机器群(多个机器)组成。网关与云之间通常采用高速有线/光网络机制通信,云中包含数据中心、应用程序和服务的服务器。网关与机器之间大多通过无线方式互联互通,机器与机器之间也可以直接通信。
暂不考虑网关与云的设计应用,而专注于机器与机器之间通过ZigBee网络的直接通信,每个机器的硬件组成包括Android平台和ZigBee模块,二者之间经由串口相连。其应用软件开发过程分为两大部分:第一部分为串口操作,第二部分为应用程序上信息的发送与接收。
串口通信是指外设和计算机之间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式[13]。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本。对于两个进行通信的端口,以下参数必须匹配:波特率,数据位,停止位,奇偶校验位。
软件实现的流程图如图 2所示,程序先验证用户登录,成功后执行串口的初始化和配置等相关操作,完毕后打开串口跳到通讯界面,主线程用于发送信息,新建的接收线程用于接收信息,当有信息到来或有信息发送成功时刷新ListView控件,通讯主界面更新内容。
实时数据的收发是对获得的输入输出流进行操作。用户在不退出程序之前一直在监听按钮事件和输入流。对于发送数据来说,可以就在主线程中直接进行,在输入框中输入通讯内容,点擊按钮触发监听事件。如果发送内容不为空,将把内容发送出去并刷新Listview控件,调用发送视图,将发送的内容显示到发送窗口上。开启一个新的接收线程用于接收数据。在接收线程的run方法中设置线程不中断一直循环,在循环里监听输入流。当输入流中有数据,在主线程中刷新ListView控件,调用接收视图,将读取的数据显示到接收窗口上。
3 设计实现与测试结果
3.1 Android中对串口操作
Android平台与ZigBee模块之间通过串口硬件相连,因此对串口的操作是信息收发的基础。首先创建Application类,该类继承自Android.app.Application类,它提供了打开串口和关闭串口的方法。JVM虚拟机在开启第三方应用时,系统会为该应用自动分配一个PID,也称进程ID,所有的活动都会运行在该进程上,因此在Application类中创建的方法可以被相同的应用程序中的所有活动使用。使用设备Cortex-A8的COM2口,波特率设置为38400。在AndroidManifest.xml中修改application的Android:name。
新建一个含有本地方法的SerialPort串口类,加载动态链接库,声明native方法,在构造函数中实现串口的初始化,使用JNI调用本地方法得到文件描述对象和串口输入输出流,并提供获得串口输入输出流的方法。在串口类中声明native方法,open方法和close方法都有native关键词修饰,为本地方法,不能实现。open方法中传入串口路径和波特率两个参数,返回值为串口的文件描述对象,功能为打开串口,而close方法的功能是关闭已打开的串口。
在该串口类中以static块加载C动态链接库,也就是libSerialPort.so文件。加载动态链接库后,在Android项目中方能使用由C语言编写成的函数。
写SerialPort.c文件实现实现串口类中声明的打开和关闭串口的native方法,在所需头文件中还需加入jni.h和SerialPort.h两个头文件。
接下来在open函数中对串口进行配置,如波特率、数据位、停止位等,最后创建相应的串口文件描述对象fileDescriptor并作为返回值返回。
该C文件中关闭串口的方法。文件描述对象名在打开串口已经规定为fileDescriptor,所以找到该文件描述对象对应的文件描述符,调用C中已定义有的close函数关闭串口。
在Android项目所在目录下新建jni文件夹,在命令窗口中进入该路径,调用Java的javah命令生成SerialPort.h头文件。-o后接输出文件名,这里命名为SerialPort.h文件;-classpath后接加载类的路径,这里为Android项目中的src目录;-jni用于将类文件Serial Port.class生成.h头文件。.h头文件相当于Java里的接口,通过写本地方法来实现这个接口。
Java_kingmero_chat_SerialPort_open是JNI的规定格式,为Java_包名_类名_方法名。
编写Android.mk文件,指出“哪些文件需要编译”、“编译特性要求”等。LOCAL_PATH := $(call my-dir)调用宏函数my-dir返回当前路径。include $(CLEAR_VARS)指定让GNU MAKEFILE清除许多LOCAL_XXX变量。LOCAL_MODULE := SerialPort定义模块名称,即生成的库名为libSerialPort.so。LOCAL_SRC_FILES := SerialPort.c编译的源文件为SerialPort.c。LOCAL_LDLIBS := -llog为引入log库。include $(BUILD_SHARED_LIBRARY) 生成的库是动态链接库。
在cygwin中进入Android项目的jni目录(cd /cygdrive/指定目录),用ndk-build命令生成libSerialPort.so文件。
3.2 数据收发
设计通讯主视图为main.xml,发送视图send.xml,当信息的方向为发送时,调用发送视图显示信息;设计接收视图recv.xml,当信息的方向为接收时,调用接收视图显示信息。
编写一个Message类记录信息的方向(发送或接收)和内容,定义两个静态变量RECV和SEND作为接收和发送的标志。
为即时通讯软件自定义Adapter适配器类,该适配器继承自Android.widget.BaseAdapter类,可以让ListView控件调用不同的显示,实现通讯界面左侧为接收窗口,右侧为发送窗口。重载getView()方法,获取在特定位置上的信息对应的视图,判断信息为发送还是接收,将其按标志放置在对话显示框。
3.3 实现通讯
编写通讯ChatActivity,在AndroidManifest.xml中添加该activity。发送数据,点击发送按钮触发按钮点击监听事件,获取到文字输入框中输入的通讯内容,将它通过串口输出流发送出去。
编写send()方法,用于将发送的数据或接收的数据显示到ListView控件上。调用适配器的notifyDataSetChanged()方法刷新,自动触发重载的getView()方法,按照消息的标志在不同的条目中显示指定的视图。
在主线程上开启新的接收线程,实现接收数据。主线程负责监听按钮发送数据,新的接收线程阻塞在接收流的read()方法处,等待接收数据。
编写sum()方法,将从输入流中读到的数据放到一个临时的存储器sumstr中,判断字符串sumstr的最后一个字符是否是结束标志为,如果不是则继续整合数据,如果是则证明要接收的一句话已经全部读取完毕,调用receive()方法在主线程中刷新ListView控件。
编写receive()方法,用于在主线程而不是开启的接收线程里执行ListView的更新。如果在接收線程中直接使用send(Message.REV, str)进行更新,虚拟机执行到该命令时将报错并抛出异常,所以应在主线程执行更新。
每台机器由基于ARM Cortex-A8芯片的Android平台通过RS232串口电缆连接一个ZigBee模块组成,实验中共用到两台这样的机器。
在平台上导入编译完并打包的chat.apk,进行安装,进入“ZigBee聊天室”(设计时为基于ZigBee的近距离即时通讯软件定义的软件名),分别输入用户名(一台机器上用户名为“红”,另一台机器上用户名为“蓝”)登录,然后双方便可进行聊天。图 3展示了所有设备相连后软件的测试图。
从图 3中可以看出两台Android机器通过无线的方式构成了一套简单的M2M通信系统,在用户登录后,进入聊天界面。在无线通信中,“蓝”发送信息能在自己的ListView控件中回显到发送窗口,并在“红”的接收窗口中显示。同时,“红”发送信息能在自己的ListView控件中回显到发送窗口,并在“蓝”的接收窗口中显示。经测试,无遮挡环境下两台机器的通讯距离可以达到近百米。
4 结 论
在现在以及未来的生活中,M2M通讯将会在人与物沟通过程中扮演相当重要的角色,由于应用场景各异,其技术框架将必定会是异构网络搭建,因此针对不同的使用需求,将会采用不同的技术手段以满足。ZigBee以低复杂度、低功耗、低数据速率和低成本的优势,嵌入至当前最主流的智能移动终端操作系统Android中,开发出的近距离即时通讯系统,可无需借助于传统运营商的基站等基础设施、自组网完成通讯,为D2D通信提供了新的思路,可应用于车联网、智能城市及小区域数据通讯领域,具备较好的应用前景。
參考文献
[1]CHEN Kwang-cheng A B C, LIEN Shao-yu A D. Machine-to-machine communications: technologies and challenges[J].Ad Hoc Networks,2014,18(3):3-23.
[2]DOPPLER K, RINNE M, WIJTING C, et al. Device-to-device communication as an underlay to LTE-advanced networks[J]. Communications Magazine, IEEE, 2009, 47(12): 42-49.
[3]TEHRANI M N, UYSAL M, YANIKOMEROGLU H. Device-to-device communication in 5G cellular networks: challenges, solutions, and future directions[J]. Communications Magazine, IEEE, 2014, 52(5): 86-92.
[4]XIONG Y, MIN W, JIA W, et al. Design and implementation of instant message system based on 3G[C]// Control Conference. IEEE, 2007 : 656-660.
[5]SWETINA J, LU G, JACOBS P, et al. Toward a standardized common M2M service layer platform: Introduction to oneM2M[J]. Wireless Communications, IEEE, 2014, 21(3): 20-26.
[6]NTANTOGIAN C, APOSTOLOPOULOS D, MARINAKIS G, et al. Evaluating the privacy of Android mobile applications under forensic analysis[J]. Computers & Security, 2014, 42: 66-76.
[7]GISLASON D. ZigBee wireless networking[M].Boston: Newnes,2008:35-40.
[8]FARAHANI S. ZigBee wireless networks and transceivers [M]. Boston: Newnes,2008:1-12.
[9]BILGIN B E, GUNGOR V C. Performance evaluations of ZigBee in different smart grid environments[J]. Computer Networks, 2012, 56(8): 2196-2205.
[10]STARSINIC M. System architecture challenges in the home M2M network[C]//Applications and Technology Conference (LISAT), 2010 Long Island Systems. IEEE, 2010: 1-7.
[11]LEE H J, LEE S H, HA K S, et al. Ubiquitous healthcare service using ZigBee and mobile phone for elderly patients[J]. International Journal of Medical Informatics, 2009, 78(3): 193-198.