基于QT和智能网关的智能家居系统设计

2021-10-26 07:43曾明辉谈宏华邢栢豪郭良等
自动化与仪表 2021年10期
关键词:线程智能网电器

曾明辉,谈宏华,邢栢豪,郭良等

(武汉工程大学 电气信息学院,武汉430000)

生活中智能设备的运用越来越广泛,仅靠物理开关控制家居的方案已经逐渐不能满足人们的生活需求,运用智能家居控制系统,可以实现家居的远程控制以及根据环境的变化自动调节工作状态。嵌入式技术相当于一个小型的计算机系统,根据不同的功能需求,进行配套的软硬件设计,可以实现各种智能化控制系统的特殊要求。智能家居将计算机、网络、通信等技术有效地结合起来,使家中的各类电器设施形成一个有效的整体,并以既定的控制策略根据环境变化进行自动控制。所以嵌入式技术软硬件灵活结合的特点与智能家居控制系统的需求相契合[1]。

QT 是一个跨平台的C++图形用户界面应用程序开发框架,它包含了很多自定义的C++类库,使用带UI 界面的QWidget 类可快捷地实现可视化图形界面APP 的编写,使用QTcpSocket 类则可实现网络通讯。智能网关运行Linux 系统,服务器程序使用线程池thread-pool 模式管理,防止在接收到一个新的请求时服务器反复创建线程、销毁进程的情况出现,提高CPU 的使用效率。ZigBee 技术是最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有可能应用在工控场合的无线方式,它使用2.4 GHz 波段,采用跳频技术和扩频技术[2]。

1 系统需求及总体设计

1.1 系统需求

在智能家居系统中,一般首先需要通过传感器检测环境中的温湿度、光照强度、气体浓度,然后根据参数控制家中的电器设备如风扇、电灯、蜂鸣报警器等,还需要设计一个客户端APP,用户登录后,可以远程控制电器设备或者通过摄像头远程监控[3-5]。

1.2 总体设计

系统主要由客户端、智能网关、电器控制端组成。用户在客户端界面进行注册、登录操作后,进入控制界面,界面中显示智能网关传来的电器工作状态信息。用户可以在界面中控制每个电器设备、显示摄像头监控画面,还可以获取互联网上的天气数据。用户端的操作以JSON 格式的自定义通信协议发送给智能网关服务器[6],智能网关服务器成功接收到信息后首先向客户端返回成功接收标志位。以注册功能为例,客户端与智能网关之间的通信协议如表1所示[7]。

表1 客户端与智能网关通讯协议Tab.1 Communication protocol between client and intelligent gateway

如果是用户登录、注册、找回密码操作时,对SQLITE数据库进行操作。如果接收到的数据是电器控制,则将对应的设备地址以及自定义功能码通过Modbus协议发送给电器控制端。如果控制端控制异常则会返回异常码[8]。部分自定义协议如表2所示。

表2 自定义Modbus 协议Tab.2 Custom Modbus protocol

使用跨平台GUI 开发工具QT 编写客户端APP。在使用Linux 系统的智能网关中编写好服务器程序,与上位机之间通过TCP/IP 协议通讯;智能网关再连接ZigBee 模块,使用Modbus 协议与电器控制器通讯。电器控制端使用Keil 配置CPU,获取传感器的数据以及对电器进行控制[9]。系统总体设计如图1所示。

图1 系统总体设计图Fig.1 System overall design drawing

2 系统硬件设计

2.1 智能家居控制网络硬件设计

ZigBee 采用的是CEL 公司的ZICM2410 模块,是集成CPU 的单片ZigBee 芯片,它集成了射频收发器、MAC 和带有FLASH 闪存的8051 内核,可支持与PC 的串口通讯以及1 Mbps 的无线通讯。Zig-Bee 网络基于IEEE802.15.4 国际标准,具有低功耗、低速率、高可靠性的特点。

