楊曉東 糜元根
南京工業(yè)大學信息科學與工程學院 江蘇 210009
本系統(tǒng)在用戶操作過程中,把交互信息寫入本地數(shù)據(jù)庫,并且同時更新遠程數(shù)據(jù)庫。系統(tǒng)設計兩個數(shù)據(jù)庫的目的也是為了在網(wǎng)絡不順暢的時候,用戶也可以及時購電。管理員可以在遠程數(shù)據(jù)庫上對用戶數(shù)據(jù)進行統(tǒng)一管理。
為了與用戶有很好的交互性,需要設計圖形界面便于用戶操作。常見的圖形界面設計方法是QT和MiniGUI,綜合考慮了系統(tǒng)的硬件,本系統(tǒng)采用MiniGUI進行圖形界面設計。MiniGUI是由北京飛漫軟件技術(shù)有限公司主持的自由軟件,遵循GPL條款發(fā)布。其目的是為實時嵌入式Linux系統(tǒng)建立一個快速、穩(wěn)定和輕量級的圖形用戶界面支持系統(tǒng)。本系統(tǒng)采用的MiniGUI 1.3.1版本,可以從http://www. minigui.com上下載。
用于處理事件的窗口例程通常標志了某一個“窗口類”,具有相同窗口例程的窗口實例被認為是屬于同一窗口類。
焦點和光標的概念用于管理輸入設備和輸入事件的發(fā)送。鼠標光標是一個繪制在屏幕之上的小位圖,指示當前的鼠標位置。以某種非破壞性的方式繪制該位圖是窗口系統(tǒng)的責任,不過應用程序可以控制繪制哪一個位圖以及是否顯示該光標。應用程序還可以捕捉鼠標光標并獲取光標事件,即使該光標已經(jīng)超出該應用程序窗口的顯示范圍。鍵盤輸入有類似的輸入焦點和鍵盤輸入插入符的概念。只有具有輸入焦點的窗口才能獲取鍵盤事件。改變窗口的焦點通常由特殊的按鍵組合或者鼠標光標事件完成。具有輸入焦點的窗口通常繪制有一個鍵盤插入符。該插入符的存在、形式、位置,以及該插入符的控制完全是由窗口的事件處理例程完成的。
應用程序可通過調(diào)用一些系統(tǒng)函數(shù)來要求重繪窗口或窗口的某一部分,這些事件通常由窗口例程來處理。
1.1.1 事件驅(qū)動編程
1.1.2 MiniGUI-Lite和MiniGUI-Threads
MiniGUI是一個圖形用戶界面支持系統(tǒng),通常的GUI編程概念均適用于MiniGUI編程,如窗口和事件驅(qū)動編程等。
在傳統(tǒng)的GUI圖形系統(tǒng)模型中,鍵盤和鼠標動作產(chǎn)生由應用程序不斷輪詢的事件。這些事件通常發(fā)送到具有焦點的窗口,而應用程序把這些事件交由和該窗口相關(guān)聯(lián)的例程來處理。這些窗口例程通常是由應用程序定義的,或者是某些標準例程中的一個。操作系統(tǒng)、其它窗口的事件處理例程和應用程序代碼都可以產(chǎn)生事件。
在編寫第一個MiniGUI程序之前,我們需要了解一個事實:我們可將MiniGUI配置編譯成兩個架構(gòu)上截然不同的版本——MiniGUI-Lite版或MiniGUI-Threads版。
MiniGUI的早期版本(即 MiniGUI-Threads)采用基于POSIX線程的消息傳遞和窗口管理機制,這種實現(xiàn)提供最大程度上的數(shù)據(jù)共享,但同時造成了MiniGUI體系結(jié)構(gòu)上的脆弱。
如果某個線程因為非法的數(shù)據(jù)訪問而終止運行,則整個系統(tǒng)將受到影響。為了解決這個問題,使MiniGUI更符合嵌入式系統(tǒng)的應用需求,MiniGUI從0.98開始推出Lite版本。Lite版本的MiniGUI使用進程機制,拋棄了pThread庫,從而使得MiniGUI更穩(wěn)定和更高效率。
在 MiniGUI Lite版本中,我們可以同時運行多個MiniGUI應用程序。首先我們啟動一個服務器程序mginit,然后我們可以啟動其他作為客戶端運行的 MiniGUI應用程序。如果因為某種原因客戶終止,服務器不受影響,可以繼續(xù)運行。
MiniGUI-Lite區(qū)別于MiniGUI-Threads的最大不同在于我們可以在MiniGUI-Lite程序中創(chuàng)建多個窗口,但不能啟動新的線程建立窗口。除此之外,其他幾乎所有的 API都和MiniGUI原有版本是兼容的。
MiniGUI-Threads適合于多窗口、實時性要求很高的系統(tǒng),比如工業(yè)控制系統(tǒng);而MiniGUI-Lite適合于功能豐富、結(jié)構(gòu)復雜系統(tǒng),比如PDA等信息產(chǎn)品。而且MiniGUI-Threads可以通過MiniGUI的消息函數(shù),可在不同的線程之間傳遞消息,相比較而言,本系統(tǒng)采用前者。
1.1.3 窗口及窗口過程
窗口是屏幕上的一個矩形區(qū)域。在傳統(tǒng)的窗口系統(tǒng)模型中,應用程序的可視部分由一個或多個窗口構(gòu)成。每一個窗口代表屏幕上的一塊繪制區(qū)域,窗口系統(tǒng)控制該繪制區(qū)域到實際屏幕的映射,也就是控制窗口的位置、大小和可見區(qū)域。每個窗口被分配一個屏幕繪制區(qū)域來顯示本窗口的部分或全部,也許根本沒有分配到屏幕區(qū)域(該窗口完全被其它的重疊窗口所覆蓋和隱藏)。
MiniGUI中有三種窗口類型:主窗口、對話框和控件窗口(子窗口)。每一個MiniGUI應用程序一般都要創(chuàng)建一個主窗口,作為應用程序的主界面或開始界面。主窗口通常包括一些子窗口,這些子窗口通常是控件窗口,也可以是自定義窗口類。應用程序還會創(chuàng)建其它類型的窗口,例如對話框和消息框。對話框本質(zhì)上就是主窗口,應用程序一般通過對話框提示用戶進行輸入操作。消息框是用于給用戶一些提示或警告的主窗口,屬于內(nèi)建的對話框類型。
一旦窗口建立之后,窗口就會從消息隊列當中獲取屬于自己的消息,然后交由它的窗口過程進行處理。窗口過程函數(shù)主要是對屬于該窗體的不同消息進行相應的處理。窗口過程函數(shù)通常使用switch語句來對各種消息(message)進行處理。
當前,Socket接口是TCP/IP網(wǎng)絡最為通用的API,也是在Internet上進行應用開發(fā)最為通用的API。它是介于應用層和傳輸層之間的編程接口,它提供了訪問下層通信協(xié)議的大量系統(tǒng)調(diào)用和相應的數(shù)據(jù)結(jié)構(gòu)功能。在Linux系統(tǒng)中,Socket是應用程序訪問下層網(wǎng)絡協(xié)議的惟一方法。具體地講,Socket在用戶級實現(xiàn)了兩個應用程序之間的網(wǎng)絡連接和數(shù)據(jù)交換,所以Linux中的Socket意味著網(wǎng)絡上的通信。
我們在做網(wǎng)絡傳輸數(shù)據(jù)功能時,采用了客戶端/服務器(C/S)網(wǎng)絡通信:服務器端守護進程不斷的監(jiān)聽、等待連接;客戶端向遠程服務器發(fā)送連接請求,服務器端收到請求后,按照一定的規(guī)則建立連接,連接完成后,兩個程序之間就建立了一個虛擬的數(shù)據(jù)通信鏈路。這些程序可以直接從自己打開的套接口讀入和寫出數(shù)據(jù),而不用關(guān)心實際的數(shù)據(jù)鏈路。具體實現(xiàn)過程見圖1。
圖1 基于TCP協(xié)議的socket傳輸流程圖
SQLite是2000年開發(fā)出來的一種小型嵌入式數(shù)據(jù)庫。它是一個小型的C語言鏈接庫,這個鏈接庫本身就完全包含數(shù)據(jù)庫引擎的功能,可以方便地運用于嵌入式系統(tǒng)中。SQLite提供了對SQL92的大多數(shù)支持,支持多表、索引、事務、視圖和觸發(fā)等一系列用戶接口以及驅(qū)動。簡單易用,速度也相當?shù)每?,同時提供了豐富的數(shù)據(jù)庫接口。這個庫具有很強的內(nèi)聚性,通過不到25000行的ANSIC代碼實現(xiàn),而且它的源代碼完全開放,可以自由地應用于任何領(lǐng)域。
在與MiniGUI的連接中,SQLite的API及其易于使用,完全可以對嵌入式數(shù)據(jù)庫進行基本的操作,如建立表格、查詢、修改、插入、刪除、排序等,只需要三個用來執(zhí)行SQL和獲取數(shù)據(jù)的函數(shù)。此外它還是可以擴展的,允許自定義函數(shù),然后以Callback(回調(diào)函數(shù))的形式傳遞進去。
本系統(tǒng)的軟件設計分為客戶端(終端)程序設計和服務器端程序設計,主要是客戶端程序設計,服務器端主要是一個接收數(shù)據(jù)并更新數(shù)據(jù)庫的守護進程程序。
在客戶端,登錄系統(tǒng)后進入主界面,主界面包括6個功能界面選擇按鈕,具體系統(tǒng)流程如圖2所示。
圖2 系統(tǒng)主流程圖
數(shù)據(jù)庫服務器端采用 Fedora 7作為服務器操作系統(tǒng),sqlite3作為數(shù)據(jù)庫,系統(tǒng)啟動后自動運行守護進程,這包括:建立套接字、綁定地址、開始監(jiān)聽并等待客戶端的連接,收到數(shù)據(jù)后更新本地數(shù)據(jù)庫,并將操作記錄寫入設定好的日志文件中,循環(huán)執(zhí)行以上過程。服務器端流程圖如圖3所示。
圖3 服務器端流程圖
經(jīng)測試,本系統(tǒng)完全符合人性化設計,購電方便,操作系統(tǒng)界面友好,簡單。每個用戶必須憑ID和密碼才能登錄,同時密碼忘記后可以通過短信貓將密碼發(fā)送到用戶賬號登記的手機中,從而大大的增強了系統(tǒng)的安全性。在有網(wǎng)絡的情況下,本地數(shù)據(jù)庫能與遠程數(shù)據(jù)庫及時更新,做到數(shù)據(jù)實時準確無誤。稍微有點遺憾的是,由于本系統(tǒng)過于龐大未能全面展開。
[1] 韓超.嵌入式GUI開發(fā)設計—基于MiniGUI[M].北京:電子工業(yè)出版社.2009.
[2] 李亞鋒,歐文盛. ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學出版社.2007.