27 กรกฎาคม 2556

[IOIO Board] วิธีการเชื่อมต่อบอร์ด IOIO แบบ Open Accessory [เชื่อมต่อผ่านสายสำหรับ 4.2.2 ขึ้นไป]


        กลับมาอีกครั้งกับบทความสำหรับบอร์ด IOIO ที่ห่างหายไปนาน ถ้าผู้ที่หลงเข้ามาอ่านคนใดที่เล่นบอร์ด IOIO อาจจะรู้กันบ้างแล้วว่าไม่สามารถเชื่อมต่อผ่านสาย USB กับอุปกรณ์แอนดรอยด์ 4.2.2 ขึ้นไป ทั้งนี้เพราะว่าบน Android 4.2.2 ได้เพิ่มระบบ Secure USB Debugging เข้ามาเพื่อช่วยป้องกันการเข้าใช้งาน ADB ได้ในระดับหนึ่ง ซึ่งเจ้าตัวที่ว่าจะขอรหัส RSA ของคอมพิวเตอร์ที่ต่อกับอุปกรณ์แอนดรอยด์เวลาที่ใช้ ADB

       เพราะว่า ADB เป็นโปรโตคอลหนึ่งที่สามารถเข้าถึงตัวระบบของแอนดรอยด์ได้จึงต้องมีการป้องกันสำหรับ ADB ซึ่งเป็นที่มาของ Secure USB Debugging ซึ่งจะแสดงหมายเลข RSA ของเครื่องคอมพิวเตอร์ที่ต่อด้วยทุกครั้ง เพื่อให้ผู้ใช้ทราบและเลือกได้ว่าจะอนุญาตให้ใช้งาน ADB ได้หรือไม่


        แต่สำหรับบอร์ด IOIO กลับเจอปัญหาเข้าไปเต็มที่เลยทีเดียว ทั้งนี้ก็เพราะว่าบอร์ด IOIO เป็นแค่บอร์ดไมโครคอนโทรลเลอร์ที่ไม่ได้มี RSA แบบคอมพิวเตอร์เพื่อให้อุปกรณ์แอนดรอยด์เช็คได้ ดังนั้นเวลาที่เชื่อมต่อสาย USB เข้ากับบอร์ด IOIO จึงไม่ทำงาน เกิดอาการไฟสถานะบนบอร์ด IOIO เกิดการติดค้างและไม่ทำงานจึงทำให้ต้องเปลี่ยนไปเชื่อมต่อผ่านบลูทูธแทน (ซึ่งสะดวกกว่านะ)

        แต่ในบางกรณีก็อาจจะมีความจำเป็นต้องใช้งานผ่านสาย USB ทั้งนี้จะเป็นเรื่องของความเร็ว ความแม่นยำของการสั่งงานก็แล้วแต่



        ในบทความนี้ก็จะมานำเสนอวิธีแก้ปัญหาดังกล่าวให้ได้รู้กันว่าบอร์ด IOIO ที่นอกจากจะเชื่อมต่อแบบ ADB และบลูทูธแล้ว ยังสามารถเชื่อมต่อในแบบ Open Accessory ได้อีกด้วย ซึ่งเป็นโปรโตคอลแบบหนึ่งที่มากับ Android 2.3.4 ขึ้นไปที่ยอมให้อุปกรณ์ภายนอกสามารถเชื่อมต่อผ่านสาย USB ได้ โดยเชื่อมต่อกันในระดับหนึ่งเท่านั้น ไม่ได้เข้าถึงระบบแบบ ADB


        ซึ่งการเชื่อมต่อแบบ Open Accessory ไม่ใช่วิธีใหม่แต่อย่างใด เพราะบอร์ดไมโครคอนโทรลเลอร์อย่างเช่น Arduino ADK ก็ใช้การเชื่อมต่อแบบ Open Accessory และอุปกรณ์ USB ก็ด้วย โดยบอร์ด IOIO นี่ล่ะที่เป็นบอร์ดไมโครตัวเดียวเท่านั้นที่ดันสามารถเชื่อมต่อกับอุปกรณ์แอนดรอยด์ผ่าน ADB ได้ ซึ่งผู้พัฒนาบอร์ด IOIO ก็มีไลบรารีสำหรับ Open Accessory ด้วย ถ้าใครที่สังเกต ตอนที่อิมพอร์ตไลบรารีของ IOIO ที่มีสามไฟล์ จะเห็นว่ามีไฟล์ IOIOLibAccessory อยู่ด้วย ซึ่งนั่นล่ะไลบรารีที่ว่า เพราะโดยปกติผู้ที่ใช้งานบอร์ด IOIO จะใช้งานใน IOIOLib กับ IOIOLibBT เป็นหลัก แต่ก็อิมพอร์ตไว้ทั้งสามไฟล์


        สำหรับการสร้างให้แอปพลิเคชันแอนดรอยด์สำหรับบอร์ด IOIO ให้สามารถเชื่อมต่อกับบอร์ด IOIO แบบ Open Accessory ได้นั้นไม่ใช่เรื่องยาก เพราะใช้โปรเจคจากเดิมที่เคยทำไว้ได้เลย เพียงแค่เติมคำสั่งเข้าไปเล็กน้อยก็สามารถใช้งานได้แล้ว แต่เจ้าของบล็อกจะขออธิบายตั้งแต่เริ่มสร้างโปรเจคเลยละกัน โดยบทความนี้จะใช้ ADT Bundle อยู่ ไม่ได้ใช้ Android Studio นะ


        เริ่มแรกเลยก็ให้ไปที่ File > New > Project... เพื่อเริ่มสร้างโปรเจคใหม่


        จากนั้นให้เลือกที่ Android > Android Application Project



        จากนั้นก็ให้กำหนดชื่อโปรเจคและชื่อต่างๆให้เรียบร้อย ส่วน Minimum Required แนะนำให้กำหนดเป็น 2.3.3 ขึ้นไป เพราะว่า Open Accessory สามารถใช้งานได้กับ 2.3.4 ขึ้นไป


        ที่หน้านี้ก็กด Next ข้ามไปเลย



        สำหรับหน้ากำหนดไอคอนก็จัดการตามใจชอบเลย


        สำหรับการกำหนด Activity เริ่มต้น ให้ใช้เป็น Empty Activity


        สำหรับชื่อ Activity กับ Layout เริ่มต้น ก็ตั้งตามใจชอบแล้วก็กดที่ Finish เพื่อเริ่มสร้างโปรเจคขึ้นมาได้เลย แต่ถ้าเป็นมือใหม่ ก็อิงตามชื่อเริ่มต้นไปก่อนก็ได้



        คลิกขวาที่โฟลเดอร์โปรเจคแล้วเลือกที่ Properties


        ที่ช่องซ้ายมือเลือก Android แล้วช่องขวามือเลื่อนลงมา กดปุ่ม Add..


        สำหรับผู้ที่หลงเข้ามาอ่านที่ใช้งานบอร์ด IOIO บ่อยๆก็คงรู้อยู่แล้ว ว่าขั้นตอนนี้ก็คือการอิมพอร์ตไลบรารีของ IOIO ให้กับโปรเจคนั่นเอง ก็ให้ผู้ที่หลงเข้ามาอ่านทำการเพิ่มไลบรารีเข้าไปจนครบทั้งสามตัวเลย



        จากนั้นให้คลิกขวาที่โฟลเดอร์ res แล้วเลือก New > Folder



        ตั้งชื่อโฟลเดอร์ว่า xml โดยโฟลเดอร์นี้จะใช้สำหรับ Open Accessory



        ดูให้ดีๆนะ โฟลเดอร์ xml ต้องอยู่ในโฟลเดอร์ res นะ


        ทีนี้ให้คลิกขวาที่โฟลเดอร์ xml ต่อ แล้วเลือก New > File


        ให้ตั้งชื่อไฟล์ว่า accessory_filter.xml



        โดยที่ไฟล์ดังกล่าวนี้จะใช้สำหรับกำหนดให้แอปพลิเคชันใช้งาน Open Accessory ได้




        ให้พิมพ์คำสั่งเพิ่มลงไปดังนี้