智能网关采用的SOC 是三星公司的Exynos4412,是一款采用了基于ARM 公司Cortex-A9 架构四核CPU 的低成本、低功耗芯片,采用32 nm 工艺制程,主频可达1433 MHz 且集成了Mali-400MP 的GPU,GPU 主频可达400 MHz。该芯片采用64/128 位内部总线架构并集成了众多强大的硬件加速器。

2.2 电器控制端硬件设计

2.2.1 处理器

电器控制端采用的SOC 是NXP 公司的LPC111x,是一款采用了ARM 公司Cortex-M0 架构的微控制器,可用于高集成度和低功耗的嵌入式应用。M 系列处理器相比于A 系列处理器更偏向于控制,只能运行比较简单的操作系统(无法运行Linux),但是对于控制端足够满足要求,还可以节约成本、降低功耗。

2.2.2 传感器

光敏传感器使用的是ISL29002,这是一种具有集成光传感器内置的整合性ADC 和标准IIC 接口的光线强度检测传感器,该设备读取周围环境光线水平位照度,输出信号为数字量并且可以通过IIC协议访问[10]。

温湿度传感器使用的是DHT11,是一款运用数字模块采集技术和温湿度传感技术的温湿度复合传感器,输出的信号为数字量。具有响应快、体积小、抗干扰能力强、性价比高等优点,在智能家居、物联网领域应用广泛[11]。

3 系统软件设计

3.1 客户端APP

客户端使用Windows 系统中的QT4.6 软件编写,在QT 应用程序中,首先在main.cpp 中创建QWidget 对象,QWidget 类代表一般窗口,同时继承了QObect 和QPaintDevice 类,其他窗口都是从QWidget 类继承出来的,然后在login.ui 文件中可视化编辑智能家居系统的登录界面,如图2所示。

图2 登录界面Fig.2 Login interface

将UI 界面的按钮转到槽,并添加QAbstract-Button 类对象中的clicked()事件,QT 软件会自动生成槽函数声明以及对应信号函数。如果要做到UI界面跳转则需要先在父界面的头文件中添加子界面的声明,然后在父界面的cpp 文件中创建一个子界面类的对象,并调用该对象,同时关闭父界面的UI。

在login.cpp 中的部分代码如下:

新用户打开软件后首先需要点击注册按钮,进入注册界面,输入账号、密码、手机号即可注册。此时客户端APP 将已自定义结构体的方式将新用户的信息通过socket 请求传送给服务器,如果注册成功服务器也会通过socket 返回注册成功标识符。如果用户选择找回密码则进入“找回密码”界面,如图3所示。在该界面中用户需要填写自己注册时的账号和手机号。如果填写正确则进入修改密码界面,用户可以填写原用户名并输入新密码。

图3 找回密码界面Fig.3 Retrieve password interface

当用户输入正确的账号密码后,可进入智能家居管理系统的主界面,在主界面中可以手动控制LED、风扇、蜂鸣器的开关,实时显示由温湿度传感器获取的温湿度数据,从广域网中查询可城市的天气情况。查询天气情况时首先要在浏览器中的开发者工具中查看天气资讯网的get 地址,并获取其Body、Header 信息,使用在线HTTP 接口测试工具测试可以成功获取JSON 格式的天气数据之后,在weather.cpp 中进行JSON 数据解析,并通过QWidget类对象将数据显示到UI 界面上,其中查询天气的部分代码如下:

3.2 智能网关服务器

当新用户注册时,服务器通过socket 请求接收到用户信息,并在服务器中建立SQLite3 格式的数据库保存用户信息。SQLite 是一款应用于嵌入式领域的小型数据库,它和传统数据库之间最大的不同之处在于它的尺寸小和操作简单,它保持了大部分传统数据库的特征。相比于SQL 数据库更加轻量化且语句基本相同,不需要外部依赖且支持跨平台操作。服务器与客户端之间通过TCP 协议连接,首先设置服务器的监听套接字socket,然后绑定服务器的ip 地址与端口号,再设置socket 为被动监听,建立监听队列。接到客户端连接请求后,处理请求并进行3 次握手。最后需要对客户端发来的JSON 格式的自定义通讯协议进行处理。其中建立连接过程如图4所示。

