Qt開發:UDP、TCP發送文字消息、檢測U盤插拔、SYSZUXpinyin軟鍵盤輸入法移植------[源碼奉送]...

開發環境爲Linux+Qt, 功能是實現tcp 、udp發送消息,檢測U盤插拔、同時在arm端移植syszuxpinyin軟鍵盤出入法。下面是我當時的工作總結。下面是效果圖:

關於tcp、udp:

工作

狀況

總結

工作狀況:

1, 調通了Qt下的TCP通信模塊,並在板子上測試通過,A8開發板與PC通信良好,發送中文無亂碼。

2, TCP模塊和UDP模塊整合到一起,做到一個GUI界面裏。由於TCP的服務端和客戶端是不同的,所以合到一起後代碼分兩份。

3, 解決Tiny210開發板上沒有鍵盤的情況下不能輸入的問題,尤其是不能輸入中文。移植並改進了SYSZUXpinyin輸入法,在Qt的程序裏能正常調出軟鍵盤,利用軟鍵盤輸入中文。由於SYSZUXpinyin的文字編碼方式是GB2312,而linuxqt默認的正常顯示中文編碼方式是UTF-8,爲了解決兩者之間的衝突,費了一些功夫。最終順利解決,發送和接收都能正常顯示中文。

4, 利用Qt檢測U盤的插拔情況。具體用到了Qtdbus模塊。在PC上已經初步檢測成功,但移植到arm時發現默認的編譯Qt時是不帶dbus模塊的。現在需要重新編譯帶dbus模塊的armQt。在編譯時發現需要先安裝dbus庫。

總結:

1, 移植輸入法後,由於既要解決GB2312UTF-8編碼的矛盾,又要解決UDPTCP通信模塊在對端收到文字時能正常解析,讓我費了不少事。這方便網上資料基本沒有,最後通過看qt自帶的幫助文檔參考衆多資料,才得以解決。

2, 利用Qt檢測U盤的插拔,通過研究發現,在linuxU盤插進去後會註冊大約7usb-device,只裏面只有最後一個是真正的USB存儲設備。也只有真正的USB存儲設備註冊成功後,用戶纔可以正常讀寫U盤。

關於檢測U盤:

工作

狀況

總結

工作狀況:

1, PCx86平臺下,實現了基於HAL機制和UDISKS機制的qdbus檢測U盤插拔的設計,在pc平臺下能正常檢測U盤插拔。

2, 在將以上兩種方法移植到arm平臺時,發現arm平臺並不支持HALUDISKS。原因是HALUDISKS機制都是接收的udev的消息,而udev需要sysfs文件系統做支持,而現在的嵌入式文件系統大多數爲yaffs系統。

3, 基於以上種種問題,最終選擇了內核的hotplug機制,hotplug接收內核的消息。當有U盤插入或拔出時會有消息從內核發出。利用這些消息發出的關鍵字如「add」和「remove」可以檢測U盤的插拔,及整個內核識別usb的過程。

4, 考慮到當用戶還在U盤目錄的下拔出U盤,此後若不重啓開發板就會識別異常。在未重啓開發板前,希望程序對U盤的這種情況進行檢測並提醒用戶。試驗了很多種方法,最終採用了往U盤內寫測試文件,來檢驗U盤是否真正識別。

總結:經過仔細研究發現,當用戶還在U盤目錄下直接拔出U盤,linux系統還來不及對U盤原掛載目錄/udisk進行卸載,因此當未重啓再次插入U盤,U盤依舊要訪問申請掛載到/udisk就會出錯。這種狀況除了往/udisk裏寫數據進行測試外,很難檢測。因此,不妨在檢測拔出U盤時,判斷/udisk目錄是否存在,如果存在則執行umount /udisk,這樣再次插入U盤就能正常訪問。

代碼分爲服務器端和客戶端,每個端都有x86版本和編譯好的arm版本,共4份源碼,供大家參考。

下面是說明:

Esto-client-arm.tar ----------交叉編譯後arm版本的客戶端程序,實現功能有:udp傳輸、tcp傳輸、U盤監測,交叉編譯器爲arm-linux-gcc-4.5.1
Esto-server-arm.tar ----------交叉編譯後arm版本的服務器端程序,實現功能有:udp傳輸、tcp傳輸、軟鍵盤移植
Esto-client-x86.tar ----------PC機上,客戶端程序,實現功能有:udp傳輸、tcp傳輸、u盤監測
Esto-server-x86.tar ----------PC機上,服務器端程序,實現功能有:udp傳輸、tcp傳輸
備註:SYSZUXpinyin只能在arm上編譯,無法再x86上編譯運行,原因是其實現基於QWSInputMethod,這個類是arm版本的庫所特有的。

客戶端的兩份源碼:http://www.pudn.com/downloads529/sourcecode/embedded/detail2190912.html

服務器端的兩份源碼:http://www.pudn.com/downloads529/sourcecode/embedded/detail2190909.html