新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Linux/Qt的智能家居系統設計

        基于Linux/Qt的智能家居系統設計

        作者: 時間:2013-02-25 來源:網絡 收藏

        針對的特點及應用背景,了一種家庭多功能控制。該采用飛思卡爾公司ARM Cortex A8系列的i.MX51處理器作為MCU,在其上移植嵌入式Linux作為軟件開發平臺,并利用Qt相關技術為基礎友好的用戶界面,實現了ARM板的各功能模塊與服務器端的交互。同時具備數字可視對講、信息收發、家電控制、安防報警、家庭娛樂等功能。

        本文引用地址:http://www.104case.com/article/148088.htm

        1 系統的架構和功能

        家庭智能控制系統主要由室內分機、單元門口機、小區圍墻機、管理中心終端機、管理中心服務器以及附件組成。系統采用分布式網絡結構,可以根據住戶數量對系統的容量進行擴充。

        (1)室內機是用戶在室內進行操作的主要平臺,其功能組成為:可視對講、信息服務、家電控制、安防報警、家庭娛樂等。可視對講模塊主要實現雙向可視通話、視頻監控、留言/留影、開鎖等功能;信息服務模塊主要用來收發物業信息和小區廣播,支持文本、圖片形式,并實現與可視對講模塊的影音共享;家電控制模塊包括對燈光、窗簾、空調、電梯等設施的無線控制,并預設了情境模式;安防報警模塊支持對煙感、門磁、煤氣泄漏檢測等的自動報警,并可通過GPRS/3G技術將報警信息傳送到用戶手機上;家庭娛樂模塊支持常見格式的音視頻文件的播放(主要依靠硬件解碼)以及對常見格式的圖片的瀏覽(電子相框)。

        (2)單元門口機的主要功能是完成與所在單元樓的任意住戶以及管理中心機的可視通話,除了具備留言/留影功能外,還提供觸摸屏校準、背光調節、密碼設置等功能。

        (3)圍墻機的基本功能和單元門口機類似,但可視對講、留言/留影功能是針對小區內所有住戶的。

        (4)中心機是整個系統的神經中樞,管理人員通過管理中心的控制設備管理各子系統的終端,其功能包括:可視對講、視頻監控、查看報警信息、排除設備故障、信息服務、系統設置、遠程管理等。

        2 系統的實現方案

        2.1 Qt的信號/槽機制

        Qt是一個跨平臺的C++應用程序框架,完全面向對象、易于擴展且允許真正的組件編程。Qt的C++類庫封裝了適應不同操作系統的訪問細節,這使得它能夠快速地部署于各種桌面與嵌入式系統中[1]。

        信號/槽機制是 Qt 的核心特性,這種機制真正實現了消息的封裝,完全可以取代原始的回調和消息機制。信號和槽的連接通過connect()函數完成,connect()函數是QObject類中的靜態函數,其函數原型如下:

        Bool QObject::connect(const QObject* sender,

        const char*signal,const QObject* receiver,const char* member)

        其中,sender和receiver是指向QObject的指針,signal和slot是不帶有參數的函數名。

        2.2 XML格式的Socket多線程通信

        Linux中的網絡編程主要通過Socket接口實現,在Qt環境里,對Socket進行了封裝,并建立了相應的QTcpSocket類來實現TCP客戶端和服務器的通信。QTcpSocket繼承了QIODevice,所以QTcpSocket可以使用QDataStream進行數據的讀取和寫入。

        可擴展標記語言XML(eXtensible Markup Language)是一種用于數據交換和數據存儲的多用途文本格式。對于XML格式的數據,Qt中的QtXml模塊提供了DOM和SAX兩種處理方式。本文采用的DOM方式把XML文檔轉換成一個可以遍歷的樹形結構,這樣便可以隨意訪問其中的節點,因此要明顯簡潔得多。

        室內機和中心機之間的通信采用多線程方式實現。多線程方式具有降低內存、提高程序響應速度等優點,特別適用于嵌入系統。系統中建立了三個主線程:(1)GUI線程:用于執行main()主函數,響應用戶的界面操作;(2)tcpServer偵聽線程:用于對指定端口進行監聽;(3)tcpSocket傳輸線程:負責消息的接收和回復。下面以用戶主動更新小區廣播為例詳細說明Socket通信的流程:(1)室內機首先啟動一個線程,將用戶的更新請求結構轉化成標準的XML格式(如果是新設備第一次開機,要先手動進行IP的設置),(2)調用connectToHost()函數請求與中心機建立連接,處于監聽狀態的中心機接到請求后,就會分配一個Socket套接字來處理連接:首先根據解析出來的XML的Type節點判斷請求類型,如果是純文本則從數據庫的Text表讀取,如果是圖片則從硬盤讀取,然后調用QIODevice::write()函數發送;(3)室內機接到應答信號readyRead()后就開始進行信息的收取,根據消息的Type節點類型分別寫入數據庫和硬盤。Socket多線程通信流程如圖1所示。

        2.3 并行數據庫

        為了實現數據庫的并行操作,使GUI界面與數據庫相分離,從而讓界面能更快地響應用戶的一般操作,同樣要用到Qt的多線程編程。在系統啟動時,首先要建立一個全局對象m_query,以便于各個實體類與數據庫類進行連接。這樣,每當有數據庫操作請求時便會實例化一個m_query來創建一個線程用于處理該請求。m_query對象中包含兩個類:(1)QueryThread,用于為每個數據操作創建一個線程;(2)Worker,用于實現數據庫的相關操作,如加載數據庫驅動、進行數據查詢/插入/刪除等。

        圖2為數據庫的查詢操作流程。首先在實體類里創建兩個connect連接,分別用于發送和接收查詢結果,并生成SQL語句向QueryThread提交查詢請求信號。QueryThread收到請求后為其創建一個線程,并交由Worker類進行具體數據庫查詢操作。Worker類得出查詢結果后,先傳遞給QueryThread,再由其將查詢結果返回到實體類。

        關鍵代碼如下:

        connect( this,SIGNAL(seek(const QString ) ),m_query,

        SIGNAL(seek_execute(const QString )) );

        connect( m_query,SIGNAL(seek(const QList

        ) ),this,SLOT( slotResult( const QList ) ) );

        void text:: database() {

        QString sql = select * from Text order by date desc ;

        emit seek_execute (sql);

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 金坛市| 农安县| 巩义市| 临沧市| 兴安盟| 碌曲县| 肥东县| 年辖:市辖区| 那曲县| 德化县| 怀集县| 石渠县| 收藏| 奉贤区| 泰顺县| 连江县| 定西市| 宝鸡市| 改则县| 治多县| 前郭尔| 丹凤县| 九龙县| 汤阴县| 四子王旗| 河北省| 道孚县| 明光市| 东宁县| 石屏县| 抚顺市| 阳山县| 寻甸| 保靖县| 阿勒泰市| 达孜县| 关岭| 鸡泽县| 铁力市| 宝丰县| 仁怀市|