云電腦作為目前非常熱門的新興技術(shù)受到了很多人的關(guān)注,而云電腦的外設(shè)適配,尤其是鍵鼠的適配技術(shù),作為云電腦的核心技術(shù)之一,也在快速的發(fā)展。
什么是云電腦和鍵鼠適配?
云電腦是目前非常熱門的一項新技術(shù),它基于云計算,將大量的存儲、計算資源都整合成一個大的資源池并存放在云端,按需分配給用戶。云端會通過高速網(wǎng)絡(luò),將電腦的畫面投送到用戶的設(shè)備上。
云電腦的終端設(shè)備類型非常豐富,有能隨身攜帶的普通手機、Pad,能連接電視的機頂盒,以及一些老舊電腦終端等等。
對于普通電腦而言,最常用的操作輸入設(shè)備就是鼠標(biāo)和鍵盤。云電腦想要替代傳統(tǒng)筆記本,就需要在各種終端都要適配鍵盤和鼠標(biāo)。但是由于很多移動設(shè)備在交互上更會注重觸摸交互,其對鍵盤和鼠標(biāo)的支持往往不盡如人意。再加上終端廠商會對其終端設(shè)備系統(tǒng)進(jìn)行高度的定制化,加劇了在云電腦在鍵鼠適配支持的碎片化程度,每個廠商的終端都有其特定的問題。因此鍵鼠的適配在云電腦終端設(shè)備整體適配工作中占據(jù)了很大的比重。
Android鍵盤使用原理
在Android應(yīng)用中,我們可以通過實時檢測頁面的onKeyDown、onKeyUp、dispatchKeyEvent等方法來實時檢測絕大部分鍵盤按鍵的使用,但是由于Android系統(tǒng)的支持問題和廠商固件碎片化的問題,這些方法在實際使用時,會發(fā)現(xiàn)在不同的終端上同一個按鍵會有不同的鍵值甚至是沒有鍵值。而為了能統(tǒng)一所有終端設(shè)備的按鍵的鍵值,我們對整個系統(tǒng)物理按鍵鍵值的映射原理進(jìn)行了分析,如下:
在Android內(nèi)核中,按鍵按下時,IR硬件掃描碼會在驅(qū)動里面被映射為input.h中定義的某個鍵值。比如像鍵盤這種HID設(shè)備,按鍵按下時內(nèi)核中的鍵值轉(zhuǎn)換會在drivers/hid/hid-input.c 中進(jìn)行映射,轉(zhuǎn)化后的值即為scanCode。
在hid-input.c中的映射表如下:
圖1 系統(tǒng)hid-input.c源碼截圖
同時在Android系統(tǒng)層的頭文件input-event-codes.h中也定義了這些鍵值所代表的鍵名稱。如下圖(截?。?/p>
圖2 系統(tǒng)input-event-codes.h源碼部分截圖
在內(nèi)核中映射完之后,就需要將linux鍵值映射到Android系統(tǒng)要使用的鍵值映射,這部分通常定義在系統(tǒng)的device/xxx/xxx.kl(keylayout) 文件中。
keylayout文件的內(nèi)容如下圖(部分):
圖3 系統(tǒng)keylayout文件部分截圖
在kl文件中,將內(nèi)核映射的結(jié)果scancode,最終映射為Android系統(tǒng)需要使用的鍵值,并最終轉(zhuǎn)化為應(yīng)用需要使用的keycode。
整體的流程如下:
云電腦適配鍵盤
了解整體鍵值映射的流程,那不同終端是因為什么導(dǎo)致的最終鍵值不同的,而云電腦又是怎樣去對多種的終端進(jìn)行鍵值適配的呢?
在對比多個終端設(shè)備的配置文件之后,我們發(fā)現(xiàn),不同廠商的終端鍵值不統(tǒng)一主要是因為內(nèi)置在系統(tǒng)中kl文件內(nèi)容不一樣導(dǎo)致的,因此云電腦的鍵值適配主要就是適配kl文件來實現(xiàn)。
那kl文件又需要怎么適配呢?主要的方案有4種:
(1)云電腦在應(yīng)用層,根據(jù)不同終端的回調(diào)的鍵值,將錯誤的鍵值轉(zhuǎn)化為正確的鍵值,完成按鍵的正確映射后,再使用正常的鍵值進(jìn)行云電腦的輸入交互;
(2)系統(tǒng)中新增不同鍵盤的適配文件,云電腦根據(jù)需要兼容的鍵盤來定制不同的適配文件并統(tǒng)一集成到系統(tǒng)中;
(3)修改系統(tǒng)默認(rèn)的適配文件,以鍵盤的按鈕功能為優(yōu)先映射;
(4)在使用云電腦時使用單獨的適配文件,云電腦的適配文件跟其他應(yīng)用的區(qū)別避免相互干擾。
每種方案都有其對應(yīng)的優(yōu)缺點,比如方案一,部分終端設(shè)備存在鍵值的缺失和重復(fù),如果只是在應(yīng)用端進(jìn)行適配,這部分按鍵依舊無法很好的支持;方案二中通過新增需要適配鍵盤的keylayout文件,那這可能會導(dǎo)致云電腦支持的鍵盤數(shù)量變得非常有限,同時也會導(dǎo)致適配測試工作量膨脹;方案三修改系統(tǒng)默認(rèn)的適配文件,可能會導(dǎo)致原本的部分遙控器按鍵會出現(xiàn)錯誤;而如果使用方案四,則需要對Android系統(tǒng)底層鍵盤適配文件匹配流程進(jìn)行完全重構(gòu),適配工作量巨大。
綜合以上各個方案的優(yōu)缺點,考慮到遙控器和鍵盤的按鍵重合較少,同時遙控器的按鍵鍵值一般也都是標(biāo)準(zhǔn)鍵值,因此最終選擇了方案3作為云電腦鍵盤的適配方案,同時要確保適配的所有按鍵鍵值全部都是標(biāo)準(zhǔn)鍵值。
在確定了適配方案之后,就需要對所有終端中的Generic.kl文件進(jìn)行修改,逐項對比其注冊的鍵值跟云電腦使用要求的標(biāo)準(zhǔn)鍵值,完成所有適配終端的鍵盤適配。
鼠標(biāo)適配
在Android系統(tǒng)中,通過實時檢測系統(tǒng)的onGenericMotionEvent方法,來識別鼠標(biāo)的滑動和點擊。在onGenericMotionEvent方法中通過MotionEvent中的action值來區(qū)別鼠標(biāo)左鍵點擊、右鍵點擊、鼠標(biāo)滑動等不同的操作方法。終端設(shè)備在鼠標(biāo)操作上,其返回值基本保持統(tǒng)一,因此基本無需額外適配。
虛擬鍵鼠方案
由于每款終端設(shè)備在適配云電腦時基本都需要額外對鍵盤的鍵值進(jìn)行適配,因此使用手機、pad作為外部遠(yuǎn)程的操作設(shè)備來模擬實際的鍵鼠,對云電腦進(jìn)行操作就很有意義。
虛擬鍵鼠的方法主要有2個:
(1)在局域網(wǎng)內(nèi)構(gòu)建通信服務(wù),在移動端應(yīng)用直接通過掃描二維碼等方式連接通道后,通過發(fā)送自定義鍵鼠指令,云電腦將這些指令轉(zhuǎn)化為實際需要的操作指令,完成云電腦的操作;
(2)通過藍(lán)牙HID,兩臺設(shè)備連接藍(lán)牙后,在移動端發(fā)送藍(lán)牙HID命令進(jìn)行云電腦的操作。
由于藍(lán)牙HID需要兩邊的設(shè)備都支持藍(lán)牙,且要求的系統(tǒng)版本較高,藍(lán)牙連接對于很多用戶成本也更高,因此選擇方案一作為虛擬鍵鼠方案。
方案一中需要在終端上建立一個穩(wěn)定的數(shù)據(jù)通道,這個數(shù)據(jù)通道可以使用WebSocket。在鼠標(biāo)點擊和滑動時,通道中需要傳輸大量的數(shù)據(jù),因此可以使用protobuf作為數(shù)據(jù)通道中傳輸?shù)臄?shù)據(jù)格式。Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化。它很適合做數(shù)據(jù)存儲或 RPC 數(shù)據(jù)交換格式??捎糜谕ㄓ崊f(xié)議、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)、平臺無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
移動端在向大屏端發(fā)送鼠標(biāo)數(shù)據(jù)時,需要將用戶的操作手勢,拆解為最基礎(chǔ)的按鍵按下、抬起、移動等操作,然后將這些操作轉(zhuǎn)化為操作數(shù)據(jù),再對數(shù)據(jù)進(jìn)行發(fā)送。舉個例子,比如一次普通的鼠標(biāo)左鍵點擊操作,需要將點擊操作,細(xì)分為左鍵按下,左鍵抬起2個事件;再比如一次左鍵點擊拖動操作,需要這個操作,細(xì)分為左鍵按下、鼠標(biāo)移動、左鍵抬起事件3個事件。
除了鼠標(biāo)和鍵盤這兩個最常用的兩個設(shè)備外,其他不同類型的輸入設(shè)備,比如遙控器、游戲手柄都可以通過這種方式,實現(xiàn)對云電腦的操作,從而避免了大量適配工作。
作者:吳澤峰、池偉、程蔣旭
單位:中國移動智慧家庭運營中心