1. 程式人生 > >Android USB Host 與 HID 之通訊方法(bulkTransfer()與controlTransfer()方法使用)

Android USB Host 與 HID 之通訊方法(bulkTransfer()與controlTransfer()方法使用)

轉載地址:差滿多乃幾

Android USB Host與HID通訊,就目前Google Developer提供的方法有bulkTransfer()與controlTransfer(),看是簡簡單單的兩個方法,要實現真正的通訊可謂要難倒一大片android開發者,至少對於我一開始就是這樣,這對和我一樣不懂HID及外設等底層通訊原理的人更是一個頭兩個大,況且不同的HID具體通訊機制也不同,因裝置而異。

    先不管其他,先仔細看看bulkTransfer()與controlTransfer()方法吧,個人覺得google Developer給出的資料太少,沒啥詳細說明,初一看簡單,真正一用才知道問題一大堆。。

1)  

bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout);
    功能:Performs a bulk transaction on the given endpoint.沒什麼說的google原版解釋,在我們給定的端點執行一個bulk transaction;
    引數:endpoint,OUT or IN(Host to Device用OUT,Device to Host 用IN);
          buffer  ,你將要傳送/接收的指令或資料,當endpoint為OUT,buffer為你定義好的指令或資料,將下發給device,當endpoint為IN,buffer則是一個容器,用來儲存device返回的應答指令或資料,此時一定要注意buffer的大小,以足夠儲存所有的資料;

length  ,即傳送/接收指令或資料的大小;
timeout ,即指令或資料的最長通訊時間,在通訊出現問題時,若超時還未通訊完成,視為通訊失敗;
    說明:此方法還算好,按照正常操作定義好4個引數,都可以正常實現,重點是對與不同裝置進行bulkTransfer()的組合使用,指令下發次序和資料接收處理等問題,這些在此先不詳談,有時間下次再詳細~~

2)  

controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
        功能:Performs a control transaction on endpoint zero.說直白點就是零點傳輸執行一個control transaction,即所有的通訊都是通過endpoint 0;
        引數:requestType,request type for this transaction
                  request      ,request ID
for this transaction
                  value         ,value field for this transaction
                  index         ,index field for this transaction
                  buffer       ,同bulkTransfer()
                  length       ,同bulkTransfer()
                  timeout     ,同bulkTransfer()
        說明:此方法個人而言,難點在7個引數,特別是前四個引數,google能給出的針對各引數的具體說明少,到現在都還不太確定,所以前四個引數都只給出google的原解釋。requestType可以確定是USB_ENDPOINT_DIR_MASK其中包含USB_DIR_OUT和USB_DIR_IN兩種型別,而對於request,value,index,沒有具體詳細,我試了很多種情況,也看了下樣例和在網上看了些他人的資料,至今未能完全弄懂,求分享,求擴散中~~

一些簡單的基礎知識(自己後加的)

2.1 UsbManager
負責管理USB裝置的類,你可以在相應程式碼中通過以下方法獲得此物件的一個例項:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
該類提供的主要方法有:
1) getDeviceList()
獲得裝置列表,返回的是一個HashMap.;
2) hasPermission(UsbDevice device)
判斷你的應用程式是否有接入此USB裝置的許可權,如果有則返回真,否則返回false.
3) openDevice(UsbDevice device)
開啟USB裝置,以便向此USB裝置傳送和接受資料,返回一個關於此USB裝置的連線。
4) requestPermission(UsbDevice device, PendingIntent pi)
向USB裝置請求臨時的接入許可權。

2.2 UsbDevice
代表一個USB裝置的類,每個裝置都包含了一個或多個介面,每個介面又包含一個或多個節點用來與此裝置傳輸資料。該類的主要方法有:
1) getDeviceClass()
返回此USB裝置的類別,用一個整型來表示。
2) getDeviceId()
返回唯一標識此裝置的ID號,也用一個整型來表示。
3) getDeviceName()
返回此裝置的名稱,用一個字串來表示。
4) getDeviceProtocol()
返回此裝置的協議類別,用一個整型來表示。
5) getDeviceSubclass()
返回此裝置的子類別,用一個整型來表示。
6) getVendorId()
返回生產商ID
7) getProductId()
返回產品ID
8) getInterfaceCount()
返回此裝置的介面數量
9) getInterface(int index)
得到此裝置的一個介面,返回一個UsbInterface。

2.3UsbInterface
代表USB裝置的一個介面,注意:UsbInterface本身是一個類,並不是一個介面。此類的主要方法有以下:
1) getId()
得到給介面的id號。
2) getInterfaceClass()
得到該介面的類別。
3) getInterfaceSubclass()
得到該介面的子類。
4) getInterfaceProtocol()
得到該介面的協議類別。
5) getEndpointCount()
獲得關於此介面的節點數量。
6) getEndpoint(int index)
對於指定的index獲得此介面的一個節點,返回一個UsbEndpoint.
2.4 UsbEndpoint
代表一個介面的某個節點的類。該類主要提供了一下方法供你使用:
1) getAddress()
獲得此節點的地址
2) getAttributes()
獲得此節點的屬性
3) getDirection()
獲得此節點的資料傳輸方向
2.5 UsbDeviceConnection
代表USB連線的一個類。用此連線可以想USB裝置傳送和接收資料,可以通過呼叫該方法openDevice(UsbDevice) 來得到該類的一個例項。該類提供了以下方法供你使用:
1)bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
通過給定的endpoint來進行大量的資料傳輸,傳輸的方向取決於該節點的方向,buffer是要傳送或接收的位元組陣列,length是該位元組陣列的長度。傳輸成功則返回所傳輸的位元組陣列的長度,失敗則返回負數。
2)controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
該方法通過0節點向此裝置傳輸資料,傳輸的方向取決於請求的類別,如果requestType為USB_DIR_OUT則為寫資料,USB_DIR_IN, 則為讀資料