自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

五分鐘技術(shù)趣談 | 云電腦終端鼠標(biāo)鍵盤適配原理

云計(jì)算
云電腦作為目前非常熱門的新興技術(shù)受到了很多人的關(guān)注,而云電腦的外設(shè)適配,尤其是鍵鼠的適配技術(shù),作為云電腦的核心技術(shù)之一,也在快速的發(fā)展。

Part 01

什么是云電腦和鍵鼠適配?

云電腦是目前非常熱門的一項(xiàng)新技術(shù),它基于云計(jì)算,將大量的存儲(chǔ)、計(jì)算資源都整合成一個(gè)大的資源池并存放在云端,按需分配給用戶。云端會(huì)通過高速網(wǎng)絡(luò),將電腦的畫面投送到用戶的設(shè)備上。

云電腦的終端設(shè)備類型非常豐富,有能隨身攜帶的普通手機(jī)、Pad,能連接電視的機(jī)頂盒,以及一些老舊電腦終端等等。

對(duì)于普通電腦而言,最常用的操作輸入設(shè)備就是鼠標(biāo)和鍵盤。云電腦想要替代傳統(tǒng)筆記本,就需要在各種終端都要適配鍵盤和鼠標(biāo)。但是由于很多移動(dòng)設(shè)備在交互上更會(huì)注重觸摸交互,其對(duì)鍵盤和鼠標(biāo)的支持往往不盡如人意。再加上終端廠商會(huì)對(duì)其終端設(shè)備系統(tǒng)進(jìn)行高度的定制化,加劇了在云電腦在鍵鼠適配支持的碎片化程度,每個(gè)廠商的終端都有其特定的問題。因此鍵鼠的適配在云電腦終端設(shè)備整體適配工作中占據(jù)了很大的比重。

Part 02

Android鍵盤使用原理 

在Android應(yīng)用中,我們可以通過實(shí)時(shí)檢測(cè)頁面的onKeyDown、onKeyUp、dispatchKeyEvent等方法來實(shí)時(shí)檢測(cè)絕大部分鍵盤按鍵的使用,但是由于Android系統(tǒng)的支持問題和廠商固件碎片化的問題,這些方法在實(shí)際使用時(shí),會(huì)發(fā)現(xiàn)在不同的終端上同一個(gè)按鍵會(huì)有不同的鍵值甚至是沒有鍵值。而為了能統(tǒng)一所有終端設(shè)備的按鍵的鍵值,我們對(duì)整個(gè)系統(tǒng)物理按鍵鍵值的映射原理進(jìn)行了分析,如下:

在Android內(nèi)核中,按鍵按下時(shí),IR硬件掃描碼會(huì)在驅(qū)動(dòng)里面被映射為input.h中定義的某個(gè)鍵值。比如像鍵盤這種HID設(shè)備,按鍵按下時(shí)內(nèi)核中的鍵值轉(zhuǎn)換會(huì)在drivers/hid/hid-input.c 中進(jìn)行映射,轉(zhuǎn)化后的值即為scanCode。

在hid-input.c中的映射表如下:

圖片

圖1 系統(tǒng)hid-input.c源碼截圖

同時(shí)在Android系統(tǒng)層的頭文件input-event-codes.h中也定義了這些鍵值所代表的鍵名稱。如下圖(截?。?/span>

圖片

圖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。

整體的流程如下:

圖片圖片

Part 03

云電腦適配鍵盤 

了解整體鍵值映射的流程,那不同終端是因?yàn)槭裁磳?dǎo)致的最終鍵值不同的,而云電腦又是怎樣去對(duì)多種的終端進(jìn)行鍵值適配的呢?

在對(duì)比多個(gè)終端設(shè)備的配置文件之后,我們發(fā)現(xiàn),不同廠商的終端鍵值不統(tǒng)一主要是因?yàn)閮?nèi)置在系統(tǒng)中kl文件內(nèi)容不一樣導(dǎo)致的,因此云電腦的鍵值適配主要就是適配kl文件來實(shí)現(xiàn)。

那kl文件又需要怎么適配呢?主要的方案有4種:

(1)云電腦在應(yīng)用層,根據(jù)不同終端的回調(diào)的鍵值,將錯(cuò)誤的鍵值轉(zhuǎn)化為正確的鍵值,完成按鍵的正確映射后,再使用正常的鍵值進(jìn)行云電腦的輸入交互;

(2)系統(tǒng)中新增不同鍵盤的適配文件,云電腦根據(jù)需要兼容的鍵盤來定制不同的適配文件并統(tǒng)一集成到系統(tǒng)中;

(3)修改系統(tǒng)默認(rèn)的適配文件,以鍵盤的按鈕功能為優(yōu)先映射;

(4)在使用云電腦時(shí)使用單獨(dú)的適配文件,云電腦的適配文件跟其他應(yīng)用的區(qū)別避免相互干擾。

每種方案都有其對(duì)應(yīng)的優(yōu)缺點(diǎn),比如方案一,部分終端設(shè)備存在鍵值的缺失和重復(fù),如果只是在應(yīng)用端進(jìn)行適配,這部分按鍵依舊無法很好的支持;方案二中通過新增需要適配鍵盤的keylayout文件,那這可能會(huì)導(dǎo)致云電腦支持的鍵盤數(shù)量變得非常有限,同時(shí)也會(huì)導(dǎo)致適配測(cè)試工作量膨脹;方案三修改系統(tǒng)默認(rèn)的適配文件,可能會(huì)導(dǎo)致原本的部分遙控器按鍵會(huì)出現(xiàn)錯(cuò)誤;而如果使用方案四,則需要對(duì)Android系統(tǒng)底層鍵盤適配文件匹配流程進(jìn)行完全重構(gòu),適配工作量巨大。

