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

這是一套連載文章,用以記錄大眼睛連接藍牙手柄的全過程。謹以此文獻給那一週我缺失的睡眠。

此文的性質相當於(公開的)個人日記,未經本人允許,請勿轉載。

 

上文說到,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,另一頭在系統中模擬鍵盤或鼠標的動作。

下篇繼續。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章