1. 程式人生 > >安卓USB HOST開發之Android平板+OTG線+4口USB hub+4個HID裝置

安卓USB HOST開發之Android平板+OTG線+4口USB hub+4個HID裝置

        首先解釋一下此開發應用方案涉及到的幾個術語。意思不弄明白,就不好往下玩了。

釋義說明:

       USB host:USB主裝置,可以從另外一個USB 從裝置中取得資料,包括USB host控制器和USB host協議。有主就有從,host裝置與USB device或USB slave從裝置相對應。

       USB OTG:On The Go,正在進行中的意思,直接傳輸,就是可以從一個機器直接傳到另一個機器中。直接的意思為使用者不需要其他的輔助,比如軟體驅動,硬體介面轉換等。

       USB HUB:USB擴充套件/集線器,一種可以將一個USB介面擴充套件為多個(通常為4個),可以使這些介面同時使用的儀器。Android4.4系統的平板電腦如NEXUS 7不支援USB HUB。

     USB-HID:全稱為Human Interface Device,能直接與人互動的裝置,例如鍵盤、滑鼠與遊戲杆等,作業系統會自帶HID裝置的驅動程式。

要準備的硬體裝置有:

         一、Android USB HOST開發一定要用真機測試,模擬器是做不到的。沒有真機還是等等吧。不能在腦海裡妄想程式的執行結果吧,開發也算科學實驗,是實驗就是要放到實際環境中不斷的測試除錯,俗話說把騾子或馬拿出去溜溜才知道結果,沒有真機就無法連線USB OTG和HID裝置。

        二、需要USB OTG線和USB HUB(4口或7口的都行,有一種把OTG和HUB整合在一個板子上的USB HUB,有一個外接電源介面給耗電較大的裝置輔助供電)

        三、主角是要讀取資料的物件和來源----HUB HID裝置。


硬體拿到手了以後就要先摸清楚一些硬體的情況:

         一、關於Android平板:由於Android3.1(API12)以上才支援USB HOST模式,因此需要高系統版本的平板電腦,本方案用的是裝Android5.0.1系統的Google親兒子NEXUS 9。

由於眾所周知的原因,國內是沒有國行NEXUS賣的,這些要麼是淘寶海淘代購,要麼就是港行,這是題外話了。當然用其他的國產主流平板也可以。

支援OTG和識別到USB HUB連線到的裝置。注意:並不需要把新平板ROOT。由於USB host開發主要用到的包有

android.hardware.usb.UsbConstants;
android.hardware.usb.UsbDevice;
android.hardware.usb.UsbDeviceConnection;
android.hardware.usb.UsbEndpoint;
android.hardware.usb.UsbInterface;
android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;

所以需要確認Android系統根目錄下的許可權檔案有沒有android.hardware.usb.host.xml檔案和tablet_core_hardware.xml或者handheld_core_hardware.xml。如果是平板就是tablet配置檔案,手機就是handheld配置檔案。具體操作開啟ES或RE檔案瀏覽器、根目錄、/system/etc/permissions。檢視這兩個檔案。或者直接用cmd命令檔案匯入這兩個檔案,本文最後會留下cmd格式修復檔案的下載地址。還有一款老外開發的APP(需要ROOT許可權才能修改系統檔案)專門用來檢測手機或平板電腦是否支援USB HOST,本文後也將一同提供下載連結。

     二、關於USB HID裝置:要獲得裝置的資訊,兵法上說知己知彼百戰不殆,開發如戰場,要了解開發物件的身子骨怎麼樣,有幾斤幾兩。摸清楚底,做到心中有數。具體要獲取的引數包括:USB 廠商ID、產品ID、有幾個介面、介面號多少、幾號介面的讀端點號、寫端點號、讀端點地址、寫端點地址、底層通訊協議等。可以把USB裝置連線到電腦上,通過檢視裝置管理器的裝置屬性、詳細資訊、屬性、硬體ID,看下面的值是多少獲得VID和PID。也可以用Bus Hound軟體檢視更多詳細資訊,或者在安卓手機或平板上安裝一個專門看USB device info的APP。

   三、關於USB HUB裝置: 平板+OTG線+USB Hub+多個裝置方案中的多個裝置都是由一個平板來供電的,一個平板電腦可能不足以同時驅動如此之多的外設。但是這次要用的4個HID裝置都是自帶鋰電池的,可以自己供電。不存在供電不足的問題。請確認你的HID裝置是否自帶電池,如果沒有考慮給HUB外接電源。

