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