অ্যান্ড্রয়েড ওপেন অ্যাকসেসরি 2.0

এই নথিটি প্রাথমিক প্রকাশের পর থেকে অ্যান্ড্রয়েড ওপেন অ্যাকসেসরি (AOA) প্রোটোকলের পরিবর্তনগুলি বর্ণনা করে এবং AOA 1.0 ডকুমেন্টেশনের পরিপূরক। AOAv2 নিম্নলিখিত বৈশিষ্ট্য যোগ করে:

  • অডিও আউটপুট (অ্যান্ড্রয়েড 8.0-এ অপ্রচলিত)।
  • অ্যানড্রয়েড ডিভাইসে এক বা একাধিক হিউম্যান ইন্টারফেস ডিভাইস (HIDs) হিসাবে কাজ করা আনুষঙ্গিক জন্য সমর্থন।

Android অ্যাপ্লিকেশন বিকাশকারীদের জন্য উপলব্ধ Android SDK APIগুলি অপরিবর্তিত।

AOAv2 সমর্থন সনাক্ত করা হচ্ছে

একটি সংযুক্ত Android ডিভাইস আনুষাঙ্গিক এবং সমর্থিত প্রোটোকল সংস্করণ সমর্থন করে কিনা তা নির্ধারণ করতে, একটি আনুষঙ্গিক একটি getProtocol() কমান্ড পাঠাতে হবে এবং ফলাফল পরীক্ষা করতে হবে। যে অ্যান্ড্রয়েড ডিভাইসগুলি শুধুমাত্র AOAv1-এর বৈশিষ্ট্যগুলিকে সমর্থন করে তাদের অবশ্যই 1 প্রটোকল সংস্করণ হিসাবে ফেরত দিতে হবে; যে ডিভাইসগুলি AOAv2-এ অতিরিক্ত ফিউটার সমর্থন করে তাদের অবশ্যই 2 প্রোটোকল সংস্করণ হিসাবে ফেরত দিতে হবে। AOAv2 AOAv1 এর সাথে পিছিয়ে-সামঞ্জস্যপূর্ণ, তাই আসল আনুষঙ্গিক প্রোটোকলের জন্য ডিজাইন করা আনুষাঙ্গিকগুলি নতুন Android ডিভাইসগুলির সাথে কাজ করা চালিয়ে যায়৷

অ্যাকসেসরি ডেভেলপমেন্ট কিট 2011 সোর্স কোড ( <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;
}

AOAv2 আনুষঙ্গিক মোডে উপলব্ধ USB ইন্টারফেসের প্রতিটি সংমিশ্রণের জন্য নতুন USB পণ্য আইডি অন্তর্ভুক্ত করে:

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

AOAv1 ( 0x2D00 এবং 0x2D01 ) এ ব্যবহৃত পণ্য আইডিগুলি AOAv2 তে সমর্থিত হতে থাকে।

অডিও সমর্থন

AOAv2 2 চ্যানেলে সক্ষম একটি স্ট্যান্ডার্ড USB অডিও ক্লাস ইন্টারফেসের মাধ্যমে একটি অ্যান্ড্রয়েড ডিভাইস থেকে আনুষঙ্গিক পর্যন্ত অডিও আউটপুট সমর্থন করে, 44100 Khz এর বিট রেট সহ 16-বিট PCM অডিও (অতিরিক্ত অডিও মোড ভবিষ্যতে যোগ করা হতে পারে)।

অডিও সমর্থন সক্ষম করতে, আনুষঙ্গিক একটি নতুন 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 আনুষাঙ্গিকগুলিকে একটি অ্যান্ড্রয়েড ডিভাইসের সাথে এক বা একাধিক USB হিউম্যান ইন্টারফেস ডিভাইস (HID) নিবন্ধনের অনুমতি দেয়। এই পদ্ধতিটি সাধারণ ইউএসবি এইচআইডি ডিভাইস যেমন ইউএসবি মাউস এবং কীবোর্ডগুলির জন্য যোগাযোগের দিকটিকে বিপরীত করে। সাধারণত, HID ডিভাইস হল একটি পেরিফেরাল যা একটি USB হোস্টের সাথে সংযুক্ত থাকে (যেমন একটি ব্যক্তিগত কম্পিউটার), কিন্তু AOA তে USB হোস্ট একটি USB পেরিফেরালের এক বা একাধিক ইনপুট ডিভাইস হিসাবে কাজ করতে পারে।

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

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

  • ACCESSORY_REGISTER_HID Android ডিভাইসের সাথে একটি নতুন HID ডিভাইস নিবন্ধন করে৷ আনুষঙ্গিক একটি আইডি প্রদান করে যা অন্য তিনটি কলের জন্য HID ডিভাইস সনাক্ত করতে ব্যবহৃত হয়। USB সংযোগ বিচ্ছিন্ন না হওয়া পর্যন্ত বা HID ডিভাইসটি নিবন্ধনমুক্ত করার জন্য আনুষঙ্গিক ACCESSORY_UNREGISTER_HID না পাঠানো পর্যন্ত এই ID বৈধ।
  • ACCESSORY_UNREGISTER_HID পূর্বে ACCESSORY_REGISTER_HID এর সাথে নিবন্ধিত একটি HID ডিভাইসের নিবন্ধনমুক্ত করে।
  • ACCESSORY_SET_HID_REPORT_DESC একটি HID ডিভাইসের জন্য একটি প্রতিবেদন বর্ণনাকারী Android ডিভাইসে পাঠায়। এই অনুরোধটি 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 ) একটি Android অ্যাপ্লিকেশনকে USB-এর মাধ্যমে একটি USB হোস্টের (আনুষঙ্গিক) সাথে সরাসরি যোগাযোগ করার জন্য সমর্থন প্রদান করে৷ AOAv2 এই সমর্থনটি অব্যাহত রাখে এবং আনুষঙ্গিককে Android অপারেটিং সিস্টেমের সাথে (বিশেষ করে অডিও এবং ইনপুট সিস্টেম) যোগাযোগ করার অনুমতি দেওয়ার জন্য নতুন বৈশিষ্ট্য যোগ করে। AOAv2 এর ডিজাইন একটি আনুষঙ্গিক তৈরি করা সম্ভব করে যা মূল বৈশিষ্ট্য সেট ছাড়াও নতুন অডিও এবং HID সমর্থন ব্যবহার করে। আসল বৈশিষ্ট্যগুলির সাথে কেবল নতুন বৈশিষ্ট্যগুলি ব্যবহার করুন৷

একটি অ্যান্ড্রয়েড অ্যাপ ছাড়া AOAv2 সংযোগ করা হচ্ছে

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

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

  • সিস্টেম আনুষঙ্গিক সাথে যোগাযোগ করার জন্য একটি অ্যাপ্লিকেশন খুঁজে বের করার চেষ্টা করে না।
  • ডিভাইসটি আনুষঙ্গিক মোডে প্রবেশ করার পরে আনুষঙ্গিক USB ইন্টারফেসটি Android ডিভাইসের USB কনফিগারেশনে উপস্থিত থাকে না।