曹龍+劉煒+曾力
摘 要 利用Qt on Android平臺設(shè)計出了一種針對空氣質(zhì)量監(jiān)測系統(tǒng)的Android手機客戶端,該客戶端實現(xiàn)了手機與服務(wù)器的信息交互,使得用戶可以通過手機方便快捷的查詢選定監(jiān)測端當(dāng)前的空氣質(zhì)量數(shù)據(jù),實現(xiàn)了室內(nèi)環(huán)境監(jiān)測的網(wǎng)絡(luò)化。同時為C/C++程序員在Android平臺開發(fā)APP提供了范例。
【關(guān)鍵詞】Qt on Android 空氣質(zhì)量 監(jiān)測 C/S XML
1 引言
Android平臺已成為智能手機領(lǐng)域舉足輕重的平臺,由于其只支持Java開發(fā)應(yīng)用,對C/C++開發(fā)的支持有限,大多數(shù)C/C++程序員若想進行Android平臺的開發(fā)只好轉(zhuǎn)型。而Qt on Android的出現(xiàn)為眾多C/C++程序員提供了福音。利用Qt Creator可以輕松將Qt程序部署到Android平臺上,從而實現(xiàn)Qt在Android平臺上的應(yīng)用。筆者設(shè)計了一種針對空氣質(zhì)量監(jiān)測系統(tǒng)的Android手機客戶端,為操作人員提供更加靈活的環(huán)境監(jiān)測手段,隨時獲取環(huán)境信息。
2 手機客戶端的軟件功能
空氣質(zhì)量監(jiān)測系統(tǒng)手機客戶端的主要作用是按照用戶的需求,向服務(wù)器發(fā)出相應(yīng)的請求,從而獲取當(dāng)前室內(nèi)的溫度、濕度、光照強度、PM2.5和氨硫類氣體等環(huán)境數(shù)據(jù)信息,并對數(shù)據(jù)進行解析后存儲,通過相應(yīng)的控件在手機上顯示出來,從而實現(xiàn)室內(nèi)環(huán)境監(jiān)測的網(wǎng)絡(luò)化、智能化。
手機客戶端軟件主要由用戶登錄模塊、用戶注冊模塊、通信設(shè)置模塊、室內(nèi)環(huán)境數(shù)據(jù)顯示界面,數(shù)據(jù)曲線繪制模塊等組成。其結(jié)構(gòu)如圖1所示。
登錄模塊:主要實現(xiàn)用戶的登錄功能。當(dāng)手機客戶端發(fā)出登錄請求后,服務(wù)器匹配用戶數(shù)據(jù)庫的信息,若匹配成功,則返回登錄成功的指令,進入數(shù)據(jù)顯示界面。
注冊模塊:為用戶提供注冊功能。用戶確定注冊信息后,服務(wù)器將用戶名和密碼信息查詢用戶數(shù)據(jù)庫中用戶是否已存在,若用戶名不存在,則完成注冊,否則提示用戶出錯。
網(wǎng)絡(luò)設(shè)置:設(shè)置客戶端網(wǎng)絡(luò)連接的服務(wù)器IP和端口。
數(shù)據(jù)顯示界面:客戶端登錄后會實時顯示當(dāng)前時段各個終端的數(shù)據(jù)情況;點擊對應(yīng)的圖標(biāo)會進入數(shù)據(jù)曲線顯示界面。如圖2所示。
客戶端中界面設(shè)計采用堆棧的思想,使用QStackedWidget類對各個界面進行存放,將不同的widget使用UI控件類將其放進該類的對象中,并進行編號,也可顯式編號,默認(rèn)從0開始。利用Qt中的信號與槽機制(singnals and slots),可以很好的實現(xiàn)各個界面的切換,以界面中的“登錄”功能為例,當(dāng)用戶點擊“DL_Btn”控件(登錄按鈕名稱)時,控件發(fā)出信號clicked(),從而觸發(fā)與之相關(guān)聯(lián)的槽函數(shù)on_DL_Btn_clicked(),在函數(shù)中處理登錄過程的信息交互,當(dāng)滿足登錄條件時,調(diào)用setCurrentIndex(int) 來顯示該頁號的widget。進入數(shù)據(jù)顯示界面。
3 手機客戶端與服務(wù)器的通信
該平臺采用C/S(Client/Server)結(jié)構(gòu),客戶端程序與服務(wù)器通過Socket套接字建立TCP/IP連接,從而實現(xiàn)客戶端與服務(wù)器的網(wǎng)絡(luò)數(shù)據(jù)通信。在Qt中QTcpSocket類為TCP提供了一個接口,可以使用QTcpSocket來實現(xiàn)標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議。
服務(wù)器啟動后,調(diào)用QTcpServer::listen()函數(shù)來設(shè)置服務(wù)器的IP及端口號,如server->listen(QHostAddress::Any,ui->txtPort->text().toInt()),使服務(wù)器進入監(jiān)聽狀態(tài),等待客戶端的連接。配置代碼如下:
bool ok=server->listen(QHostAddress::Any,ui->txtPort->text().toInt());//啟動監(jiān)聽
客戶端負(fù)責(zé)建立Socket連接,用戶輸入用戶名和密碼進行登錄后,系統(tǒng)進入Sockt連接槽函數(shù),通過QTcpSocket::connectToHost()函數(shù)建立與服務(wù)器的連接,同時使用QTcpSocket::waitForConnected()函數(shù)設(shè)置連接超時時間。Socket連接成功后,服務(wù)器就可以接收客戶端發(fā)出的請求信息,與客戶端進行環(huán)境信息的交互。部分代碼如下:
tcpClient->connectToHost(ui->txtIP->text(),ui->txtPort->text().toInt());//連接服務(wù)器
tcpClient->waitForConnected(1000);//連接超時設(shè)置
4 手機客戶端與服務(wù)器間的通訊協(xié)議
服務(wù)器和手機客戶端數(shù)據(jù)通訊采用的是用TCP/IP傳輸XML的消息的方式,其幀結(jié)構(gòu)如表1所示。
其中開始表示采用0C55CH,報文內(nèi)容為XML文件的數(shù)據(jù)流。XML格式部分報文如下:
請求監(jiān)測參數(shù)報文:
<?xml version="1.0" encoding="UTF-8"?>
回復(fù)報文:
<?xml version="1.0" encoding="UTF-8"?>
有害氣體
.......
服務(wù)器接收到客戶端的請求命令后,獲取數(shù)據(jù)庫中存儲版本后到當(dāng)前時間段版本的數(shù)據(jù),按照上述格式回復(fù)報文的形式保存為xml文件,讀取文件并轉(zhuǎn)化為字節(jié)流,再進行幀格式的拼接,封裝成TCP/IP數(shù)據(jù)幀發(fā)送;手機客戶端將接收的數(shù)據(jù)幀去掉幀頭后,提取有效信息保存為xml文件,應(yīng)用程序解析xml文件中的監(jiān)測信息,最后通過界面進行顯示。
5 結(jié)語
本文提出的使用Qt on Android設(shè)計的空氣質(zhì)量監(jiān)測系統(tǒng)在Android智能機上得以實現(xiàn),增強空氣質(zhì)量監(jiān)測系統(tǒng)監(jiān)測數(shù)據(jù)查詢的便捷性,同時為C/C++程序員開發(fā)Android手機APP提供了范例,具有很好的借鑒價值。
參考文獻
[1]安曉輝.Qt on Android核心編程[M].電子工業(yè)出版社,2015.
[2]霍亞飛.Qt Creator快速入門[M].北京航空航天大學(xué)出版社,2012.
[3]孫賀.室內(nèi)環(huán)境監(jiān)測系統(tǒng)中客戶端的設(shè)計與實現(xiàn)[D].信息技術(shù),2014.
作者簡介
曹龍,碩士學(xué)歷。主要研究方向為信號檢測與信息處理。
劉煒,副教授,碩士研究生導(dǎo)師。
曾力,碩士學(xué)歷。主要研究方向為信號檢測與信息處理。
作者單位
北方民族大學(xué)電氣信息工程學(xué)院 寧夏回族自治區(qū)銀川市 750021