賀志朋,許 戈
(蘇州健雄職業(yè)技術學院,江蘇 蘇州 215411)
從操作系統(tǒng)空間分析,Android輸入系統(tǒng)可以分為兩個部分:一部分是Linux的內(nèi)核空間中存在的輸入子系統(tǒng),屬于內(nèi)核機制。另一部分是在驅動的基礎上進行的Android封裝,處于用戶空間。該系統(tǒng)整體分為三個組成部分,即Event驅動、Event Hub和JAVA框架,即當鍵盤上按下一個按鍵或在觸摸屏上滑動一下,機械動作就會被內(nèi)核捕捉到,同時用event的形式體現(xiàn)出來,相關事件被記錄下來后,用戶空間就會獲取時間并進行分發(fā)。
Android按鍵事件是最基本的輸入時間,在Linux當中,按鍵是通過是“輸入---事件”的結構體實現(xiàn)的。按鍵機械動作到達軟件層次以后,能夠通過該結構體中的成員表現(xiàn)按鍵事件特性。
Android系統(tǒng)中的輸入和響應過程是用戶按下按鍵后,系統(tǒng)中的Event將此種行為記錄下來,Window Manager Service就會調動Android系統(tǒng)中的輸入中樞輪詢輸入事件,當檢測到有時間產(chǎn)生,就會將捕獲到的時間分發(fā)給應用層。這時數(shù)據(jù)包的發(fā)送和傳輸只需要通過soket就能夠實現(xiàn)在Linux中輸入驅動程序,該設備驅動程序可以在用戶空間對輸入事件進行模擬,并將事件寫在驅動中,最終由Input Core完成發(fā)布[1]。
輸入是指Linux的內(nèi)核模塊,該模塊能夠在用戶空間進行操作,使輸入子系統(tǒng)的可能性更高,且輸入可以從應用程序中創(chuàng)建并操作輸入設備。在實際工作的過程中,輸入模塊會創(chuàng)建字符設備,Android系統(tǒng)正是使用該字符設備在用戶空間創(chuàng)建Linux輸入設備。
需要注意的是,Android默認使用的Linux內(nèi)核中并沒有輸入模塊,所以需要對config文件進行修改,即在文件中加入CONFIG INPUT UINPUT=y,同時將Android系統(tǒng)的Linux內(nèi)核進行重新翻譯。當Android系統(tǒng)中已經(jīng)安裝了輸入模塊,則系統(tǒng)會生成字符設備文件,即/dev/uinput,該設備代表的是應用程序和kernel輸入子系統(tǒng)接口。
以某基于Android系統(tǒng)的智能無線控制系統(tǒng)設計為例,該系統(tǒng)一方面需要控制建立的實際過程,要在連接已經(jīng)建立的前提下使客戶端向服務器發(fā)送控制請求包,即DATATYPE CONTROL REQUEST。在服務器接收控制請求后,檢查是否能夠允許控制,若能夠允許,則會為客戶端進行初始化輸入設備的操作,再向客戶端發(fā)送DATATYPE CONTROL ACK ALLOW。若不允許,則服務器會直接向客戶端發(fā)送DATATYPE CONTROL ACK DISALLOW。一旦控制客戶端的數(shù)量達到最大,服務器也會向客戶端發(fā)送DATATYPE CONTROL REACH MAX。Android系統(tǒng)客戶端接受服務器對控制請求的應答后,會根據(jù)服務器是否允許控制進行不同的操作。若收到的反饋為允許控制,則Android系統(tǒng)會設置好輸入文件描述符,保障后續(xù)工作進行的流暢度,若接受到服務器不同意控制的應答或控制數(shù)量已經(jīng)飽和,則Android系統(tǒng)會做好清理工作并及時退出。另一方面的工作是需要注意數(shù)據(jù)傳輸和服務器解析的工作過程,即在控制已經(jīng)建立的基礎上,Android系統(tǒng)會向服務器端發(fā)送DATATYPE KEY KEYEVENT的控制信息包,當服務器收到該控制信息包,則會根據(jù)信息包中的實際指令類型作出處理。
在明確系統(tǒng)設計要求的前提下,還要明確接口界面。界面等級的高低會直接影響客戶程序的實際使用感,也會對程序功能實現(xiàn)的難易程度產(chǎn)生影響[2]。如:某基于Android系統(tǒng)設計的智能無線控制系統(tǒng)中,Wireless Controller屬于客戶端核心,能夠向系統(tǒng)中全部對服務器提出的請求和控制信息進行處理并完成,在該系統(tǒng)設計時,Wireless Controller被設計成了單列模式。系統(tǒng)工作過程中獲得Wireless Controller實例后,就能夠實現(xiàn)對start Connection的調動,當向服務器發(fā)送連接請求后,start Connection會產(chǎn)生兩個參數(shù)。一個是Inet Address,是java.net標準中的一個類別,代表了IP地址,設一個String對象為String str=10.0.2.2,當中存儲的是服務器的IP地址,此時即可輕易調動Inct Address get By Name(str),最終變?yōu)镮net Address。另一個參數(shù)是Connect Handler,該參數(shù)是自定義接口之一,能夠在回調工作中使用,一旦顯示連接成功,則系統(tǒng)智能無線控制系統(tǒng)會調用on Connect,若檢測到連接失敗,則系統(tǒng)會調動on Disconnect。在連接出錯后,系統(tǒng)也會產(chǎn)生調用操作,調用的內(nèi)容是on Error,同時接收到顯示連接錯誤的信息。由此可見,在該系統(tǒng)調用start Connection函數(shù)前,客戶端需要自定義一個類別,實現(xiàn)Connect Handler,最終用于該系統(tǒng)連接過程中產(chǎn)生的回調。連接成功以后,該系統(tǒng)能夠任意選擇調用的函數(shù)向服務器發(fā)送控制信息,如:send Key Event能夠自行向new Key Event傳輸函數(shù),也能夠自主對鍵盤事件進行捕獲,當控制完成以后,該系統(tǒng)也可以自行調動disconnect斷開控制連接。
連接建立,以某智能自動化控制系統(tǒng)為例,該系統(tǒng)的連接建立過程有兩個關鍵環(huán)節(jié),一是connect To Socket函數(shù)。該函數(shù)會調用new Socket,此層次的函數(shù)會向服務器發(fā)起連接請求,當服務器接收連接請求后,會及時將客戶端的相關信息儲存到云端。二是Data Reader函數(shù)。該函數(shù)連接建立成功后會隨即建立好socket,并對socket進行初始化讀寫。
發(fā)送控制請求,該智能自動化控制系統(tǒng)中掌管控制請求發(fā)送的函數(shù)是send Control Request,該函數(shù)在發(fā)送控制請求的過程中會向服務器發(fā)送控制信息包,并等待服務器回應。在系統(tǒng)服務器接到控制信息包以后,會查看自身的配置是否允許控制工作展開,同時向客戶端發(fā)送反饋信息包。若允許建立連接,在發(fā)送反饋信息包的同時,服務器還需要進行初始化,并在DATATYPE CONTROL ACK DISALLOW中將初始化之后的輸入 device 發(fā)送至客戶端,方便后續(xù)智能自動控制系統(tǒng)的使用。
根據(jù)服務器的反饋處理相應問題,即客戶端會讀取服務器的ACK包,并根據(jù)信息包內(nèi)容選擇不同的處理方式,無論信息包類型如何,都需要使用Conect Handler相關方式展開工作,達到顯示系統(tǒng)控制建立狀態(tài)的目的。
數(shù)據(jù)傳輸模塊的主要工作內(nèi)容是根據(jù)以往定義的協(xié)議在客戶端及服務器之間傳遞數(shù)據(jù)。其中客戶端負責的是實現(xiàn)各接口定義中的send函數(shù),同時使用相關自定義類向服務器控制信息人發(fā)送信息。
斷開模塊的設計和實現(xiàn)比解析模塊的設計和實現(xiàn)難度更低,掌管的是資源釋放相關的工作。在智能無線控制系統(tǒng)完成控制之后,會向服務器發(fā)送及控制信息包,服務器接收信息包后會釋放在初始化過程中,為socket分配資源內(nèi)容。
該項目的最終設計和實現(xiàn)的結果是能夠在客戶端生成clientLib庫,在使用過程中Android系統(tǒng)會與客戶端建立控制關系,受到客戶端控制形成智能無線控制系統(tǒng)。