图4 客户端与服务器建立连接流程Fig.4 Flow chart of establishing connection between client and server

服务器与客户端连接成功时,服务器就会创建一个新的线程,由该线程读取客户端传来的数据并执行相应操作任务,当操作任务执行完毕之后,线程就退出。由此可见每次客户端提交给服务器的连接次数频繁且任务操作简单、执行时间短。因此服务器就处于一个不停的创建线程和销毁线程的状态,非常消耗CPU 资源。所以需要运用thread-pool线程池模式来解决上述问题[12]。线程池的原理为在智能网关服务器启动之后,首先就创建一个由一定数量的线程组成的队列。这些线程由互斥量加锁,在访问完成后才会释放锁,目前处于阻塞状态,不占用CPU 资源。当服务器与客户端连接成功后,需要执行任务时,线程池将选择一个空闲进程,将任务传入此线程中运行。如果执行任务请求过多,导致队列中的所有线程都在上锁状态,线程池会另外创建一些新的进程去处理新任务,这些新进程也会加入到线程池之中。如果检测到有很多线程处于阻塞状态,线程池将自动销毁一些线程,从而减少内存占用,回收系统资源。

3.3 电器控制端

以控制LED 灯为例,首先查看底板的硬件原理图找到外设的控制方式,如图5所示。再查看核心板硬件原理图找到CPU 上控制LED 的引脚,如6图所示。当PIO3_0 输出低电平时,LED1 亮,输出高电平时LED1 灭。所以在程序中通过函数void GPIOSet Value(uint32_t portNum,uint32_t bitPosi,uint32_t bitVal)设置PIO3_0 的输出值来控制LED1的亮灭。比如使用函数GPIOSetValue(PORT3,0,0)将PIO3_0 输出1,从而点亮LED1。

图5 LED 硬件原理图Fig.5 LED hardware schematic diagram

图6 CPU 硬件原理图Fig.6 CPU hardware schematic diagram

4 系统测试与分析

4.1 手动控制阶段

在家中安装好智能网关、电器控制端后,打开客户端,输入智能网关IP 地址及端口号,测试能否成功建立TCP 连接并收发数据,测试客户端能否连上互联网获取天气信息,测试温湿度数据能否正常获取。然后在客户端APP 的电器设备控制界面手动点击灯、风扇、蜂鸣器的开关,看能否正常工作。如果手动测试中各项功能均正常,即可进入下一步自动控制模式测试。

4.2 自动控制模式测试

进入自动控制模式后,智能家居系统可以根据当前的环境自动做出控制策略。如果温湿度传感器测得的温度高于30℃或者湿度高于60%时,电器控制端会自动打开电风扇。当温度低于26°C 或者湿度低于40%时,电器控制端会自动关闭电扇。当气体传感器检测到CO 浓度高于50 ppm 时,蜂鸣器响提示用户CO 浓度过高。客户端流程如图7所示。

图7 客户端流程Fig.7 Client flow chart

5 结语

本文设计了一套基于QT 和智能网关的智能家居系统,详细介绍了系统的整体架构,给出了客户端的UI 界面QT 编写方法、智能网关服务器的软件实现方法以及电器控制端的配置方法。本系统不仅可以在客户端上远程控制家中的电器,更可以根据智能控制策略,自动控制电器的工作状态。还可以连上互联网,获取当地的天气情况、新闻资讯。经测试,该系统运行流畅、界面简洁明了、操作简单,能够实现家中环境检测、电器手动控制、电器自动控制,基本满足智能家居的功能需求,对提高人们生活质量水平有一定的工程实用价值[13]。

猜你喜欢
线程智能网电器
家中电器要“焕”新 这波惠民操作别错过
基于C#线程实验探究
5G赋能智能网联汽车
基于国产化环境的线程池模型研究与实现
奥田电器
智能网联硬实力趋强
迎战智能网联大爆发
电器创新设计两则
浅谈linux多线程协作
基于SJA1000的CAN总线智能网桥设计