綜合以上各個(gè)方案的優(yōu)缺點(diǎn),考慮到遙控器和鍵盤的按鍵重合較少,同時(shí)遙控器的按鍵鍵值一般也都是標(biāo)準(zhǔn)鍵值,因此最終選擇了方案3作為云電腦鍵盤的適配方案,同時(shí)要確保適配的所有按鍵鍵值全部都是標(biāo)準(zhǔn)鍵值。

在確定了適配方案之后,就需要對(duì)所有終端中的Generic.kl文件進(jìn)行修改,逐項(xiàng)對(duì)比其注冊(cè)的鍵值跟云電腦使用要求的標(biāo)準(zhǔn)鍵值,完成所有適配終端的鍵盤適配。

Part 04

鼠標(biāo)適配 

在Android系統(tǒng)中,通過實(shí)時(shí)檢測(cè)系統(tǒng)的onGenericMotionEvent方法,來識(shí)別鼠標(biāo)的滑動(dòng)和點(diǎn)擊。在onGenericMotionEvent方法中通過MotionEvent中的action值來區(qū)別鼠標(biāo)左鍵點(diǎn)擊、右鍵點(diǎn)擊、鼠標(biāo)滑動(dòng)等不同的操作方法。終端設(shè)備在鼠標(biāo)操作上,其返回值基本保持統(tǒng)一,因此基本無需額外適配。

Part 05

虛擬鍵鼠方案 

由于每款終端設(shè)備在適配云電腦時(shí)基本都需要額外對(duì)鍵盤的鍵值進(jìn)行適配,因此使用手機(jī)、pad作為外部遠(yuǎn)程的操作設(shè)備來模擬實(shí)際的鍵鼠,對(duì)云電腦進(jìn)行操作就很有意義。

虛擬鍵鼠的方法主要有2個(gè):

(1)在局域網(wǎng)內(nèi)構(gòu)建通信服務(wù),在移動(dòng)端應(yīng)用直接通過掃描二維碼等方式連接通道后,通過發(fā)送自定義鍵鼠指令,云電腦將這些指令轉(zhuǎn)化為實(shí)際需要的操作指令,完成云電腦的操作;

(2)通過藍(lán)牙HID,兩臺(tái)設(shè)備連接藍(lán)牙后,在移動(dòng)端發(fā)送藍(lán)牙HID命令進(jìn)行云電腦的操作。

由于藍(lán)牙HID需要兩邊的設(shè)備都支持藍(lán)牙,且要求的系統(tǒng)版本較高,藍(lán)牙連接對(duì)于很多用戶成本也更高,因此選擇方案一作為虛擬鍵鼠方案。

方案一中需要在終端上建立一個(gè)穩(wěn)定的數(shù)據(jù)通道,這個(gè)數(shù)據(jù)通道可以使用WebSocket。在鼠標(biāo)點(diǎn)擊和滑動(dòng)時(shí),通道中需要傳輸大量的數(shù)據(jù),因此可以使用protobuf作為數(shù)據(jù)通道中傳輸?shù)臄?shù)據(jù)格式。Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化。它很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。可用于通訊協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域的語言無關(guān)、平臺(tái)無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。

移動(dòng)端在向大屏端發(fā)送鼠標(biāo)數(shù)據(jù)時(shí),需要將用戶的操作手勢(shì),拆解為最基礎(chǔ)的按鍵按下、抬起、移動(dòng)等操作,然后將這些操作轉(zhuǎn)化為操作數(shù)據(jù),再對(duì)數(shù)據(jù)進(jìn)行發(fā)送。舉個(gè)例子,比如一次普通的鼠標(biāo)左鍵點(diǎn)擊操作,需要將點(diǎn)擊操作,細(xì)分為左鍵按下,左鍵抬起2個(gè)事件;再比如一次左鍵點(diǎn)擊拖動(dòng)操作,需要這個(gè)操作,細(xì)分為左鍵按下、鼠標(biāo)移動(dòng)、左鍵抬起事件3個(gè)事件。

除了鼠標(biāo)和鍵盤這兩個(gè)最常用的兩個(gè)設(shè)備外,其他不同類型的輸入設(shè)備,比如遙控器、游戲手柄都可以通過這種方式,實(shí)現(xiàn)對(duì)云電腦的操作,從而避免了大量適配工作。

責(zé)任編輯:龐桂玉 來源: 移動(dòng)Labs
相關(guān)推薦

2023-07-23 18:47:59

Docker開源

2023-08-13 18:27:16

2023-07-16 18:49:42

HTTP網(wǎng)絡(luò)

2023-08-06 06:55:29

數(shù)字可視化物聯(lián)網(wǎng)

2023-04-15 20:25:23

微前端

2023-07-02 16:09:57

人工智能人臉識(shí)別

2023-07-02 16:34:06

GPU虛擬化深度學(xué)習(xí)

2023-09-12 07:10:13

Nacos架構(gòu)

2023-07-31 08:55:15

AI技術(shù)網(wǎng)絡(luò)暴力

2023-07-12 15:50:29

機(jī)器學(xué)習(xí)人工智能

2023-08-29 06:50:01

Javamaven

2024-12-18 14:10:33

2023-07-12 16:03:37

Android開發(fā)架構(gòu)

2023-08-06 07:00:59

Openstack網(wǎng)絡(luò)

2023-08-15 14:46:03

2023-09-17 17:51:43

Android 14

2023-09-02 20:22:42

自動(dòng)化測(cè)試軟件開發(fā)

2023-08-07 06:35:07

系統(tǒng)限流

2023-04-15 20:33:35

圖形數(shù)據(jù)庫數(shù)據(jù)庫

2021-09-18 11:36:38

混沌工程云原生故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)