accessory_filter.xml
<?xml version="1.0" encoding="utf-8" ?> <resources> <usb-accessory model="IOIO" /> </resources>




        เปิดไฟล์ AndroidManifest.xml ขึ้นมา



        ให้เพิ่มโค๊ดที่เป็นข้อความสีแดงลงไปใน AndroidManifest.xml


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.inex.ioioopenaccessory" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.inex.ioioopenaccessory.Main" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <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" /> </activity> <uses-library android:name="com.android.future.usb.accessory" android:required="false" /> </application> </manifest>


        เรียบร้อยแล้วกับส่วนของการขอใช้งาน Open Accessory ต่อไปก็เป็นแค่โค๊ดสำหรับทดสอบการทำงานของบอร์ดก็จะเป็นปุ่มกดแล้วให้ไฟ LED บนบอร์ดติดดับนั่นแหละ ให้เปิดไฟล์ main.xml แล้ววาง Toggle Button ลงไป ตั้งชื่อว่า tb


main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Main" > <ToggleButton android:id="@+id/tb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="ToggleButton" /> </RelativeLayout>


        ทีนี้ก็เปิดไฟล์ Main.java ขึ้นมา




        ให้แก้ไขคำสั่งให้เป็นตามนี้


Main.java
package com.inex.ioioopenaccessory; import ioio.lib.api.DigitalOutput; import ioio.lib.api.exception.ConnectionLostException; import ioio.lib.util.BaseIOIOLooper; import ioio.lib.util.IOIOLooper; import ioio.lib.util.android.IOIOActivity; import android.os.Bundle; import android.widget.Toast; import android.widget.ToggleButton; public class Main extends IOIOActivity { ToggleButton tb; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tb = (ToggleButton)findViewById(R.id.tb); } class Looper extends BaseIOIOLooper { DigitalOutput dio; protected void setup() throws ConnectionLostException { dio = ioio_.openDigitalOutput(0); runOnUiThread(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), "Connected!", Toast.LENGTH_SHORT).show(); } }); } public void loop() throws ConnectionLostException { dio.write(!tb.isChecked()); } } protected IOIOLooper createIOIOLooper() { return new Looper(); } }


        เสร็จเรียบร้อยแล้ว ติดตั้งลงบนอุปกรณ์แอนดรอยด์ได้เลย ตอนที่ทำการ Run ครั้งแรกจะมีหน้าต่าง Run As ขึ้นมา ให้เลือก Android Application แล้วกดปุ่ม OK ได้เลย



        เมื่อแอปพลิเคชันเปิดขึ้นมาแล้วอย่าพึงรีบต่อกับบอร์ด IOIO ให้ไปที่ Settings เพื่อติ๊กช่อง USB debugging ออกก่อน เพราะถ้าเปิดอยู่ เวลาเชื่อมต่อกับบอร์ด IOIO ก็จะมองเป็น ADB ถ้าจะใช้งาน Open Accessory ก็ต้องปิด USB debugging ทุกครั้ง (เวลาต่อกับคอมเพื่อเขียนแอปฯต่อ ก็ต้องเปิด USB debugging ด้วย) สรุปสั้นๆคือต่อกับบอร์ด IOIO ให้ปิด ต่อกับคอมเพื่อเขียนแอปพลิเคชันให้เปิด


        ทีนี้ก็ต่ออุปกรณ์แอนดรอยด์กับบอร์ด IOIO ได้เลย จะสังเกตเห็นว่าไฟ LED ไม่ค้างแล้ว กระพริบครั้งหนึ่ง แล้วบนอุปกรณ์แอนดรอยด์จะมีหน้าต่างแจ้งขึ้นมาว่าสาย USB ได้เชื่อมต่อแล้วจะให้เปิดแอปฯที่รองรับหรือไม่ ในกรณีที่มีหลายแอปพลิเคชันก็จะขึ้นรายชื่อให้เลือก



        เมื่อกด OK แอปฯนั้นๆก็จะถูกเปิดขึ้นมาและเชื่อมต่อทันที ซึ่งต่างจากแบบ ADB ที่ต้องเปิดแอปพลิเคชันขึ้นมาเอง ไม่เหมือน Open Accessory ที่จะขึ้นหน้าต่างให้เลือกเลย



        คำเตือน - ถ้าเปิดแอปพลิเคชันอยู่แล้ว ถ้าเชื่อมต่อกับบอร์ด แล้วเปิดแอปพลิเคชันในขณะที่ยังเปิดอยู่แล้ว จะเชื่อมต่อไม่ได้ ให้ทำการปิดหรือย่อแอปพลิเคชันก่อน แล้วเปิดขึ้นมาใหม่


        เรียบร้อยแล้ว ทีนี้ก็หมดปัญหากับ Secure USB Debugging แล้วล่ะ ถึงแม้ว่าอาจจะดูยุ่งยากที่ต้องมานั่งเปิดปิด USB Debugging แต่การใช้ Open Accessory ก็มีข้อดีกว่า ADB อยู่บ้าง สำหรับผู้ที่หลงเข้ามาอ่านคนใดต้องการไฟล์ตัวอย่างสามารถดาวน์โหลดได้จาก IOIO - Open Accessory [Google Drive]



เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium