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