基于电力线传输媒介的通信终端设计

2010年11月17日 17:31    发布者:conniede
电力线宽带通信技术(PowerLine Communication 简称PLC)是近几年来迅速发展起来的一种新兴的利用电力线网络作为载体的通信技术。运用嵌入式系统和电力线调制解调技术所构建的电力线网络通讯终端,人们可以很方便地在办公室、家庭内部、工业现场轻松地组建起局域网络,成为智能家庭、分布式工业过程控制的一种很好的系统构造方式,具有广阔的应用前景和市场。本应用系统利用电力线终端平台和路由器构建电力线家庭内部网络,实现家电、安全防范及三表的集中管理;对外通过宽带连接Internet,远程终端通过软件就可以对家用电器进行状态查询和控制。具体的构建方式,在每个房间和客厅、厨房中安放一个电力线通讯终端平台,挂载在电力线上形成家庭内部网络,集中管理所有的电器,同时利用电力线调制解调模块连接路由器,通过ADSL 上网的方式,把整个家庭内部网络与Internet 交互,使得远程终端可以通过Internet 网络访问家庭内部局域网。

一、系统的功能与设计

本应用系统实现的主要功能如下:

1) 实时监控客厅中的温度,比如:在夏天如果超过33 度,系统会主动控制制冷空调打开;在冬天低于10 度则会打开制热空调。

2) 住宅安防系统能够通过连接电力线通讯终端平台和与之互连的GPRS 上传安保信息,比如:当发生有人非法进入住宅,系统会实时通过Internet 网络向事先设置的报警接收终端,如110 报警台、物业服务公司监控室、业主办公室电话或业主手机等,发送预警信息。

3) 主人可以通过远程终端访问家用电器,并且实行远程控制,比如开关日光灯、打开电饭煲,这样下班回家后就可以吃到香喷喷的米饭。

为了实现上述功能,利用CPU 模块上LPC2210 的GPIO(通用I/O)口连接继电器控制家用电器的开关,比如:电饭煲、空调和日光灯等;利用芯片外部中断连接安防系统,当系统报警时触发外部中断通知ARM CPU 使用GPRS 发送报警信息;同时,在硬件电路上安装有LED 灯、A/D 转换电路用以实时测试、显示当前各种家用电器的运行状态。该应用系统涉及到电力线通讯平台的编程和PC 的编程两方面。其中CPU 模块(下位机)作为服务器端,使用TCP 作为通讯协议,提供服务。在服务器端收到服务请求后,解析请求,根据不同的请求做出相应的服务。而PC 作为客户端发出服务请求,并且在收到服务器的响应后把具体内容在屏幕上显示出来。在本例中,客户端采用Qt 可视化编程环境。以下,首先介绍Qt 的相关知识,然后再具体分为服务器和客户端具体的对该应用设计进行分析。

二、Qt 介绍

Qt 是一个全面的C++应用程序开发框架。它包含一个类库和用于跨平台及国际化开发的工具。Qt 是一个全面的开发框架,它包括广泛的特征,性能与工具,可以开发高性能,跨平台的客户端,以及服务器端的应用程序。

同时Qt 对不同平台(Unix, Windows, and Mac)的专门API 进行了封装,如文件处理、网络(操作,协议),进程处理、线程、数据库访问等。统一的跨平台API 让程序员们集中精力致力于可增值的技术革新,而无须担心维护和管理现有应用程序多版本的基础结构与界面。Qt 已由成千上成商业与开放源应用程序开发员,在多个操作系统与编译器上进行了测试,奠定了高性能与资源性应用程序的基础。Qt 无须“虚拟器”,模拟层或大容量的运行时间环境。它如本地化的应用程序一样,直接写入低级的图形函数,因而Qt 程序能以源代码速度执行。通过使用 Trolltech 的双重授权模式,Qt 在商业支持并行之有效的框架下,呈现出开放源的所有优势:开放源优势包括一个活动的开放源开发员社团。由于Qt的不间断开发,以及完整的代码透明性,允许Qt 开发员进行“彻底深入地查看” ,进行自定义并扩展Qt 来满足其独特的需求。 商业产品的担保包括客户认可的产品支持,专门的Qt 开发小组,以及一个第三方工具、组件与服务的成长生态体系。

(1)信号

当某个信号其客户或所有者发生内部状态改变时,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号-槽机制完全独立于 任何GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。信号的声明是在头文件中进行的,Qt 的signals 关键字指出进入了信号声明区,随后即可 声明自己的信号。

(2)槽

槽是普通的C++成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样,槽函数也分为三种类型,即public slots、private slots 和protected slots。

三、服务器端

在本应用中,电力线通讯终端平台连接家用电器作为服务器端,在实时显示用电器状态的同时,需要构建一个TCP 服务器来为远程终端提供服务,实现远程控制和报警的功能。在基于QF 操作系统的网络协议栈中,由QL4 接口类来实现对L4 协议(传输层)的解析和处理抽象。本应用中需要派生一个QTcp 类,实现传输层的TCP 协议。

