賈貝貝,康明才
(南京理工大學(xué)電子工程與光電技術(shù)學(xué)院,江蘇南京 210014)
在嵌入式系統(tǒng)文件傳輸?shù)倪^(guò)程中,傳統(tǒng)文件傳輸?shù)姆绞绞峭ㄟ^(guò)串口直接傳輸,或通過(guò)其他存儲(chǔ)介質(zhì)間接傳輸。這些傳統(tǒng)的傳輸方式不僅存在傳輸效率低下的問(wèn)題,而且在調(diào)試過(guò)程中,調(diào)試人員必須處于嵌入式設(shè)備工作現(xiàn)場(chǎng),這些情況給嵌入式系統(tǒng)調(diào)試帶來(lái)了很大的麻煩。在嵌入式系統(tǒng)的實(shí)際應(yīng)用中,嵌入式設(shè)備往往處于各種復(fù)雜的網(wǎng)絡(luò)環(huán)境,支持部分網(wǎng)絡(luò)協(xié)議和有限的帶寬。因此文中將嵌入式系統(tǒng)中使用最廣的MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸協(xié)議)通信協(xié)議和Ymodem 文件傳輸機(jī)制相結(jié)合,基于QT 編程開發(fā)框架設(shè)計(jì)出通過(guò)物聯(lián)網(wǎng)對(duì)嵌入式設(shè)備進(jìn)行文件傳輸?shù)纳衔粰C(jī)軟件。
QT 是一種跨平臺(tái)的上位機(jī)應(yīng)用程序開發(fā)框架。MQTT 是一種物聯(lián)網(wǎng)中常用的協(xié)議[1],它基于發(fā)布/訂閱模式,而且是一種輕量級(jí)的通信協(xié)議。該協(xié)議通常構(gòu)建于TCP/IP 協(xié)議之上,因?yàn)槠鋮f(xié)議的輕量級(jí)特性,可以用極少的代碼和有限的帶寬為遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠的消息服務(wù)。因此,MQTT 協(xié)議廣泛應(yīng)用于各種物聯(lián)網(wǎng)設(shè)備和嵌入式系統(tǒng)中。YModem 協(xié)議每包數(shù)據(jù)可以達(dá)到1 024 字節(jié),是一個(gè)非常高效的文件傳輸協(xié)議[2]。YModem 數(shù)據(jù)的發(fā)送使用CRC 校驗(yàn),確保了接收端接收數(shù)據(jù)的準(zhǔn)確性,它每傳輸一個(gè)信息塊數(shù)據(jù)時(shí),就會(huì)等待接收端回應(yīng)ACK 信號(hào),接收到回應(yīng)后,才會(huì)繼續(xù)傳輸下一個(gè)信息塊,保證下位機(jī)可以全部正確接收到數(shù)據(jù)。
通過(guò)MQTT 通信協(xié)議可以確保上位機(jī)與嵌入式系統(tǒng)之間的通信,通過(guò)Ymodem 文件傳輸?shù)男r?yàn)機(jī)制可以確保文件傳輸?shù)恼_性,避免傳輸中間出現(xiàn)錯(cuò)誤或被修改。
上位機(jī)軟件設(shè)計(jì)的總體方案如圖1 所示。
圖1 系統(tǒng)總體方案圖
嵌入式系統(tǒng)包括MCU、通信模塊、存儲(chǔ)模塊、電源模塊和其他功能模塊。嵌入式系統(tǒng)可以通過(guò)網(wǎng)絡(luò)模塊與MQTT 服務(wù)器進(jìn)行通信,并將得到的文件存儲(chǔ)到存儲(chǔ)模塊中[3-5]。
服務(wù)器使用基于Mosquitto 軟件的MQTT 服務(wù)器。Eclipse Mosquitto 是一個(gè)開源MQTT 消息代理軟件,可以運(yùn)行在大型服務(wù)器上,也可以運(yùn)行在低功耗設(shè)備上。
上位機(jī)需要實(shí)現(xiàn)MQTT 客戶端創(chuàng)建功能、Ymodem 傳輸機(jī)制功能、文件打開功能和嵌入式系統(tǒng)喚醒功能:
1)MQTT 客戶端創(chuàng)建功能。建立MQTT 客戶端,與服務(wù)器建立連接,進(jìn)行通信。
2)Ymodem 傳輸機(jī)制功能。實(shí)現(xiàn)文件傳輸過(guò)程中的Ymodem 機(jī)制,確保每一幀都正確傳輸,不會(huì)中途丟失或被篡改。
3)文件打開功能。打開并讀取待傳輸?shù)奈募?/p>
4)嵌入式系統(tǒng)喚醒功能。發(fā)送特定指令,喚醒被傳輸文件的下位機(jī)。
軟件流程圖如圖2 所示。
圖2 軟件流程圖
MQTT 通信過(guò)程中只有一個(gè)服務(wù)器(Broker),其他設(shè)備稱為客戶端(Client),服務(wù)器建立在固定IP的主機(jī)上,客戶端通過(guò)與服務(wù)器建立連接進(jìn)行通信[6]。
上位機(jī)通過(guò)發(fā)送主題為下位機(jī)的MAC(Media Access Control Address,媒體訪問(wèn)控制地址)和“CLIENT”組合的字符串即“MAC+CLIENT”,對(duì)指定下位機(jī)發(fā)送消息。通過(guò)訂閱下位機(jī)的MAC和“SERVER”組合的字符串即“MAC+SERVER”的主題,接收指定下位機(jī)發(fā)送給上位機(jī)的消息。通過(guò)這種機(jī)制,可以避免只用一個(gè)主題的情況下接收到自身發(fā)送消息的情況,減少了多余數(shù)據(jù)的處理,提高了系統(tǒng)的性能。
上位機(jī)與服務(wù)器建立連接后,通過(guò)上述通信方式,發(fā)送字符串“+++”喚醒指定下位機(jī)。下位機(jī)喚醒后,根據(jù)Ymodem 文件傳輸機(jī)制,回復(fù)單字符‘C’表示成功進(jìn)入Ymodem 傳輸階段。上位機(jī)結(jié)束喚醒功能,開始文件傳輸。
界面UI 上包括輸入部分、控制部分和顯示部分。輸入部分包括服務(wù)器IP 地址輸入、端口號(hào)輸入、用戶名輸入、密碼輸入、下位機(jī)MAC 輸入、文件選擇??刂撇糠职ㄟB接服務(wù)器、與下位機(jī)通信、啟動(dòng)傳輸、啟動(dòng)發(fā)送和清除、置頂?shù)裙δ?。顯示部分包括文件傳輸進(jìn)度條、程序運(yùn)行具體信息顯示等。界面具體設(shè)計(jì)如圖3 所示。
圖3 上位機(jī)界面設(shè)計(jì)
2.4.1 文件打開功能
文件打開功能是借助QFileDialog 庫(kù)來(lái)實(shí)現(xiàn)的[7],通過(guò)QFileDialog 下的getOpenFileName 函數(shù)即可實(shí)現(xiàn)打開特定文件:
2.4.2 MQTT客戶端創(chuàng)建
利用QT 官方提供的MQTT 庫(kù)可以創(chuàng)建客戶端[8],其創(chuàng)建和參數(shù)設(shè)置通過(guò)new QMqttClient 實(shí)現(xiàn):
2.4.3 Ymodem文件傳輸機(jī)制
Ymodem 文件傳輸機(jī)制是通過(guò)一個(gè)發(fā)送函數(shù)和接收中斷實(shí)現(xiàn)的[9]。點(diǎn)擊發(fā)送按鈕后,軟件進(jìn)入發(fā)送函數(shù)中。按照Ymodem 協(xié)議組合發(fā)送數(shù)據(jù)[10-12]和CRC(Cyclic Redundancy Check,循環(huán)冗余校驗(yàn))數(shù)據(jù)。每發(fā)送一幀數(shù)據(jù)后,進(jìn)入接收等待,接收到發(fā)送數(shù)據(jù)接收成功信號(hào)后,發(fā)送下一幀數(shù)據(jù)。
發(fā)送數(shù)據(jù)的功能是通過(guò)使用publish 函數(shù)來(lái)實(shí)現(xiàn)的:
Ymodem 數(shù)據(jù)發(fā)送流程如圖4 所示。
圖4 Ymodem文件傳輸流程
2.4.4 下位機(jī)喚醒功能
點(diǎn)擊啟動(dòng)傳輸按鈕后,上位機(jī)開始以一定頻率給下位機(jī)發(fā)送喚醒信號(hào)。下位機(jī)被喚醒后,發(fā)送被喚醒信號(hào)給上位機(jī),上位機(jī)結(jié)束發(fā)送。
通過(guò)使用定時(shí)器Qtimer[13-15]來(lái)實(shí)現(xiàn)上述功能。首先創(chuàng)建定時(shí)器:
上位機(jī)設(shè)置定時(shí)器超時(shí)函數(shù),在超時(shí)函數(shù)中檢測(cè)是否已喚醒下位機(jī)設(shè)備,若未喚醒則繼續(xù)發(fā)送喚醒命令:
打開軟件后,輸入服務(wù)器IP、端口號(hào)、用戶名和密碼,點(diǎn)擊connect 按鈕登錄服務(wù)器。然后輸入MAC地址,點(diǎn)擊通信,建立與下位機(jī)通信的通道。點(diǎn)擊打開文件按鈕,打開待傳輸?shù)奈募?,然后點(diǎn)擊啟動(dòng)傳輸按鈕,等待下方消息窗口顯示“TRANSMIT READY”,點(diǎn)擊發(fā)送,進(jìn)入文件傳輸。進(jìn)度條和下方消息框可顯示傳輸進(jìn)度。傳輸完成后,下方消息窗口顯示“TRANSMIT END”,可繼續(xù)重新選擇文件或重新選擇下位機(jī)MAC 地址進(jìn)行文件傳輸。
在云服務(wù)器上使用MQTT 開源服務(wù)器軟件Mosquitto。該軟件提供Linux、Windows 等多種系統(tǒng)的安裝包,可以使用命令直接在服務(wù)器上安裝。安裝后可以通過(guò)修改配置文件mosquitto.conf和aclfile,修改端口號(hào)和登錄用戶等設(shè)置。
完成上位機(jī)軟件編寫和下位機(jī)軟件編寫后,可以對(duì)其文件傳輸功能進(jìn)行測(cè)試。測(cè)試結(jié)果表明,該上位機(jī)軟件可以穩(wěn)定連續(xù)地對(duì)下位機(jī)進(jìn)行文件傳輸,且傳輸過(guò)程中可以正確重發(fā)出錯(cuò)或異常的包。傳輸過(guò)程如圖5 所示。
圖5 傳輸過(guò)程
文中基于解決嵌入式設(shè)備遠(yuǎn)程文件傳輸?shù)哪康模捎肣T 編程框架設(shè)計(jì)出基于物聯(lián)網(wǎng)傳輸協(xié)議MQTT和Ymodem 文件傳輸協(xié)議的嵌入式系統(tǒng)文件傳輸上位機(jī)軟件。首先介紹了上位機(jī)軟件的設(shè)計(jì)架構(gòu)、MQTT 通信原理和Ymodem 通信機(jī)制。然后實(shí)現(xiàn)了基于QT的MQTT 客戶端和Ymodem 機(jī)制,最終完成嵌入式系統(tǒng)文件傳輸?shù)纳衔粰C(jī)設(shè)計(jì)。該上位機(jī)提供了友好的用戶使用界面,能夠便捷穩(wěn)定地將文件傳輸至嵌入式系統(tǒng)中。通過(guò)測(cè)試,可以看到該上位機(jī)不僅傳輸運(yùn)行穩(wěn)定,而且在嵌入式設(shè)備處于較為復(fù)雜的網(wǎng)絡(luò)環(huán)境下,也可以順利地完成文件傳輸。