注意:HID裝置不需要使用者自己寫驅動程式。Android系統內部已自帶這種裝置型別的驅動。以前就因為驅動的問題就把安卓的USB開發擱置下來了,實在不瞭解驅動開發。

必要的檢視除錯日誌設定:安卓平板或手機只有一個microUSB介面,用這唯一的USB介面連線了USB裝置後,那開發過程中的日誌怎麼看呢?為此Google搞了一個開發電腦通過wifi網路連線平板的方式。怎麼實現呢?

首先,把SDK路徑加入系統環境變數中。

平板或手機用一根microUSB線連線上開發電腦,等連線成功後拔掉usb連線線,接上otg線。

命令列輸入:adb tcpip 5037         注:5037為埠,只要是未被佔用的都可以。

命令列回覆:restarting in TCP mode port: 5037

命令列輸入:adb connect 192.168.1.120:5037

命令列回覆:connected to 192.168.1.120:5037

收到已連線的回覆後,說明連線建立成功,就可以回Eclipse或AS看程式執行的日誌了。

一定要看日誌,這就等於獲得了開發程式的眼睛,不能像個瞎子一樣亂試亂撞。找到錯誤的原因,發現程式執行的機理就靠它啦!這一步很重要!。

     這些前提條件都準備好了,那就真正開始吧。

關鍵程式碼片段:

UsbInterface usbInterface = mUsbDevice.getInterface(0);
mInterface = usbInterface;  
epIn = mInterface.getEndpoint(0);  //讀資料節點
epOut = mInterface.getEndpoint(1); //寫資料節點
UsbDeviceConnection connection = manager.openDevice(mUsbDevice);
connection.claimInterface(mInterface, true);
mDeviceConnection = connection;

由於是公司專案,涉及到智慧財產權保護,在此不便把全部原始碼貼上來。

網上關於Android USB HOST的資料,大都是連線一個HID裝置的,不需要USB Hub。要連線多個裝置的資料真的是少之又少,準確的說是一篇都沒有找到過。

一開始甚至還懷疑過Android USB HOST能不能同時和多個HID裝置通訊,理論上USB介面可以通過USB Hub擴充套件到最多連線127個裝置。理論和實際的差距在於,現實中由於各種原因包括USB Hub質量等最多支援同時連線5到6個應該可以實現。要通過Hub同時連線4個HID裝置理論上是沒有問題。有了信心以後,就可以繼續前進了。

       選擇傳輸方式:同步或非同步。

非同步會用到UsbRequest類。

思路一、同步用controlTransfer或bulkTransfer。即控制傳輸或批量傳輸。USB一共有4種傳輸方式,這裡只用了同步的批量傳輸。

思路二、不要在AndroidManifest.xml清單檔案你新增裝置過濾器檔案device_filter.xml。新增的效果是,每次接入裝置作業系統都會自動開啟應用程式,至於是開啟應用程式的哪個頁面,在於你的過濾器在清單檔案裡設定在哪個頁面活動下面。一般最常見的是把過濾器<intent-filter>放在“.MainActivity”裡,當然系統就會自動開啟應用的主頁。如果有若干個應用都設定了一樣VID和PID的device_filter.xml,那麼當接入這個裝置時,就會彈出一個框讓你選擇開啟哪個應用。

    注意:由於網上的資料一般都是講接入一個USB-HID裝置的,因此設定此裝置過濾檔案是恰當的。但是這裡要連線最多4個裝置,如果也新增裝置過濾功能,那麼每接入一次USB裝置,系統就開啟一次應用,接入四次後系統打開了4個相同的應用介面。這樣導致使用者使用體驗嚴重降低,至少要按返回鍵4次才能結束所有應用。所以這裡就不要在清單檔案裡新增裝置過濾檔案了。而是在程式裡動態的去判斷裝置VID和PID是否和我們要訪問的裝置一致。

相關資源下載:

      未完待續中....