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