凌敏,罗浩武,邹阿金,黄健明
(1.广东海洋大学电子与信息工程学院通信工程系,湛江524088;2.广东海洋大学电子与信息工程学院电子工程系,湛江524088)
随着智能家居技术的逐步发展,家居智能化正在渐渐影响着人们的生活,各类智能家居设备可以给人们提供舒适、安全、方便的居住环境。移动互联的高速发展,使得人们随时随地都可以通过移动设备与他人联系。眼下正发展得如火如荼的5G 技术,凭借其速度快、网络容量大、时延低等优点,势必能彻底改变智能家居终端的部署与服务方式[1],从而使智能家居得到更进一步的推广。
为了顺应移动端技术的发展,便于在家中随时使用手机操控家居设备,本文设计了一款可与家中设备进行交互的、集众多传统遥控器功能于一身的手机App,同时还具备语音控制、远程监控等功能,使得用户只需要一款App,就可以实现对家中所有设备进行监测与控制。
对于家居设备的监控管理,传统的遥控器虽然在一定程度上可以满足人们的需求,却有其局限性。例如:不同的家电需要配备不同的遥控器,导致了遥控器的冗余,管理困难;除此之外,传统遥控器所能控制的空间范围是有限的,人们通常无法在室外通过遥控器操控家中设备,也无从知晓设备的运行状况。
为了克服以上缺陷,本文提出一种解决方案,可集众多传统遥控器的功能于一体,方便用户操作,提升用户体验。
本系统的整体架构是配置云服务器作为中转站,硬件设备由支持TCP/IP 通信协议的ZigBee、Wi-Fi 和4G LTE 通信模块组成;智能家居App 则通过Socket 与云服务器连接。二者通过同时连接云服务器实现远程连接,从而进行通信和数据传输。系统总体架构如图1所示。
通过结合4G LTE 无线通信技术和ZigBee 无线通信技术,ZigBee 终端节点采集室内的温度、湿度、湿度、污染物的气体浓度、光照强度、当前天气状况等信息,将这些信息联网发送到云服务器中,云服务器再转发到App。
App 接收到数据后经过处理显示到界面上,用户打开App 即可远程获取室内的温度、湿度、烟雾浓度、光照强度等信息,同时能够远程改变室内各种家电的状态、切换室内情景模式。通过这款智能家居App,用户即使出门在外也能方便了解室内环境情况、改变室内家电状态。
图1 系统总体架构
本Android 客户端的开发环境为Android Studio3.3,是谷歌公司在IntelliJ IDEA 的基础上,推出的一个Android 集成开发工具。开发语言为面向对象的编程语言Java,故必须安装支持Java 程序开发和运行的JDK(Java Development Kit),还需要有JRE(Java Runtime Environment)的支持[2]。数据库方面,选择了遵守ACID(即原子性、一致性、隔离性和持久性)的关系型数据库管理系统SQLite,由于其零配置、速度快、占用内存小、开源等优点,使得其成为许多嵌入式设备存储数据的第一选择[3]。
Android 客户端系统设计主要包括用户UI 设计、通信模块设计、数据库设计、语音控制模块设计四个模块。
(1)用户登录注册界面设计
登录注册布局文件均使用了RelativeLayout 作为整体布局,利用EditText 实现用户名和密码的输入框,利用Button 来触发注册和登录的具体操作。注册和登录界面如图2 所示。
图2 注册和登录界面
(2)用户主控界面设计
本系统的主控界面按功能可分为控制界面和监控界面。
监控界面如图3 所示,采用LinearLayout 作为整体布局,通过EditText 显示家居设备的运行状态及运行参数。
控制界面如图4 所示,采用LinearLayout 作为整体布局,通过GridLayout 实现网格布局,使用RecylerView来实现内容的滚动。用户可点击按钮,实现模式的切换和对家居设备的控制。
通信模块基于TCP 协议和C/S 模型进行设计。TCP 协议全称为传输控制协议(Transmission Control Protocol),因为其具有面向字节流和连接的服务、可靠传输、全双工等特点[4],已经成为使用非常普遍的网络协议;C/S 模型即客户端(Client)和服务端(Server)模型,TCP 编程主要基于C/S 模型[4]。
智能家居App 的服务端创建一个服务程序,搭载在云服务器上,等待客户端连接。客户端根据IP 地址和端口与服务器建立连接后,对服务器的响应进行数据处理。
图3 监控界面
图4 控制界面
服务端实现步骤如下:
(1)实例化ServerSocket 对象,等待客户端连接;
(2)与客户端连接成功后,与之进行通信。
Android 客户端实现步骤如下:
(1)开启异步线程,通过IP、端口号与远程服务器连接;
(2)从Socket 对象中获取输入输出流从而进行数据的读写操作;
(3)基于数据,在异步线程中对UI 界面进行操作;
(4)读写行为结束,关闭输入输出流;
(5)关闭Socket。
服务端与客户端通信流程如图5 所示。
图5 服务端与客户端通信
SQLite 作为Android 操作系统体系结构的重要成员,对于所有Android 系统应用程序都可用。由于其可移植性好,Android 针对其封装了专属的API[5],例如SQLiteOpenHelper,通过该接口可以实现数据库、表的创建与升级。不管如何进行封装,本质上都是构建SQL 语句并且提交到SQLite 中执行,最终得到需求结果[3]。
为了可以灵活地操作和管理数据库,App 的数据库模块选择自定义一个继承自SQLiteOpenHelper 的数据库操作类DBHelper,在该类中实例化实际操作数据库的SQLiteDatabase 对象,重写继承的方法,并封装增删改查等一系列操作。
具体操作如下:
(1)创建数据库
定义全局变量SQLiteDatabase,在数据库操作类的构造函数中,使用sqLiteDatabase = dBHelper.getWritableDatabase()创建一个可读写操作的数据库。
(2)创建表
首先定义创建表的SQL 语句,在复用的onCreate(SQLiteDatabase sqLiteDatabase)中调用sqLiteDatabase.execSQL(sql)方法,将SQL 语句作为参数传入,从而创建所需要的表。
(3)升级数据库
当数据库中的字段或者表结构有所变化的时候,重写的onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion,int newVersion)方法会被调用,根据版本号升级数据库。
(4)添加数据
为了避免繁琐的操作,首先实例化一个可以存储键值对数据的ContentValues 对象;然后将要添加进数据库的数据封装在ContentValues 实例里;最后执行SQLiteDatabase 的insert 函数将数据插入对应的表中。也可以自定义添加数据的SQL 语句,使用sqLiteDatabase.execSQL(sql)进行添加。
(5)查询数据
使用sqLiteDatabase.query()遍历表进行查询。
(6)删除数据
调用SQLiteDatabase 的delete()方法;也可以自定义删除数据的SQL 语句,使用sqLiteDatabase.execSQL(sql)进行删除。
表1 和表2 分别是该系统的用户信息表和家居实时数据表。
表1 用户信息表
表2 家居实时数据表
随着物联网的不断普及,通过语音实现智能家居控制已成为一种发展趋势,对于有老人和小孩的家庭来说,语音控制显得更加轻松高效。百度提供的语音识别功能强大,不但可以将录音转化为文字,还在线支持普通话、英文、粤语和四川话[6],适用于多种情况;对于识别出来的文字,可以进行分词及找出意图和词槽[6]。本App集成了百度语音识别的API,将用户的语音转化成计算机可读的字符串发送给硬件设备,硬件与App 客户端同时对用户的语音输入做出响应。
语音控制实现步骤如下:
(1)搭建开发环境
要使用百度官方提供的API,首先需要下载相应的jar 包和so 库文件,并部署到项目正确的位置下。
(2)权限设置
为了实现语音控制操作,需要在AndroidManifest.xml 文件中设置允许App 使用麦克风、录音、存储等权限。若Android 系统版本为6.0 以上,还需要在源文件中动态申请权限。
(3)初始化并配置语音解析器
初始化:
SpeechSynthesizer mSpeechSynthesizer =SpeechSynthesizer.getInstance();
注册自定义的监听器:
mSpeechSynthesizer.setSpeechSynthesizerListener(new MyListnener());
配置在语音开发者平台上注册应用得到的appId、apiKey 和secretKey:
mSpeechSynthesizer.setAppId(appId);
mSpeechSynthesizer.setApiKey(appKey,secretKey);
初始化tts:
mSpeechSynthesizer.initTts(TtsMode.MIX);
(4)初始化EventManager
EventManager eventManager = EventManagerFactory.create(getContext(),”asr”);
(5)初始化事件监听EventListener,在继承的onEvent 方法中做回调处理;
(6)注册自定义的监听事件
EventManager.registerListener(eventListener);
(7)发送事件
识别结束后,调用eventManager.send(SpeechConstant.ASR_STOP,null,null,0,0)停止识别。将识别出的字符串转换后发送给云服务器,云服务器再转发到硬件设备上,后者接收到指令后会做出对应的处理。
随着物联网技术和5G 技术的不断发展,智能家居在未来势必会走进寻常百姓家,变得越来越平民化。本文开发的智能家居App 系统将软件客户端和硬件设备通过云服务器这座桥梁,实现了远程连接,从而可以对家居设备进行远程控制和监控,解决了市场上由于家居品牌不同、控制方式不同所带来的种种问题,实现了只需下载安装一款App,就可以与家中所有设备实现交互;配置的语音控制模块,使得交互方式变得更方便和友好。