Android Open Accessory 2.0

এই ডকুমেন্ট Android Open Accessory (AOA) প্রোটোকলের প্রাথমিক রিলিজের পর থেকে হওয়া পরিবর্তন এবং AOA 1.0 ডকুমেন্টেশন-এর সাপ্লিমেন্ট বর্ণনা করে। AOAv2 নিম্নলিখিত ফিচার যোগ করে:

  • অডিও আউটপুট (Android 8.0-এ বাতিল করা হয়েছে)।
  • Android ডিভাইসে এক বা একাধিক হিউম্যান ইন্টারফেস ডিভাইস (HID) হিসেবে কাজ করা অ্যাক্সেসরির জন্য সহায়তা।

Android অ্যাপ ডেভেলপারদের জন্য উপলভ্য Android SDK API অপরিবর্তিত রয়েছে।

AOAv2 কাজ করে কিনা তা শনাক্ত করা

কানেক্ট করা Android ডিভাইস অ্যাক্সেসরি ও সাপোর্ট করে এমন প্রোটোকল ভার্সন সাপোর্ট করে কিনা তা নির্ধারণ করতে, অ্যাক্সেসরিকে অবশ্যই একটি getProtocol() কমান্ড পাঠাতে হবে এবং ফলাফল চেক করতে হবে। AOAv1-এ শুধু ফিচার কাজ করে এমন Android ডিভাইসকে প্রোটোকল ভার্সন হিসেবে 1 রিটার্ন করতে হবে; AOAv2-এ অতিরিক্ত ফিচার কাজ করে এমন ডিভাইসকে প্রোটোকল ভার্সন হিসেবে 2 রিটার্ন করতে হবে। AOAv2 হল AOAv1-এর ব্যাকওয়ার্ড কম্প্যাটিবল, তাই আসল অ্যাক্সেসরি প্রোটোকলের জন্য ডিজাইন করা অ্যাক্সেসরি নতুন Android ডিভাইসের সাথে কাজ করা চালিয়ে যায়।

অ্যাক্সেসরি ডেভেলপমেন্ট কিট ২০১১ থেকে নেওয়া নিম্নলিখিত উদাহরণ সোর্স কোড (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) লাইব্রেরি এই প্রোটোকল চেক করে দেখায়:

bool AndroidAccessory::switchDevice(byte addr)
{
    int protocol = getProtocol(addr);
    if (protocol >= 1) {
        Serial.print("device supports protocol 1 or higher\n");
    } else {
        Serial.print("could not read device protocol version\n");
        return false;
    }

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL);
    return true;
}

অ্যাক্সেসরি মোডে উপলভ্য USB ইন্টারফেসের প্রতিটি কম্বিনেশনের জন্য AOAv2-তে নতুন USB প্রোডাক্ট আইডি অন্তর্ভুক্ত থাকে:

ভার্সন প্রোডাক্ট আইডি যোগাযোগ বর্ণনা
AOAv1 0x2D00 অ্যাক্সেসরি Android অ্যাপের সাথে যোগাযোগ করার জন্য দুটি বাল্ক এন্ডপয়েন্ট প্রদান করে।
0x2D01 অ্যাক্সেসরি + adb অ্যাক্সেসরি ডেভেলপমেন্টের সময় ডিবাগিংয়ের উদ্দেশ্যে। ব্যবহারকারী Android ডিভাইস সেটিংসে USB ডিবাগিং চালু করলে তবেই উপলভ্য।
AOAv2 0x2D02 অডিও অ্যাক্সেসরিতে Android ডিভাইস থেকে অডিও স্ট্রিম করার জন্য।
0x2D03 অডিও + adb
0x2D04 অ্যাক্সেসরি + অডিও
0x2D05 অ্যাক্সেসরি + অডিও + adb

AOAv1-এ (0x2D00 ও 0x2D01) ব্যবহৃত প্রোডাক্ট আইডি AOAv2-এও কাজ করবে।

অডিও সহায়তা

AOAv2-তে Android ডিভাইস থেকে অ্যাক্সেসরিতে অডিও আউটপুটের জন্য সহায়তা অন্তর্ভুক্ত রয়েছে। এটি স্ট্যান্ডার্ড USB অডিও ক্লাস ইন্টারফেসের মাধ্যমে করা হয়, যা ২ চ্যানেল, ১৬-বিট PCM অডিও এবং ৪৪১০০ Khz বিট রেট সহ কাজ করে (ভবিষ্যতে অতিরিক্ত অডিও মোড যোগ করা হতে পারে)।

