دستگاه‌های چندبخشی در Android

<0

برخی‌از دستگاه‌های Matter از چندین نقطه پایانی با نوع دستگاه یکسان تشکیل شده‌اند. سایر دستگاه‌های Matter سلسله‌مراتبی هستند و نقاط پایانی در نقاط پایانی دیگر تودرتو هستند. در «میاناهای برنامه‌سازی کاربردی Home»، به هر دو نوع دستگاه دستگاه‌های چندبخشی گفته می‌شود.

نمایش تخت

قبل‌از انتشار نسخه ۱.۸ «میاناهای برنامه کاربردی خانه»، دستگاه‌های چندبخشی توسط «میاناهای برنامه کاربردی خانه» به‌عنوان مجموعه‌ای از دستگاه‌های جداگانه و غیرمرتبط نشان داده می‌شوند. این به نمایش مسطح اشاره دارد.

برای مثال، دستگاه پانل دیواری تکی با چهار کلید در Home APIs به‌عنوان چهار دستگاه متمایز و غیرمرتبط ظاهر می‌شود. و دستگاه سلسله‌مراتبی Matter مانند یخچال ممکن است در «میاناهای برنامه‌سازی کاربردی خانه» به‌صورت مجموعه‌ای از دستگاه‌ها نشان داده شود که هریک با یکی از نقاط پایانی مطابقت دارد.

  • نمونه پانل دیواری با چند کلید که نمایش بومی Matter
          و پردازش تخت «میانای برنامه‌سازی کاربردی خانه» را نشان می‌دهد

    نمایش تخت از پانل دیواری ۴ کلیدی.

  • نمونه یخچال که نمایش بومی Matter و
          پردازش تخت Home API را نشان می‌دهد

    نمایش دوبعدی یخچال

شکل ۱: نمونه‌های پردازش تخت

نمایش چندبخشی

از نسخه ۱.۸ «میاناهای برنامه‌سازی کاربردی Home» به بعد، دستگاه چندبخشی می‌تواند در API به‌عنوان یک دستگاه واحد نشان داده شود. برای فعال کردن این رفتار، devices() متد را در Structure، Room، یا HomeManager فراخوانی کنید و پارامتر enableMultipartDevices را روی true تنظیم کنید:

var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled)
var multipartDevice = multipartDevices.list().filter{ device ->  device.has(PowerStrip)}

نمودارهای زیر نشان می‌دهند که گزینه enableMultipartDevices چگونه بر نمایش دستگاه چندبخشی در «میاناهای برنامه کاربردی خانه» تأثیر می‌گذارد:

  • نمونه پانل دیواری با چند کلید که نمایش بومی Matter
    و پردازش چندبخشی «میانای برنامه‌سازی کاربردی خانه» را نشان می‌دهد

    نمایش چندبخشی از پانل دیوار.

  • نمونه یخچال که نمایش بومی Matter و
    پردازش چندبخشی «میانای برنامه‌سازی کاربردی خانه» را نشان می‌دهد

    نمایش چندبخشی یخچال.

شکل ۲: نمونه‌های پرداز چندبخشی

همیشه این گزینه را دارید که با حذف پارامتر enableMultipartDevices یا تنظیم آن روی false، نمایش تخت را دریافت کنید.

در دستگاه چندبخشی، هر نمونه مؤلفه از نوع دستگاه بخش نامیده می‌شود.

می‌توان مستقیماً در دستگاه مادر یا به‌صورت سلسله‌مراتبی بااستفاده از انواع دستگاه یا برچسب‌های معنایی Matter به قطعات دسترسی داشت. برچسب‌های معنایی در «میاناهای برنامه‌سازی کاربردی خانه» با DescriptorTrait.SemanticTagStruct پیاده‌سازی می‌شوند.

کلاس انتزاعی DeviceType واسط HasParts را پیاده‌سازی می‌کند و به توسعه‌دهندگان اجازه می‌دهد ازطریق ویژگی parts و روش part() درخت دستگاه را پیمایش کنند. هر نمونه قطعه نیز رابط HasParts را پیاده‌سازی می‌کند، بنابراین فراخوانی parts() در یک قطعه فهرستی از صفر یا چند زیرقطعه تولید می‌کند.

مثال زیر نحوه دسترسی به بخش‌های دستگاه چندکلیدی را نشان می‌دهد:

val device =
      homeManager
        .devices(enableMultipartDevices = true)
        .itemFlow(Id(MULTI_SWITCH_DEVICE))
        .first()

// Here at top-level, we are using the homeDevice.parts() API to access flow of
// all the switches. Then we get the part ids.
val partIds =
      device
        .parts()
        .map { parts ->
          parts.filter { it.has(Switch) }.mapNotNull { it.metadata.partId }
        }
        .first()
        .toSet()

مثال بعدی نحوه دسترسی به قطعات دستگاه یخچال را نشان می‌دهد:

val rootDevice = homeManager.devices(true).itemFlow(Id("device@uuid1"))

// On the top level, HomeDevice provides both plural (parts)
// and singular (part) APIs.
// The parts() API returns all the parts accessible from the top level,
// including Endpoint 0 and its children.
val childParts = rootDevice.parts().first()
// childParts contain (EP0 as RootNode, EP1 as Refrigerator)

// The singular part() API accepts DeviceType and tags (optional).
val refrigerator = rootDevice.part(Refrigerator).first()

// Get the refrigerator device which in this case is just device@uuid1
val refrigeratorDevice = homeManager.devices(false).itemFlow(refrigerator.metadata.partId.deviceId)

// DeviceType uses a synchronous API for providing access to parts
val cabinets = refrigerator.parts  // [EP2, EP3]

// Get the HomeDevice for these cabinets (device@uuid2 and device@uuid3)
val cabinetDeviceIds = cabinets.map { it.metadata.partId }

// Now use the devices API with enableMultipartDevices = false.
val cabinetDevices = homeManager.devices(false)
    .map { devices ->
devices.filter { it.id in cabinetDeviceIds }
}.first()