Android ADK

11,178 views
11,009 views

Published on

http://www.ittraining.com.tw/workshop/workshop.html

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,178
On SlideShare
0
From Embeds
0
Number of Embeds
8,086
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Android ADK

  1. 1. Android IO Workshop 作者: Jarey
  2. 2. 關於艾鍗• 艾鍗學院為艾鍗科技所設立的一所專業的嵌入式系統軟 韌體開發教育訓練中心,提供產業之研發人員所需的專 業軟韌體訓練課程• 與 共同合作開設 嵌入式處理器/機器人軟體開發工程師訓練課程
  3. 3. 艾鍗學院的會員已累計40多家科技公司 3
  4. 4. 講師介紹-Jarey捷銳行動科技有限公司/ 創辦人學經歷:  東華大學資訊工程碩士  訊舟科技股份公司/SW Leader 專長  網通科技公司/PM 產品管理 Java/C/C++程式語言  Catcan機器人設計領域科技公司/Firmware工程師 Android 程式設計  艾鍗學院專任講師(Android應用程式開發、Java) 人機介面設計  經濟部工業局99年度數位內容產業發展躍進計畫 Linux程式設計 -Android手機應用程式開發A班講師。 單晶片程式設計(Atmel、  經濟部工業局99年度數位內容產業發展躍進計畫 Arduino、Renesas) -Embedded Linux行動應用加值開發就業班講師。 ARM9嵌入式系統  經濟部工業局99年度數位內容產業發展躍進計畫 網路程式設計 -Android手機應用程式開發B班講師。 網路通訊協定  台中技術學院-Android應用程式開發應用 講師 無線區域網路 著作:  Ajile程式設計開發手冊(java硬體化平台設計)  Java + Android開發課程(艾鍗教材) 4
  5. 5. Agenda Android USB週邊裝置應用發展  Android USB 週邊商機  Android VS IPhone USB Accessory 開發 Android Open Accessory Development Kit  ADK運作架構介紹  Android Accessory Protocol  ADK開發工具下載與Eclipse環境建置 MicroChip ADK Lib 應用實作  MicroChip Android ADK Lib架構介紹  與ADK進行連線通訊流程  全雙工資料處理設計(多執行緒)  ADK的除錯方式 5
  6. 6. Android USB週邊裝置應用發展 早期Android週邊裝置  在Google放出ADK工具之前,SmartPhone的週邊產品不 外乎為手機保護套、車用連接架、喇叭底座、外掛電池。 Android ADK 開放性週邊開發套件  2011年5月10 Google IO 2011大會發布Android3.1平版作 業系統,同時間也正式放出了全新的Android USB週邊設 備開發套件(Android Open Accessory Development Kit)  Android 3.1與手機版Android 2.3.4之後便開始支援ADK開 發套件,開發者可以自行設計相關的USB週邊裝置,這將 為Android Market帶來許多與硬體產品相結合的APP,這 也是個機會能讓你所開發的APP在Market眾多的APP中與 眾不同產生明顯的差異化。 6
  7. 7. Android USB週邊裝置應用發展 Android USB週邊設備商機  Gartner研究機構指出,預期從 2011年開始,iPad以及其它媒 體平板將開始取代部分筆記型 電腦產品,這將減緩家庭用PC 的出貨量。  平版與手機將逐侵蝕傳統PC與 USB介面 NB的市場。 遊戲週邊 健康醫療設備  使用者漸漸的會開始期待所購 買USB週邊設備,除了能在PC 上運行之外,也能同時在平版 運動休閒設備 音樂控制介面 電腦上運行。 安全防護應用 工業控制介面 USB KEY 7
  8. 8. Android USB週邊裝置應用發展 Android USB週邊設備商機  在Android多樣且開放性的平 台優勢下,其產品的市佔率 將不斷的攀升。  目前支援ADK的手機與平版 佔整體Android的比例不高, 但隨著Android 4.0將手機與 平版系統整合為一後,在不 久的將來經過汰舊換新後, 絕大部份的Android手機與平 版都將支援ADK介面。 8
  9. 9. Android USB週邊裝置應用發展 Android IO 2011應用Demo  Android手機透過ADK連接跑步機…健身器材。  Android 遊戲控制(http://youtu.be/GrE_JO5rXKA)  Android機器人控制(http://youtu.be/jwvkJVUECrg) 9
  10. 10. Android USB週邊裝置應用發展 艾鍗學院開發之相關應用  Android平版透過ADK連接KTV系統 10
  11. 11. Android VS iPhone USB週邊開發 Android  開放H/W平台  Open協定與SourceCode  免審核機制  免授權費 iPhone  需要取得Made for iPhone認證  認證要求高 , 審核時程長  申請成功後需要支付授權費  申請成功才能拿到開發文件技術  Apple擁有隨時終止你產品的權利 11
  12. 12. ADK運作架構介紹 ADK於Android的API支援  Android 3.1 平板電腦作業系統已內建 Android Open Accessory Development Kit ( ADK ) 的 Android Open Accessory APIs ,並具備USB Host mode 。  Android 2.3.4 智慧型手機作業系統可以透過 Google APIs 附加函式庫 (Google APIs add-on library ) 的方式運作。) USB Host and Accessory Mode ※USB Host Mode只在 Android 3.1以上版本支援 12
  13. 13. ADK運作架構介紹 USB Accessory API(android.hardware.usb) Class Description UsbManager Allows you to enumerate and communicate with connected USB accessories. UsbAccessory Represents a USB accessory and contains methods to access its identifying information. USB Host API(android.hardware.usb Class Description Allows you to enumerate and communicate with connected USB devices. UsbManager Represents a connected USB device and contains methods to access its identifying information, UsbDevice interfaces, and endpoints. Represents an interface of a USB device, which defines a set of functionality for the device. A device can UsbInterface have one or more interfaces on which to communicate on. Represents an interface endpoint, which is a communication channel for this interface. An interface can UsbEndpoint have one or more endpoints, and usually has input and output endpoints for two-way communication with the device. Represents a connection to the device, which transfers data on endpoints. This class allows you to send UsbDeviceConnection data back and forth sychronously or asynchronously. Represents an asynchronous request to communicate with a device through a UsbDeviceConnection. UsbRequest Defines USB constants that correspond to definitions in linux/usb/ch9.h of the Linux kernel. UsbConstants 13
  14. 14. ADK運作架構介紹 Android USB 週邊連接架構 Android 手機/平版 MCU控制層 ADK Support IO資料傳輸 14
  15. 15. Android Accessory Protocol Android Accessory Protocol  任何Android USB Accessory皆必須實作Accessory Protocol,該 Protocol為開放協定,其定義了裝置偵測(detects)與通訊連線初始化 流程(包含mode切換機制)。 Accessory Protocol通訊流程  等待偵測裝置連線  確認裝置支援Accessory mode  如果該裝置支援USB Accessory mode,則建立兩者之間的通訊通道。 ADK開發版運作於Host Mode  由開發版供電給手機/平版  手機端運作於Accessory Mode 透過Accessory API與開發版通訊  開發版需偵測Android裝置的PID與VID,以確保連線的裝置為 Google 手機/平版  Google vendor ID:(0x18D1) Product ID: 0x2D00 or 0x2D01 15
  16. 16. Android Accessory Protocol Android Accessory 初始化流程(USB H/W與手機內部溝通交握程序) 1. USB 線路之連接確認:當《 USB 週邊設備》與 《 Android 裝置》之間的 USB 線路連接與裝置偵測無誤後,彼此才會開始進行溝通動作。 2. 識別代碼之產生:在此過程中,《 Android 裝置》會先依製造商與設備型號 等資料,去產生一個屬於自己的新 VID/PID 識別代碼。 3. 設備模式 ( Accessory Mode ) 之支援確認:然後,《 USB 週邊設備》則需發 送一個控制交易訊息 ( Control Transaction ) 給《 Android 裝置》,詢問它是 否支援設備模式 ( Accessory Mode ) 。 4. 應用程式之相容確認:一旦《 Android 裝置》向《 USB 週邊設備》確認支援 設備模式 Accessory Mode ) 時,《 USB 週邊設備》會透過控制交易訊息傳 送一連串的字串給《 Android 裝置》。這些字串是提供《 Android 裝置》去 確認它的系統中是否有相容於該《 USB 週邊設備》的應用程式。 5. 下載安裝相容應用程式:假若,它沒有找到合適的應用程式時,該訊息也會 提供一個 URL 網址,以供《 Android 裝置》的用戶至網路下載安裝相容於該 《 USB 週邊設備》的應用程式。(註:該 URL 網址可以是該應用程式在 Android Market 之中的下載網址) 6. 設備模式 ( Accessory Mode ) 開始運作:這個步驟完成後,《 USB 週邊設備》 會再傳送一個控制交易訊息給《 Android 裝置》,以告知《 Android 裝置》 可以進入設備模式 ( Accessory Mode ) 16
  17. 17. Android Open Accessory Development Kit 開發環境所需工具  Java JDK 1.6以上  http://www.oracle.com/technetwork/java/javase/downloads/ index.html  Eclipse IDE開發工具  http://www.eclipse.org/  Android 開發工具ADT  http://developer.android.com/sdk/eclipse-adt.html  Android SDK (2.3.4以上版本)  http://developer.android.com/sdk/index.html  Microchip pic24 Development kit for android  http://www.microchip.com/stellent/idcplg?IdcService=SS_G ET_PAGE&nodeId=1406&dDocName=en553673  Android 實體手機(2.3.4以上/平版3.1以上)  ADK開發版H/W 17
  18. 18. Android開發環境建置-JDK6下載 下載JDK環境  http://www.oracle.com/technetwork/java/javase/downloads/inde x.html為你把關每一道 學習品質 18
  19. 19. Android開發環境建置-Eclipse 下載 下載安裝Eclipse開發工具  http://www.eclipse.org/downloads/為你把關每一道 學習品質 19
  20. 20. Android開發環境建置-安裝ADT 安裝Android ADT開發環境為你把關每一道 學習品質 20
  21. 21. Android開發環境建置-安裝ADT 透過Eclipse plugin安裝工具下載ADT  http://dl-ssl.google.com/android/eclipse/為你把關每一道 學習品質 21
  22. 22. Android開發環境建置-下載SDK 下載Android SDK(也可透過ADT自動下載)  http://developer.android.com/intl/zh-TW/sdk/index.html為你把關每一道 學習品質 22
  23. 23. Android開發環境建置-設定SDK 指定Android SDK所在路徑為你把關每一道 學習品質 23
  24. 24. Android開發環境建置-更新SDK為你把關每一道 學習品質 24
  25. 25. Android開發環境建置-更新SDK為你把關每一道 學習品質 25
  26. 26. MicroChip ADK Lib 架構介紹 MicroChip提供更高階包裝的LIB  MicroChip提供一層更高階的warp類別,將複雜的 USB 連線,斷線,初始化,資料快取,Thread管 理.等等機制包裝起來,讓開發者可以更專注在資料 封包的制定與UI的互動設計上。  外包的類別分別為: USBAccessoryManager與 USBAccessoryManagerMessage 26
  27. 27. MicroChip ADK Lib 架構介紹 USBAccessoryManager 類別  USB Accessory管理層,處理連線、斷線處理、資料的讀、寫  支援Buffer快取從USB讀入的資料  讀取部份使用單獨的work thread,可全雙工進行資料IO USBAccessoryManager 高階函式庫 handleravailable() Buffer Messagedisable()enable() ReadThreadisConnected()peek(byte[]) Create USBread(byte[]) Accessory InputStreamwrite(byte[]) 連線管理 OutputStream 27
  28. 28. MicroChip ADK Lib 架構介紹 USBAccessoryManagerMessage 類別  提供Android Read Thread用來與UI Thread函式通訊用的封包  資料透過Java的封裝特性被封裝在USBAccessoryManagerMessage 中  最終資料將被掛在 android.os.message物件中(object欄位)透過 Handler傳送至UI Thread中處理。  USBAccessoryManagerMessage所所定義的封裝資料為: public enum MessageType { READ, ERROR, CONNECTED, DISCONNECTED, READY }; 28
  29. 29. 與ADK進行連線通訊開發流程 STEP1:建立新的Android專案  SDK 目標版本需選擇在Level 10(含Google API版本)以上 29
  30. 30. 與ADK進行連線通訊開發流程 STEP 2:載入所需的USB Lib  編輯AndroidManifest.xml,使用uses-library tag,輸入所需使用的usb函式庫 <uses-library android:name="com.android.future.usb.accessory" /> 4 1 5 6 3 2 30
  31. 31. 與ADK進行連線通訊開發流程 STEP 3:撰寫USB Plug&Play 自動偵測USB裝置並開啟APP  於AndroidManifest.xml中利用intent-filter,濾出當USB裝置插入時所要啟動的 Activity頁面。 <intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" />  另外需要外掛一個meta-data欄位,指定過濾的條件需為一個xml檔: <resources> <usb-accessory manufacturer=“Ittraining Technology Inc." model="Basic Accessory Demo"version="1.0"/> </resources> 31
  32. 32. 與ADK進行連線通訊開發流程 STEP 4:滙入IT_ADK_LIB專案  IT_ADK_LIB專案中包含了USBAccessoryManager與 USBAccessoryManagerMessage 兩個高階函式類別, IT_ADK_LIB專 案己經宣告為Library型式的專案,可供其他Android Project直接引用。  在你的練習範例中宣告引入IT_ADK_LIB專案(專案上按右鍵點選內容) 32
  33. 33. 與ADK進行連線通訊開發流程 STEP 5:於Activity中撰寫Handler類別  Handler, Message, Looper, MessageQueue 為Android設計在 不同Thread/Process之間互相通訊與傳遞訊息的機制,為 Android核心設計中相當重要的一環。 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; handleMessage handleMessagemessage 主執行緒 message Looper UI Thread 子執行緒 Looper MQ Push MQ Handler 33
  34. 34. 與ADK進行連線通訊開發流程 STEP 6:建構USBAccessoryManager物件  建構式需帶入二個參數: Handler handler物件與int what 其中what指的是當USBAccessoryManager讀取到來至ADK開發 版的事件代碼,可供在handlerMessage函式中識別用。 private final static int USBAccessoryWhat = 0; private USBAccessoryManager accessoryManager public void onCreate(Bundle savedInstanceState) { ….略 accessoryManager = new USBAccessoryManager(handler, USBAccessoryWhat); ….略 } 34
  35. 35. 與ADK進行連線通訊開發流程 STEP 6:依Activity生命週期啟動與關閉USBAccessoryManager  於onResume()中啟動USBAccessoryManager  於onPause()或onStop()函式關閉USBAccessoryManager public void onResume() { super.onResume(); accessoryManager.enable(this); } public void onStop () { super.onPause(); accessoryManager.disable(this); } 35
  36. 36. 與ADK進行連線通訊開發流程 STEP 7:寫入資料至ADK開發版  包裝message封包,並透過handler物件將message封包送往UI Thread的Message Queue中排程,排程時間到時會交由 handlerMessage函式進行處理。  Message物件可以透過obtain取得快取中先前用過的message來 重複使用,可有效節省記憶體消耗。 public final Message obtainMessage (int what, int arg1, int arg2, Object obj)  透過Handler物件中的sendMessage將message推入 MessageQueue Message msg=handler.obtainMessage(1,0,0,null); handler.sendMessage(msg); 36
  37. 37. 與ADK進行連線通訊開發流程 STEP 8:覆寫Handler中的handlerMessage函式  無論是從ADK開發版送上來的資料,或是準備要被寫入到ADK 開發版的資料,最終都會被送到MessageQueue中排程被處理。  系統的Looper物件會自動檢查MessageQueue中是否有資料需 要處理,若有則會自動呼叫handlerMessage函式。 public void handleMessage(Message msg) { switch(msg.what){ case USBAccessoryWhat: //從ADK開發版讀到的資料,資料被封裝在msg.obj物件中 switch(((USBAccessoryManagerMessage)msg.obj).type) { case READ: if(accessoryManager.isConnected() == false) return; break; case CONNECTED: break; case READY: setTitle("Ittraining Demo: Device connected."); break; case DISCONNECTED: disconnectAccessory(); break; } break; default: break; } } 37
  38. 38. 與ADK進行連線通訊開發流程 STEP 9:ADK資料的讀、寫  ADK資料的讀寫可以透過USBAccessoryManager中的read與write函式 呼叫來完成處理。  其中read資料並不是直接和ADK開發版要求資料,而是直接向系統中的 Buffer取得資料(Manager中有實作Buffer快取) //回傳目前buffer中還有多少資料可以被讀取 int available() //從buffer中讀取 array大小的資料,回傳實際讀取了多少資料 int read(byte[] array) //從buffer中讀滿array的資料,回傳實際讀取了多少資料 int peek(byte[] array) //從buffer中丟棄指定大小的資料 void ignore(int num) 38
  39. 39. 全雙工資料處理設計 提升ADK資料讀、寫效率  建立兩個執行緒,一個負責寫入資料,一個負責讀取資料。  子執行緒本身不具有Looper與MQ,因必須先為子執行緒建立Looper與MQ物件。 Activity USBAccessory Activity Activity Manager readHandler writeHandler handleMessage handleMessagemessage 讀取 寫入 message Looper Looper 執行緒 執行緒 MQ MQ 39
  40. 40. 全雙工資料處理設計 替子執行緒產生Looper與MQ public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException(Class subThread implements Runnable{ "Only one Looper may be created public void run(){ per thread"); } Looper.prepare(); 框架原始碼 sThreadLocal.set(new Looper()); workLooper = Looper.myLooper(); } h = new Handler(){ public handlerMessage(Message msg){ //處理message } }; private Looper() { Looper.loop(); 框架原始碼 mQueue = new MessageQueue(); mRun = true; } mThread = Thread.currentThread();} } 40
  41. 41. 全雙工資料處理設計 如何於子執行緒中變更UI內容  在Android中非UI Thread是不能直接去控制UI,一但違反此條件,系統 將會造成應用強制結束。  在Android子執行緒要進入UI Thread去變更UI內容,有以下的四種方法• 透過掛Handler Push Message/Runnable於UI Thread 處理UI內容• 透過Activity.runOnUIThread(),直接指定進入UI Thread內處理• 透過View.Post(Runnable)介面處理• 透過AsncTask類別協助處理,需1.5版後的Android才有支援。 41
  42. 42. ADK的除錯方式 ADK Debug方式  由於USB線被USB Accessory裝置給佔用,因此將無法使利用ADB透過 USB線做Debug的連線。  需改使用WiFi ADB連線,此功能需要root權限 WiFi ADB  可於market搜尋adb wifi 可以找到許多相關的軟體。  或是先利用USB 連接電腦透過adb 輸入以下指令: adb shell setprop service.adb.tcp.port 8000 stop adbd start adbd  在透過adb connect指令進行連線 //透過wifi進行adb連接 adb connect 192.168.1.103:8000 //讓手機進入監聽usb連線狀態 adb usb 42

×