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