一不小心踏進Android開發: TPMini大眼睛使用PS3藍芽手柄(四)圍繞linmctool挖掘SixAxis通訊協議

來源:互聯網
上載者:User

這是一套連載文章,用以記錄大眼睛串連藍芽手柄的全過程。謹以此文獻給那一周我缺失的睡眠。 此文的性質相當於(公開的)個人日記,未經本人允許,請勿轉載。

 

上文說到,linmctool編譯後串連手柄成功,各按鍵都有了反應。我可以展開對SixAxis各個按鍵的探索了。

在測試的過程中,有一次突然連不上了。我很鬱悶,無論怎麼調都不行。最後終於發現,第一次能夠成功串連,完全是歸功於我在研究hidd時無意輸入的命令: hciconfig hci1 up 和 hciconfig hci1 piscan。由於我有2個藍芽適配器,在大眼睛啟動後,第一個插入的藍芽適配器被分配到了hci0,在hci0有效情況下如果再插入一個藍芽適配器,新插入的就會分配為hci1。大眼睛似乎佔用了hci0,導致hci0一直無法up起來。我第一次連成功,正好是因為先插入了一個無用的適配器hci0,然後插入了與SixAxis配對好的適配器hci1。hci0很慘,被大眼睛中的某個進程強搶而去,而hci1沒有被搶,正好被linmctool用上了。但是一旦重啟大眼睛,或者改變適配器的順序,或者只插入一個藍芽適配器,都會導致連不成功。經反覆實驗,要想正常串連,需要2個條件,1.相應的hci可以成功up;2.相應的hci必須開啟pscan。如此說來,瞎蒙能蒙對的機率實在是不大,我真的很幸運。

經過多次實驗,我發現了佔用hci0的罪魁禍首是/system/bin/bluetoothd。它讓我學會了使用ps命令和kill命令,但kill也仍然是kill不掉它,殺了之後就會自動再啟動。真是豈有此理,我只好rename了,讓系統找不到它。以後再也不怕hci0無法up了。

言歸正傳。接下來該研究SixAxis的按鍵和感應器了。

改了改linmctool中的代碼,我讓它把從手柄中傳來的所有資料都顯示出來了。

經過反覆測試,我不禁驚呆了。

我沒有玩過PS3,當初買這個手柄純粹是一時興起,看它沒有線束縛才買的。我真的沒有想到它居然這麼強大!除了SELECT,START,L3,R3和PS鍵之外,其它所有的按鍵都能測出按的力度!這也太下本兒了。後來和遊戲控同事交流才知道,在PS3中玩遊戲時,方向鍵按輕和按重跑的速度是不同的。我去!

 

下面是一組樣本資料,從hcidump命令擷取到的:

> ACL data: handle 42 flags 0x02 dlen 54    L2CAP(d): cid 0x0041 len 50 [psm 19]      HIDP: Data: Input report      0000: 01 00 00 00 00 00 7f 80  81 80 00 00 00 00 00 00  ................      0010: 00 00 00 00 00 00 00 00  00 00 00 00 00 03 03 16  ................      0020: ff b7 00 0e 33 a0 77 01  c0 01 fc 01 e7 01 8d 01  ?.3爓.???..      0030: f0                                                ?

 

可以看出,每次手柄向主機發送49位元組。經過測試、對比,可發現其中的規律:

這49位元組中,

第3位元組為8個按鍵,從低到高位,依次是:SELECT,L3,R3,START,上方向,右方向,下方向,左方向。前4個按鍵的壓力值位於第11~第14位元組,讀數一直是0;後4個按鍵的壓力值分別位於第15~第18位元組。

第4位元組為8個按鍵,從低到高位,依次是:L2,R2,L1,R1,三角,圓,叉,方塊。這8個按鍵的壓力值分別位於第19~第26位元組。

第5位元組的最低位是PS鍵,此鍵的壓力值位於第27位元組,讀數一直是0。

第42,43位元組為X軸(左搖桿水平方向)的值,高位元組在前。

第44,45位元組為Y軸(左搖桿垂直方向)的值,高位元組在前。

第46,47位元組為Z軸(右搖桿水平方向)的值,高位元組在前。

第48,49位元組為gZ軸(右搖桿垂直方向)的值,高位元組在前。

 

其它位元組有一些用來測量加速度的,測量搖杆傾斜度的,還有一些不知道幹啥的,不容易測,就沒有仔細測試。

以上這些足夠目前用了。

 

OK,有了這些,可以初步開始我們的規划了。

 

我一直在用 Xperia Play,這是一款非常不錯的手機,推開手柄後,可以利用手柄進行各種控制,不只是玩遊戲,還包括系統的各項功能。

初步設計,我打算用SixAxis實現Play中手柄的各種功能。也就是說,上下左右方向鍵用來控制游標(不是滑鼠指標),叉鍵確定,圓圈鍵返回,L3鍵作為菜單鍵,R3鍵作為首頁鍵,L2和R2鍵作為音量鍵,

另外,三角鍵用來搜尋,左搖桿控制滑鼠指標,方框鍵類比滑鼠左鍵,右搖桿用來類比手划動螢幕。

 

要實現這些功能,我們的軟體就要起到橋樑的作用,一頭串連SixAxis,另一頭在系統中類比鍵盤或滑鼠的動作。

下篇繼續。

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.