অডিও সহায়তা চালু করতে, অ্যাক্সেসরিকে অবশ্যই একটি নতুন USB কন্ট্রোল অনুরোধ পাঠাতে হবে:

**SET_AUDIO_MODE**
requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        58
value:          0 for no audio (default),
                1 for 2 channel, 16-bit PCM at 44100 KHz
index:          0
data            none

অ্যাক্সেসরি মোডে প্রবেশ করার জন্য ACCESSORY_START কমান্ড পাঠানোর আগে এই কমান্ডটি অবশ্যই পাঠাতে হবে।

HID সহায়তা

AOAv2-এর মাধ্যমে অ্যাক্সেসরিগুলি Android ডিভাইসের সাথে এক বা একাধিক USB হিউম্যান ইন্টারফেস ডিভাইস (HID) রেজিস্টার করতে পারে। এই পদ্ধতিটি USB মাউস এবং কীবোর্ডের মতো সাধারণ USB HID ডিভাইসের জন্য যোগাযোগের দিকটি উল্টে দেয়। সাধারণত, HID ডিভাইস হল USB হোস্টের সাথে কানেক্ট করা একটি পেরিফেরাল (যেমন, একটি পার্সোনাল কম্পিউটার), কিন্তু AOA-তে USB হোস্ট, USB পেরিফেরালের জন্য এক বা একাধিক ইনপুট ডিভাইস হিসেবে কাজ করতে পারে।

HID সাপোর্ট হল স্ট্যান্ডার্ড HID ইভেন্টের একটি প্রক্সি; ইমপ্লিমেন্টেশন ইভেন্টের কন্টেন্ট বা ধরন সম্পর্কে কোনও অনুমান করে না এবং ইনপুট সিস্টেমে তা পাস করে দেয়, এর ফলে AOAv2 অ্যাক্সেসরি যেকোনও HID ডিভাইস (মাউস, কীবোর্ড, গেম কন্ট্রোলার ইত্যাদি) হিসেবে কাজ করতে পারে। আপনি HID সহায়তা ব্যবহার করে প্রাথমিক কার্যকারিতা প্রদান করতে পারেন, যেমন মিডিয়া ডকে প্লে/পজ বোতাম, অথবা উন্নত কার্যকারিতার জন্য যেমন মাউস ও সম্পূর্ণ QWERTY কীবোর্ড সহ ডকিং স্টেশন।

AOAv2 নতুন USB কন্ট্রোল রিকোয়েস্ট যোগ করে যা অ্যাক্সেসরিকে Android ডিভাইসের জন্য এক বা একাধিক HID ইনপুট ডিভাইস হিসেবে কাজ করতে দেয়। HID সাপোর্ট সম্পূর্ণভাবে এন্ডপয়েন্ট জিরোতে কন্ট্রোল রিকোয়েস্টের মাধ্যমে ম্যানেজ করা হয়, তাই নতুন কোনও USB ইন্টারফেসের প্রয়োজন হয় না। চারটি নতুন কন্ট্রোল সংক্রান্ত অনুরোধ হল:

  • ACCESSORY_REGISTER_HID Android ডিভাইসের সাথে নতুন HID ডিভাইস রেজিস্টার করে। অ্যাক্সেসরি একটি আইডি প্রদান করে যা অন্য তিনটি কলের জন্য HID ডিভাইস শনাক্ত করতে ব্যবহৃত হয়। USB ডিসকানেক্ট না হওয়া পর্যন্ত অথবা অ্যাক্সেসরি HID ডিভাইস আনরেজিস্টার করার জন্য ACCESSORY_UNREGISTER_HID না পাঠানো পর্যন্ত এই আইডি বৈধ থাকে।
  • ACCESSORY_UNREGISTER_HID, ACCESSORY_REGISTER_HID-এর সাথে আগে রেজিস্টার করা HID ডিভাইস আনরেজিস্টার করে।
  • ACCESSORY_SET_HID_REPORT_DESC Android ডিভাইসে HID ডিভাইসের জন্য একটি রিপোর্ট ডেসক্রিপ্টর পাঠায়। এই অনুরোধ HID ডিভাইসের ক্ষমতা বর্ণনা করতে ব্যবহার করা হয় এবং Android ডিভাইসে কোনও HID ইভেন্ট রিপোর্ট করার আগে অবশ্যই পাঠাতে হবে। রিপোর্ট ডেসক্রিপ্টর যদি এন্ডপয়েন্ট জিরোর জন্য সর্বাধিক প্যাকেট সাইজের চেয়ে বড় হয়, তাহলে সম্পূর্ণ ডেসক্রিপ্টর ট্রান্সফার করার জন্য একাধিক ACCESSORY_SET_HID_REPORT_DESC কমান্ড পাঠানো হয়।
  • ACCESSORY_SEND_HID_EVENT অ্যাক্সেসরি থেকে Android ডিভাইসে ইনপুট ইভেন্ট পাঠায়।

