電力線寬帶通信技術(shù)(PowerLine Communication 簡(jiǎn)稱PLC)是近幾年來迅速發(fā)展起來的一種新興的利用電力線網(wǎng)絡(luò)作為載體的通信技術(shù),。運(yùn)用嵌入式系統(tǒng)和電力線調(diào)制解調(diào)技術(shù)所構(gòu)建的電力線網(wǎng)絡(luò)通訊終端,人們可以很方便地在辦公室,、家庭內(nèi)部,、工業(yè)現(xiàn)場(chǎng)輕松地組建起局域網(wǎng)絡(luò),成為智能家庭、分布式工業(yè)過程控制的一種很好的系統(tǒng)構(gòu)造方式,,具有廣闊的應(yīng)用前景和市場(chǎng),。本應(yīng)用系統(tǒng)利用電力線終端平臺(tái)和路由器構(gòu)建電力線家庭內(nèi)部網(wǎng)絡(luò),實(shí)現(xiàn)家電,、安全防范及三表的集中管理,;對(duì)外通過寬帶連接Internet,遠(yuǎn)程終端通過軟件就可以對(duì)家用電器進(jìn)行狀態(tài)查詢和控制,。具體的構(gòu)建方式,在每個(gè)房間和客廳,、廚房中安放一個(gè)電力線通訊終端平臺(tái),掛載在電力線上形成家庭內(nèi)部網(wǎng)絡(luò),,集中管理所有的電器,,同時(shí)利用電力線調(diào)制解調(diào)模塊連接路由器,通過ADSL 上網(wǎng)的方式,,把整個(gè)家庭內(nèi)部網(wǎng)絡(luò)與Internet 交互,,使得遠(yuǎn)程終端可以通過Internet 網(wǎng)絡(luò)訪問家庭內(nèi)部局域網(wǎng)。
一,、系統(tǒng)的功能與設(shè)計(jì)
本應(yīng)用系統(tǒng)實(shí)現(xiàn)的主要功能如下:1) 實(shí)時(shí)監(jiān)控客廳中的溫度,,比如:在夏天如果超過33 度,,系統(tǒng)會(huì)主動(dòng)控制制冷空調(diào)打開;在冬天低于10 度則會(huì)打開制熱空調(diào),。2) 住宅安防系統(tǒng)能夠通過連接電力線通訊終端平臺(tái)和與之互連的GPRS 上傳安保信息,,比如:當(dāng)發(fā)生有人非法進(jìn)入住宅,,系統(tǒng)會(huì)實(shí)時(shí)通過Internet 網(wǎng)絡(luò)向事先設(shè)置的報(bào)警接收終端,,如110 報(bào)警臺(tái)、物業(yè)服務(wù)公司監(jiān)控室,、業(yè)主辦公室電話或業(yè)主手機(jī)等,,發(fā)送預(yù)警信息,。3) 主人可以通過遠(yuǎn)程終端訪問家用電器,,并且實(shí)行遠(yuǎn)程控制,比如開關(guān)日光燈,、打開電飯煲,,這樣下班回家后就可以吃到香噴噴的米飯,。
為了實(shí)現(xiàn)上述功能,,利用CPU 模塊上LPC2210 的GPIO(通用I/O)口連接繼電器控制家用電器的開關(guān),,比如:電飯煲,、空調(diào)和日光燈等;利用芯片外部中斷連接安防系統(tǒng),,當(dāng)系統(tǒng)報(bào)警時(shí)觸發(fā)外部中斷通知ARM CPU 使用GPRS 發(fā)送報(bào)警信息;同時(shí),,在硬件電路上安裝有LED 燈,、A/D 轉(zhuǎn)換電路用以實(shí)時(shí)測(cè)試,、顯示當(dāng)前各種家用電器的運(yùn)行狀態(tài)。該應(yīng)用系統(tǒng)涉及到電力線通訊平臺(tái)的編程和PC 的編程兩方面,。其中CPU 模塊(下位機(jī))作為服務(wù)器端,,使用TCP 作為通訊協(xié)議,提供服務(wù),。在服務(wù)器端收到服務(wù)請(qǐng)求后,解析請(qǐng)求,,根據(jù)不同的請(qǐng)求做出相應(yīng)的服務(wù)。而PC 作為客戶端發(fā)出服務(wù)請(qǐng)求,,并且在收到服務(wù)器的響應(yīng)后把具體內(nèi)容在屏幕上顯示出來。在本例中,,客戶端采用Qt 可視化編程環(huán)境,。以下,,首先介紹Qt 的相關(guān)知識(shí),,然后再具體分為服務(wù)器和客戶端具體的對(duì)該應(yīng)用設(shè)計(jì)進(jìn)行分析。
二,、Qt 介紹
Qt 是一個(gè)全面的C++應(yīng)用程序開發(fā)框架。它包含一個(gè)類庫和用于跨平臺(tái)及國(guó)際化開發(fā)的工具,。Qt 是一個(gè)全面的開發(fā)框架,它包括廣泛的特征,,性能與工具,,可以開發(fā)高性能,,跨平臺(tái)的客戶端,以及服務(wù)器端的應(yīng)用程序,。
同時(shí)Qt 對(duì)不同平臺(tái)(Unix, Windows,, and Mac)的專門API 進(jìn)行了封裝,,如文件處理,、網(wǎng)絡(luò)(操作,協(xié)議),,進(jìn)程處理、線程,、數(shù)據(jù)庫訪問等,。統(tǒng)一的跨平臺(tái)API 讓程序員們集中精力致力于可增值的技術(shù)革新,,而無須擔(dān)心維護(hù)和管理現(xiàn)有應(yīng)用程序多版本的基礎(chǔ)結(jié)構(gòu)與界面,。Qt 已由成千上成商業(yè)與開放源應(yīng)用程序開發(fā)員,在多個(gè)操作系統(tǒng)與編譯器上進(jìn)行了測(cè)試,,奠定了高性能與資源性應(yīng)用程序的基礎(chǔ),。Qt 無須“虛擬器”,模擬層或大容量的運(yùn)行時(shí)間環(huán)境,。它如本地化的應(yīng)用程序一樣,,直接寫入低級(jí)的圖形函數(shù),因而Qt 程序能以源代碼速度執(zhí)行,。通過使用 Trolltech 的雙重授權(quán)模式,,Qt 在商業(yè)支持并行之有效的框架下,呈現(xiàn)出開放源的所有優(yōu)勢(shì):開放源優(yōu)勢(shì)包括一個(gè)活動(dòng)的開放源開發(fā)員社團(tuán),。由于Qt的不間斷開發(fā),,以及完整的代碼透明性,允許Qt 開發(fā)員進(jìn)行“徹底深入地查看” ,,進(jìn)行自定義并擴(kuò)展Qt 來滿足其獨(dú)特的需求,。 商業(yè)產(chǎn)品的擔(dān)保包括客戶認(rèn)可的產(chǎn)品支持,專門的Qt 開發(fā)小組,,以及一個(gè)第三方工具,、組件與服務(wù)的成長(zhǎng)生態(tài)體系,。
(1)信號(hào)
當(dāng)某個(gè)信號(hào)其客戶或所有者發(fā)生內(nèi)部狀態(tài)改變時(shí),,信號(hào)被一個(gè)對(duì)象發(fā)射,。只有定義過這個(gè)信號(hào)的類及其派生類能夠發(fā)射這個(gè)信號(hào)。當(dāng)一個(gè)信號(hào)被發(fā)射時(shí),,與其相關(guān)聯(lián)的槽將被立刻執(zhí)行,,就象一個(gè)正常的函數(shù)調(diào)用一樣,。信號(hào)-槽機(jī)制完全獨(dú)立于 任何GUI 事件循環(huán),。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)(emit)才返回,。 如果存在多個(gè)槽與某個(gè)信號(hào)相關(guān)聯(lián),那么,,當(dāng)這個(gè)信號(hào)被發(fā)射時(shí),這些槽將會(huì)一個(gè)接一個(gè)地 執(zhí)行,,但是它們執(zhí)行的順序?qū)?huì)是隨機(jī)的、不確定的,,我們不能人為地指定哪個(gè)先執(zhí)行,、哪個(gè)后執(zhí)行。信號(hào)的聲明是在頭文件中進(jìn)行的,,Qt 的signals 關(guān)鍵字指出進(jìn)入了信號(hào)聲明區(qū),隨后即可 聲明自己的信號(hào),。
(2)槽
槽是普通的C++成員函數(shù),,可以被正常調(diào)用,,它們唯一的特殊性就是很多信號(hào)可以與其相關(guān)聯(lián),。當(dāng)與其關(guān)聯(lián)的信號(hào)被發(fā)射時(shí),,這個(gè)槽就會(huì)被調(diào)用。槽可以有參數(shù),,但槽的參數(shù)不能有缺省值。既然槽是普通的成員函數(shù),,因此與其它的函數(shù)一樣,,它們也有存取權(quán)限,。槽的存取權(quán)限決定了誰能夠與其相關(guān)聯(lián)。同普通的C++成員函數(shù)一樣,,槽函數(shù)也分為三種類型,即public slots,、private slots 和protected slots,。
三、服務(wù)器端
在本應(yīng)用中,,電力線通訊終端平臺(tái)連接家用電器作為服務(wù)器端,在實(shí)時(shí)顯示用電器狀態(tài)的同時(shí),,需要構(gòu)建一個(gè)TCP 服務(wù)器來為遠(yuǎn)程終端提供服務(wù),實(shí)現(xiàn)遠(yuǎn)程控制和報(bào)警的功能,。在基于QF 操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧中,由QL4 接口類來實(shí)現(xiàn)對(duì)L4 協(xié)議(傳輸層)的解析和處理抽象,。本應(yīng)用中需要派生一個(gè)QTcp 類,,實(shí)現(xiàn)傳輸層的TCP 協(xié)議,。
處理抽象,。本應(yīng)用中需要派生一個(gè)QTcp 類,,實(shí)現(xiàn)傳輸層的TCP 協(xié)議。一般基于 TCP 的網(wǎng)絡(luò)應(yīng)用程序都要繼承QTcp 類,,然后在ESTABLISHED 狀態(tài)中添加 子狀態(tài)完成特定的功能,。在服務(wù)器端,利用量子框架實(shí)現(xiàn)一個(gè)QServer 類,,是一個(gè)活動(dòng)對(duì)象,繼承自QTcp 類,。QServer 活動(dòng)對(duì)象同客戶端TCP Socket 連接后,,進(jìn)入ESTABLISHED狀態(tài)中,通過調(diào)用Recvfrom 函數(shù)接收客戶端的請(qǐng)求,,然后解析請(qǐng)求的服務(wù)類型,,根據(jù)不同請(qǐng)求做出不同的服務(wù),。其軟件流程圖如圖1 所示:
圖 1 QServer 活動(dòng)對(duì)象狀態(tài)流程圖
服務(wù)器端需要提供的具體服務(wù)包括:(1)當(dāng)接收到客戶端打開家用電器的請(qǐng)求是,使用GPIO口發(fā)出電平信號(hào),,通過繼電器打開相關(guān)的電器,。(2)監(jiān)控客廳中的溫度,在夏天如果超過33 度,,則會(huì)主動(dòng)控制制冷空調(diào)打開,。在冬天低于10度就會(huì)打開制熱空調(diào)。并及時(shí)地把空調(diào)開關(guān)的信息通過TCP 協(xié)議傳送給遠(yuǎn)程的終端,。(3)當(dāng)有人觸發(fā)了安防系統(tǒng),,發(fā)生外部中斷時(shí),使用服務(wù)器向客戶端發(fā)送報(bào)警信號(hào),。并通過GPRS給110 報(bào)警臺(tái),、物業(yè)服務(wù)公司監(jiān)控室、業(yè)主辦公室電話或業(yè)主手機(jī)等,,發(fā)送預(yù)警信息,。
四、 PC 客戶端
PC 機(jī)作為遠(yuǎn)程客戶端,,主要的工作是向服務(wù)器發(fā)出服務(wù)請(qǐng)求,,并且在收到服務(wù)器的響應(yīng)或者報(bào)警信號(hào)后把收到的具體內(nèi)容在屏幕上顯示以達(dá)到遠(yuǎn)程控制和報(bào)警的功能。在本例中,,我采用的是Qt 的可視化編程環(huán)境,。以下介紹客戶端的具體功能以及實(shí)現(xiàn):在客戶端可視化界面上按下日光燈或者電飯煲按鈕,就可以向服務(wù)器端發(fā)送一個(gè)開關(guān)家用電器的請(qǐng)求,,在服務(wù)器端收到請(qǐng)求后就會(huì)去執(zhí)行,;同理,,按下A/D 按鈕,,就可以發(fā)送一個(gè)讀取A/D 的請(qǐng)求,在收到服務(wù)器端采集的A/D 數(shù)值后,,客戶端就會(huì)在屏幕上顯示,;溫度的測(cè)量則是每隔兩秒就會(huì)發(fā)送一個(gè)請(qǐng)求,讀取當(dāng)前的溫度,,顯示在屏幕上,,并且判斷是否要打開空調(diào),并從服務(wù)器端讀取其狀態(tài)信息,更新空調(diào)的開關(guān)狀態(tài)欄,,顯示在文本框中,;當(dāng)服務(wù)器端安防系統(tǒng)檢測(cè)到有人入侵時(shí),就會(huì)向客戶端發(fā)送報(bào)警信號(hào),,客戶端需要相應(yīng)修改當(dāng)前的安防系統(tǒng)狀態(tài)為報(bào)警,。
首先使用Qt 的工具Qt Designer 設(shè)計(jì)界面。然后進(jìn)入具體的客戶端編程階段,,構(gòu)造一個(gè)窗體類為TcpClient 類,,具體的軟件編寫如下:
TcpClient::TcpClient(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this),;
adsocket= new QTcpSocket(this),; //用以傳輸A/D數(shù)據(jù)的TCP通道
tempsocket= new QTcpSocket(this); //用以傳輸溫度數(shù)據(jù)的TCP通道
applincesocket= new QTcpSocket(this),; //用以控制家用電器的TCP通道
securitysocket = new QTcpSocket(this); //用以安防系統(tǒng)報(bào)警的TCP通道
QTimer *temptimer = new QTimer(this),; //2S的定時(shí)器
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() ) ),;
}
動(dòng)態(tài)分配四個(gè)QTcpSocket(Qt 內(nèi)部對(duì)于TCP 協(xié)議的封裝類)對(duì)象,,分別用該類的對(duì)象指針adsocket、tempsocket,、appliancesocket,、securitysocket 來指向這四個(gè)對(duì)象。然后定義一個(gè)QTimer對(duì)象,,用來實(shí)現(xiàn)2 秒的定時(shí),。接著對(duì)一些信號(hào)和槽進(jìn)行連接,從而完成各個(gè)組件之間的通訊,,其中: QTimer 對(duì)象的timeout 信號(hào)和temp_update()槽連接,、adsocket 對(duì)象的connected 信號(hào)和ad_request()連接,adsocket 對(duì)象的readyRead 信號(hào)和ad_readresult()槽,。同理連接其他的幾個(gè)QTckSocket 對(duì)象的信號(hào)和槽,。
以下,具體描述如何實(shí)現(xiàn)溫度檢測(cè)和空調(diào)自動(dòng)控制的功能(其他功能的實(shí)現(xiàn)類似,,就不贅述):(1)定時(shí)器每隔2S 觸發(fā)一次,,客戶端使用tempsocket 連接服務(wù)器端后發(fā)送測(cè)溫請(qǐng)求,。(2)接收到服務(wù)器的溫度數(shù)據(jù)后在界面上顯示,并且根據(jù)要求決定是否需要啟動(dòng)空調(diào),。(3)利用appliancesocket 發(fā)送開啟或者關(guān)閉空調(diào)的命令,。并根據(jù)服務(wù)器端的執(zhí)行結(jié)果修改空調(diào)開關(guān)狀態(tài)欄顯示。
五,、結(jié)論
在實(shí)際的測(cè)試中,,服務(wù)器端運(yùn)行在實(shí)驗(yàn)室,連接有日光燈,、電飯煲和空調(diào),。客戶端運(yùn)行在寢室中,。本應(yīng)用在實(shí)現(xiàn)所有功能的基礎(chǔ)上,,電力線終端作為服務(wù)器連續(xù)開機(jī)一周,并進(jìn)行高流量的負(fù)荷測(cè)試,,能夠穩(wěn)定運(yùn)行,,所有功能均表現(xiàn)正常,沒有發(fā)生故障,。從而驗(yàn)證了本終端的穩(wěn)定性和該智能家居應(yīng)用的可行性,。