处理抽象。本应用中需要派生一个QTcp 类,实现传输层的TCP 协议。一般基于 TCP 的网络应用程序都要继承QTcp 类,然后在ESTABLISHED 状态中添加 子状态完成特定的功能。在服务器端,利用量子框架实现一个QServer 类,是一个活动对象,继承自QTcp 类。QServer 活动对象同客户端TCP Socket 连接后,进入ESTABLISHED状态中,通过调用Recvfrom 函数接收客户端的请求,然后解析请求的服务类型,根据不同请求做出不同的服务。其软件流程图如图1 所示:


图 1 QServer 活动对象状态流程图
服务器端需要提供的具体服务包括:(1)当接收到客户端打开家用电器的请求是,使用GPIO口发出电平信号,通过继电器打开相关的电器。(2)监控客厅中的温度,在夏天如果超过33 度,则会主动控制制冷空调打开。在冬天低于10度就会打开制热空调。并及时地把空调开关的信息通过TCP 协议传送给远程的终端。(3)当有人触发了安防系统,发生外部中断时,使用服务器向客户端发送报警信号。并通过GPRS给110 报警台、物业服务公司监控室、业主办公室电话或业主手机等,发送预警信息。

四、 PC 客户端

PC 机作为远程客户端,主要的工作是向服务器发出服务请求,并且在收到服务器的响应或者报警信号后把收到的具体内容在屏幕上显示以达到远程控制和报警的功能。在本例中,我采用的是Qt 的可视化编程环境。以下介绍客户端的具体功能以及实现:在客户端可视化界面上按下日光灯或者电饭煲按钮,就可以向服务器端发送一个开关家用电器的请求,在服务器端收到请求后就会去执行;同理,按下A/D 按钮,就可以发送一个读取A/D 的请求,在收到服务器端采集的A/D 数值后,客户端就会在屏幕上显示;温度的测量则是每隔两秒就会发送一个请求,读取当前的温度,显示在屏幕上,并且判断是否要打开空调,并从服务器端读取其状态信息,更新空调的开关状态栏,显示在文本框中;当服务器端安防系统检测到有人入侵时,就会向客户端发送报警信号,客户端需要相应修改当前的安防系统状态为报警。

首先使用Qt 的工具Qt Designer 设计界面。然后进入具体的客户端编程阶段,构造一个窗体类为TcpClient 类,具体的软件编写如下:

TcpClient::TcpClient(QWidget *parent)

: QWidget(parent)

{

ui.setupUi(this);

adsocket= new QTcpSocket(this); //用以传输A/D数据的TCP通道

tempsocket= new QTcpSocket(this); //用以传输温度数据的TCP通道

applincesocket= new QTcpSocket(this); //用以控制家用电器的TCP通道

securitysocket = new QTcpSocket(this); //用以安防系统报警的TCP通道

QTimer *temptimer = new QTimer(this); //2S的定时器

connect(temptimer,SIGNAL(timeout()),this,SLOT(temp_update()));

temptimer->start(2000);

connect( adsocket,SIGNAL( connected() ),this, SLOT( ad_request() ) );

connect( adsocket,SIGNAL( readyRead() ), this, SLOT( ad_readresult() ) );

connect( tempsocket,SIGNAL( connected() ),this,SLOT( lm_request() ) );

connect( tempsocket,SIGNAL( readyRead() ),this,SLOT( lm_readresult() ) );

connect(appliancesocket,SIGNAL( connected() ), this,SLOT( appliance_request() ) );

connect(securitysocket,SIGNAL( readyRead() ),this,SLOT( security_readresult() ) );

}

动态分配四个QTcpSocket(Qt 内部对于TCP 协议的封装类)对象,分别用该类的对象指针adsocket、tempsocket、appliancesocket、securitysocket 来指向这四个对象。然后定义一个QTimer对象,用来实现2 秒的定时。接着对一些信号和槽进行连接,从而完成各个组件之间的通讯,其中: QTimer 对象的timeout 信号和temp_update()槽连接、adsocket 对象的connected 信号和ad_request()连接,adsocket 对象的readyRead 信号和ad_readresult()槽。同理连接其他的几个QTckSocket 对象的信号和槽。

以下,具体描述如何实现温度检测和空调自动控制的功能(其他功能的实现类似,就不赘述):

(1)定时器每隔2S 触发一次,客户端使用tempsocket 连接服务器端后发送测温请求。

(2)接收到服务器的温度数据后在界面上显示,并且根据要求决定是否需要启动空调。

(3)利用appliancesocket 发送开启或者关闭空调的命令。并根据服务器端的执行结果修改空调开关状态栏显示。

五、结论

在实际的测试中,服务器端运行在实验室,连接有日光灯、电饭煲和空调。客户端运行在寝室中。本应用在实现所有功能的基础上,电力线终端作为服务器连续开机一周,并进行高流量的负荷测试,能够稳定运行,所有功能均表现正常,没有发生故障。从而验证了本终端的稳定性和该智能家居应用的可行性。