নতুন কন্ট্রোল অনুরোধের জন্য কোডের সংজ্ঞা হল:

/* Control request for registering a HID device.
 * Upon registering, a unique ID is sent by the accessory in the
 * value parameter. This ID will be used for future commands for
 * the device
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID_DEVICE
 *  value:          Accessory assigned ID for the HID device
 *  index:          total length of the HID report descriptor
 *  data            none
 */
#define ACCESSORY_REGISTER_HID         54

/* Control request for unregistering a HID device.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            none
 */
#define ACCESSORY_UNREGISTER_HID         55

/* Control request for sending the HID report descriptor.
 * If the HID descriptor is longer than the endpoint zero max packet size,
 * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
 * commands. The data for the descriptor must be sent sequentially
 * if multiple packets are needed.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SET_HID_REPORT_DESC
 *  value:          Accessory assigned ID for the HID device
 *  index:          offset of data in descriptor
 *                      (needed when HID descriptor is too big for one packet)
 *  data            the HID report descriptor
 */
#define ACCESSORY_SET_HID_REPORT_DESC         56

/* Control request for sending HID events.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SEND_HID_EVENT
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            the HID report for the event
 */
#define ACCESSORY_SEND_HID_EVENT         57

AOAv1-এর সাথে ইন্টারঅপারেবিলিটি

আসল প্রোটোকল (AOAv1) USB-এর মাধ্যমে USB হোস্টের (অ্যাক্সেসরি) সাথে সরাসরি যোগাযোগ করার জন্য Android অ্যাপকে সহায়তা প্রদান করে। AOAv2 এই সহায়তা প্রদান করা চালিয়ে যায় এবং নতুন ফিচার যোগ করে অ্যাক্সেসরিকে Android অপারেটিং সিস্টেমের সাথে যোগাযোগ করতে দেয় (বিশেষত অডিও ও ইনপুট সিস্টেম)। AOAv2-এর ডিজাইন এটিকে এমন অ্যাক্সেসরি তৈরি করার উপযুক্ত করে তোলে যা অরিজিনাল ফিচার সেটের পাশাপাশি নতুন অডিও ও HID সাপোর্ট ব্যবহার করে। পুরনো ফিচারের সাথে নতুন ফিচার ব্যবহার করুন।

Android অ্যাপ ছাড়াই AOAv2 কানেক্ট করুন

আপনি এমন কোনও অ্যাক্সেসরি (যেমন, অডিও ডক) ডিজাইন করতে পারেন যা অডিও ও HID সাপোর্ট ব্যবহার করে, কিন্তু Android ডিভাইসে কোনও অ্যাপের সাথে যোগাযোগ করে না। এইসব অ্যাক্সেসরির ক্ষেত্রে, ব্যবহারকারীদের নতুন অ্যাটাচ করা অ্যাক্সেসরি খোঁজার জন্য ডায়ালগ প্রম্পট পেতে হবে না এবং সেটিকে এমন Android অ্যাপের সাথে অ্যাসোসিয়েট করতে হবে যা সেটির সাথে যোগাযোগ করতে পারে।

অ্যাক্সেসরি কানেক্ট করার পরে এই ধরনের ডায়ালগ যাতে না দেখানো হয়, তার জন্য অ্যাক্সেসরি Android ডিভাইসে প্রস্তুতকারক ও মডেলের নাম না পাঠানোর বিকল্প বেছে নিতে পারে। Android ডিভাইসে এইসব স্ট্রিং প্রদান করা না হলে:

  • অ্যাক্সেসরির সাথে যোগাযোগ করার জন্য সিস্টেম কোনও অ্যাপ খোঁজার চেষ্টা করে না।
  • ডিভাইস অ্যাক্সেসরি মোডে যাওয়ার পরে Android ডিভাইসের USB কনফিগারেশনে অ্যাক্সেসরি USB ইন্টারফেস নেই।