在硬體互動的首篇對設備硬體的分類中,互聯通信系列硬體主要用來與其他設備進行資料互動,從本文開始,將重點介紹該系列相關硬體,
互聯通信系列硬體
根據硬體的可通信距離,由近及遠分為USB、NFC、藍牙、WLAN,SIM卡槽,這些硬體之間的功能原理及關系可以查找其他資料詳細學習,總之,他們為當前設備與其他設備的互動搭建了橋梁,只要雙方設備均遵循該系列硬體的協議,就可以在硬體層互相通信,而設備上的Android作業系統便會將硬體層的資料轉換為應用層資料,進而與應用程式互動,這樣也就實作了兩個不同設備上的應用程式間的互動方案,理論上這個方案是可行的,那實際各硬體的使用方式分別是怎么樣的呢?
USB介面
在應用程式中與USB硬體的互動,系統提供了兩種方式,包括將該應用程式所在設備的USB介面作為主機模式,和該應用程式所在設備的USB介面作為配件模式,在主機模式下,該應用程式所在設備通過USB介面為其他接入的USB設備供電,通常連接沒有自帶電源的設備(比如U盤)時啟用此種模式;反之在配件模式下,是該應用程式所在設備接收通過USB介面接入的其他USB設備的電源提供,通常在連接有電源的設備(比如筆記本電腦)時啟用此模式,理論上這兩種模式只是針對USB硬體的供電方不同而區分,均可以在USB介面連接的兩個設備之間的資料傳輸,
主機模式
權限宣告
在應用程式的清單檔案中,需要宣告<uses-feature />標簽,并設定其屬性android:name值為"android.hardware.usb.host",該標簽設定并不是通過應用程式向系統申請權限,而是宣告應用程式需要使用USB主機模式,
使用流程
獲取USB主機設備
主機模式下,其中一種常用情況,應用程式可以監聽插入USB介面的設備,此時可以在需要監聽的界面Activity對應的清單檔案注冊資訊中增加指定的接收意圖,意圖值為android.hardware.usb.action.USB_DEVICE_ATTACHED,這樣在USB設備接入后,系統會發送上述意圖值的廣播,從而啟動當前界面Activity,
在啟動后的界面Activity中,可以呼叫getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE)系列方法,獲取android.hardware.usb.UsbDevice USB設備類的物件,
主機模式下另外一種情況,是直接獲取已連接的USB設備,在能獲取背景關系環境Context物件的地方,呼叫該物件的getSystemService(String name),并指定引數值 name 為Context.USB_SERVICE="usb",獲得android.hardware.usb.UsbManagerUSB管理類的物件,呼叫該物件的getDeviceList()方法,回傳List<UsbDevice>,同樣能獲取到當前設備連接的所有USB硬體物件的串列資料,
在直接獲取已連接USB設備的情況下,應用程式需要主動向用戶申請設備通信權限,通過
USBManager設備管理類物件的requestPermission(UsbAccessory accessory, PendingIntent pi)方法,在用戶同意授權后,才能繼續后續設備通信操作,
USB設備通信
在拿到UsbDevice型別的USB設備類物件,和UsbManager管理類物件之后,呼叫USB管理類物件的openDevice(UsbDevice device)方法,得到android.hardware.usb.UsbDeviceConnection USB設備連接物件,其引數 device 便是要通信的USB設備物件,
建立UsbDeviceConnection設備連接物件后,通信程序中還需要分別借助android.hardware.usb.UsbInterface USB介面類和android.hardware.usb.UsbEndpoint USB端點類,
在獲取UsbDevice型別的設備類物件后,呼叫其getInterface(int index)方法獲取UsbInterfaceUSB介面類物件,其中引數 index 是當前USB設備可獲取的所有介面數量中的索引值,而獲取UsbDevice的所有介面數量,可根據另外一個方法getInterfaceCount()查看,
在獲取UsbInterface型別的介面物件后,呼叫其getEndpoint(int index)方法獲取UsbEndpointUSB端點類物件,其中引數 index 是當前USB介面中可獲取的所有斷點數量中的索引值,而獲取UsbInterface的所有斷點數量,可根據另外一個方法getEndpointCount()查看,
通過梅開二度獲取USB介面物件和USB端點物件之后,首先要占用USB設備資源,繼續呼叫UsbDeviceConnection連接物件的claimInterface(UsbInterface intf, boolean force)方法,其中引數 intf 便是上文獲取UsbInterface介面類物件,引數 force 標明是否強制占用,回傳boolean型別的結果表示占用是否成功,
在占用USB設備資源之后,就可以接收USB設備的通信資料了,呼叫UsbDeviceConnection連接物件的bulkTransfer (UsbEndpoint endpoint, byte[] buffer, int offset, int length, int timeout)方法,引數 endpoint 便是上文獲取UsbEndpoint端點類物件;引數 buffer 用以存盤通信中的二進制陣列;引數 offset 可選項,默認值為0,用以標記存放陣列 buffer 的起始位置;引數 length 用以標記存放陣列的長度;引數 timeout 作為通信連接的最大時長,回傳通信程序中實際傳輸的資料長度,
通信結束后,只需要關閉連接并釋放占用的設備資源,呼叫UsbDeviceConnection連接物件的close()方法可以關閉通信連接,而呼叫該物件的releaseInterface(UsbInterface intf)方法可以釋放占用的UsbInterface設備介面型別的引數 intf 物件,
配件模式
權限宣告
在應用程式的清單檔案中,需要宣告<uses-feature />標簽,并設定其屬性android:name值為"android.hardware.usb.accessory",該標簽設定并不是通過應用程式向系統申請權限,而是宣告應用程式需要使用USB配件模式,
使用流程
獲取USB配件
配件模式下,其中一種常用情況,應用程式可以監聽插入USB介面的設備,此時可以在需要監聽的界面Activity對應的清單檔案注冊資訊中增加指定的接收意圖,意圖值為android.hardware.usb.action.USB_ACCESSORY_ATTACHED,這樣在USB設備接入后,系統會發送上述意圖值的廣播,從而啟動當前界面Activity,
在啟動后的界面Activity中,可以呼叫getIntent().getParcelableExtra(UsbManager.EXTRA_ACCESSORY)系列方法,獲取android.hardware.usb.UsbAccessory USB配件類的物件,
同樣在配件模式下另外一種情況,是直接獲取已連接的USB配件,在能獲取背景關系環境Context物件的地方,呼叫該物件的getSystemService(String name),并指定引數值 name 為Context.USB_SERVICE="usb",獲得android.hardware.usb.UsbManagerUSB管理類的物件,呼叫該物件的getAccessoryList()方法,回傳List<UsbAccessory>,同樣能獲取到當前設備連接的所有USB配件物件的串列資料,
與主機模式類似,在直接獲取已連接USB配件的情況下,應用程式需要主動向用戶申請設備通信權限,通過
USBManager設備管理類物件的requestPermission(UsbAccessory accessory, PendingIntent pi)方法,在用戶同意授權后,才能繼續后續設備通信操作,
USB設備通信
在拿到UsbAccessory型別的USB配件類物件,和UsbManager管理類物件之后,呼叫USB管理類物件的openAccessory(UsbAccessory accessory)方法,得到android.os.ParcelFileDescriptor 資料流化的檔案描述符類的物件,其引數 accessory 便是要通信的USB配件物件,
在獲取ParcelFileDescriptor資料流化的檔案描述符類的物件后,呼叫其getFileDescriptor()方法得到java.io.FileDescriptor普通的檔案描述符型別的物件,之后通過該物件創建基本的檔案輸入流java.io.FileInputStream物件以讀取USB配件中的資料,或者創建基本的檔案輸出流java.io.FileOutputStream物件以將資料寫入USB配件中,
通信結束后,只需要關閉資料流化的檔案描述符的占用即可,通過呼叫ParcelFileDescriptor物件的close()方法以實作該操作,
主機模式與配件模式的區別
代碼軟體層
主機模式下,主要使用UsbDevice類,可以獲取所連接USB設備的詳細資訊,
配件模式下,只能使用UsbAccessory類,只能獲取連接USB設備的基本資訊,
硬體層
主機模式下,由應用程式所在的設備向主線供電,并向連接的USB設備供電,
配件模式下,由連接的USB設備作為主機向主線供電,并向應用程式所在的設備供電,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413214.html
標籤:其他
