لوازم جانبی USB در Android باید از پروتکل «لوازم جانبی باز Android» (AOA) پیروی کنند. این پروتکل نحوه تشخیص و راهاندازی ارتباط لوازم جانبی با دستگاه مجهز به Android را تعریف میکند. لوازم جانبی باید مراحل زیر را انجام دهند:
- منتظر دستگاه متصلشده بمانید و آن را شناسایی کنید.
- پشتیبانی حالت لوازم جانبی دستگاه را تعیین کنید.
- تلاش کنید دستگاه را در حالت لوازم جانبی راهاندازی کنید (درصورت نیاز).
- اگر دستگاه از AOA پشتیبانی میکند، با دستگاه ارتباط برقرار کنید.
بخشهای زیر نحوه پیادهسازی این مراحل را توضیح میدهد.
منتظر ماندن برای دستگاههای متصل و شناسایی آنها
لوازم جانبی باید بهطور مداوم دستگاههای دارای Android متصل را بررسی کنند. وقتی دستگاهی متصل میشود، لوازم جانبی باید تشخیص دهد که آیا دستگاه از حالت لوازم جانبی پشتیبانی میکند یا نه.
تعیین پشتیبانی از حالت لوازم جانبی
توجه: اشکالزدایی USB برای اتصال لوازم جانبی لازم نیست اما ممکن است ADB درطول توسعه لازم باشد. برای جزئیات، ملاحظات اشکالزدایی را ببینید.
وقتی دستگاهی با سیستمعامل Android متصل میشود، میتواند در یکی از سه حالت زیر باشد:
- از حالت لوازم جانبی Android پشتیبانی میکند و درحالحاضر در حالت لوازم جانبی است.
- از حالت لوازم جانبی Android پشتیبانی میکند اما در حالت لوازم جانبی نیست.
- از حالت لوازم جانبی Android پشتیبانی نمیکند.
درطول اتصال اولیه، لوازم جانبی باید نسخه، شناسه فروشنده،
و شناسه محصول توصیفگر دستگاه USB دستگاه متصل را بررسی کند. شناسه فروشنده
باید با شناسه Google (0x18D1) مطابقت داشته باشد. اگر دستگاه ازقبل در
حالت لوازم جانبی باشد، شناسه محصول باید 0x2D00 یا
0x2D01 باشد و لوازم جانبی میتواند
بااستفاده از پروتکل ارتباطی خود ازطریق نقاط پایانی انتقال انبوه،
با دستگاه ارتباط برقرار کند (نیازی نیست دستگاه در حالت لوازم جانبی راهاندازی شود).
توجه: 0x2D00 برای دستگاههای مجهز به Android که از حالت لوازم جانبی پشتیبانی میکنند رزرو شده است. 0x2D01 برای دستگاههایی رزرو شده است که از حالت لوازم جانبی و همچنین پروتکل «پل اشکالزدایی Android» (ADB) پشتیبانی میکنند. این پروتکل میانای دومی را با دو نقطه پایانی انبوه برای ADB نشان میدهد. اگر لوازم جانبی را در رایانه شبیهسازی میکنید، میتوانید از این نقاط پایانی برای اشکالزدایی برنامه لوازم جانبی استفاده کنید. بهطورکلی، از این
میانای کاربری استفاده نکنید، مگر اینکه لوازم جانبی گذرگاه را در دستگاه به ADB پیادهسازی کند.
اگر نسخه، شناسه فروشنده، یا شناسه محصول در توصیفگر دستگاه USB با مقادیر موردانتظار مطابقت نداشته باشد، لوازم جانبی نمیتواند تشخیص دهد که دستگاه از حالت لوازم جانبی Android پشتیبانی میکند یا نه. لوازم جانبی باید تلاش کند دستگاه را در حالت لوازم جانبی (جزئیات در زیر) روشن کند تا پشتیبانی دستگاه را تعیین کند.
نکته کلیدی: لوازم جانبی USB باید دردستدهی اولیه سرصفحه ارسال کند. سرصفحه حاوی سازنده، مدل، و نسخه است. اگرچه نسخه فیلدی اختیاری است، اگر برنامه Android نصبشدهای فقط با نسخه مطابقت داشته باشد اما لوازم جانبی نسخهای ارسال نکند، دستگاههای Android دارای Android 10 و نسخههای پایینتر بهدلیل استثنایی که در فرایند سیستم ایجاد میشود بازراهاندازی خواهند شد.
تلاش برای شروع در حالت لوازم جانبی
اگر نسخه، فروشنده، و شناسههای محصول با دستگاه Android در حالت لوازم جانبی مطابقت نداشته باشد، لوازم جانبی نمیتواند تشخیص دهد که آیا دستگاه از حالت لوازم جانبی پشتیبانی میکند (اما در حالت لوازم جانبی نیست) یا اینکه دستگاه از حالت لوازم جانبی پشتیبانی نمیکند. این میتواند به این دلیل رخ دهد که دستگاههایی که از حالت لوازم جانبی پشتیبانی میکنند (اما در حالت لوازم جانبی نیستند) در ابتدا شناسه محصول و فروشنده سازنده دستگاه را بهجای شناسه محصول و فروشنده AOA گزارش میکنند.
وسیله جانبی باید سعی کند دستگاه را در حالت وسیله جانبی راهاندازی کند تا مشخص شود آیا دستگاه از این حالت پشتیبانی میکند یا نه:
- درخواست کنترل ۵۱ («دریافت پروتکل») را ارسال کنید تا مشخص شود دستگاه از پروتکل لوازم جانبی Android پشتیبانی میکند یا نه. اگر دستگاه از این پروتکل پشتیبانی کند،
عدد غیرصفری برمیگرداند که نشاندهنده نسخه پروتکل پشتیبانیشده است.
درخواست کنترل در نقطه پایانی ۰ با مشخصات زیر است:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from the device to the accessory) - اگر دستگاه نسخه پروتکل پشتیبانیشدهای را برگرداند، درخواست کنترلی با اطلاعات رشته شناسایی به دستگاه ارسال کنید. این اطلاعات به دستگاه امکان میدهد برنامه مناسبی را برای لوازم جانبی تعیین کند (یا اگر برنامه مناسبی وجود نداشته باشد، نشانی وب را به کاربر ارائه دهد). درخواست کنترل در نقطه پایانی ۰ (برای هر شناسه رشته) با ویژگیهای زیر است:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
شناسههای رشته زیر پشتیبانی میشوند و حداکثر اندازه هر رشته ۲۵۶ بایت است (باید با
\0صفر پایان یابد).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- درخواست کنترلی ارسال کنید تا از دستگاه بخواهید در حالت لوازم جانبی شروع شود. درخواست کنترل در نقطه پایانی ۰ با مشخصات زیر است:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
پساز تکمیل این مراحل، لوازم جانبی باید منتظر بماند تا دستگاه USB متصل خود را در گذرگاه در حالت لوازم جانبی دوباره معرفی کند، سپس دستگاههای متصل را دوباره شمارش کند. الگوریتم با بررسی شناسههای فروشنده و محصول، که درصورت تعویض موفقیتآمیز دستگاه به حالت لوازم جانبی باید صحیح باشند (برای مثال، با شناسههای فروشنده و محصول Google مطابقت داشته باشند نه با شناسههای سازنده دستگاه)، پشتیبانی از حالت لوازم جانبی را تعیین میکند. اگر شناسهها و نسخه درست باشند، لوازم جانبی برای برقراری ارتباط با دستگاه اقدام میکند.
توجه: درحالحاضر AOA از اتصال همزمان AOA و MTP پشتیبانی نمیکند. برای تغییر از AOA به MTP، لوازم جانبی باید ابتدا اتصال دستگاه USB را قطع کند (چه بهصورت فیزیکی و چه به روشی معادل الکتریکی) و سپس بااستفاده از MTP دوباره متصل شود.
اگر هریک از مراحل ناموفق باشد، لوازم جانبی تشخیص میدهد که دستگاه از حالت لوازم جانبی Android پشتیبانی نمیکند و منتظر میماند تا دستگاه بعدی متصل شود.
برقراری ارتباط با دستگاه
اگر لوازم جانبی دستگاهی با سیستمعامل Android را در حالت لوازم جانبی تشخیص دهد، لوازم جانبی میتواند رابط دستگاه و توصیفگرهای نقطه پایانی را پُرسمان کند تا نقاط پایانی انبوه را برای ارتباط با دستگاه بهدست آورد.
تعداد میانها و نقطههای پایانی انبوه به شناسه محصول بستگی دارد. دستگاه Android با شناسه محصول:
-
0x2D00یک میانای دارای دو نقطه پایانی انبوه برای ارتباط ورودی و خروجی دارد. -
0x2D01دو میان با دو نقطه پایانی انبوه برای ارتباط ورودی و خروجی دارد. میانای اول ارتباط استاندارد و میانای دوم ارتباط ADB را مدیریت میکند. برای استفاده از میانای دستگاه، اولین نقطههای پایانی ورودی و خروجی انبوه را پیدا کنید، پیکربندی دستگاه را با درخواست دستگاهSET_CONFIGURATION(0x09) روی مقدار ۱ تنظیم کنید، سپس بااستفاده از نقطههای پایانی ارتباط برقرار کنید.