ম্যাটারের জন্য একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করুন

১. স্বাগতম

IoT মানগুলিকে একীভূত করার লক্ষ্যে তৈরি, ম্যাটার গুগল হোম, জিগবি, ব্লুটুথ মেশ, জেড-ওয়েভ এবং আরও অনেক কিছুর মতো বিভিন্ন ইকোসিস্টেম জুড়ে স্মার্ট হোম ডিভাইসগুলিকে সংযুক্ত করে।

মোবাইল ডিভাইসগুলি স্মার্ট হোম ডিভাইসগুলির সাথে একটি কেন্দ্রীয় মিথস্ক্রিয়া বিন্দু। আপনি যদি ম্যাটার ডিভাইসগুলিকে সমর্থন করার জন্য নিজস্ব অ্যান্ড্রয়েড অ্যাপ তৈরি করতে চান, তাহলে আমরা আপনাকে দ্রুত শুরু করতে সাহায্য করতে পারি।

গুগল হোম স্যাম্পল অ্যাপ ফর ম্যাটার (GHSA ফর ম্যাটার) হোম মোবাইল SDK API গুলি প্রদর্শন করে, যা ব্যবহারকারীদের ডিভাইসগুলি কমিশন এবং শেয়ার করার অনুমতি দেয়। আপনি ম্যাটারের মূল ধারণাগুলি আরও ভালভাবে বোঝার জন্য একটি শেখার সরঞ্জাম হিসাবে নমুনা অ্যাপটি ব্যবহার করতে পারেন, সেইসাথে ম্যাটার ডিভাইসগুলির সাথে মিথস্ক্রিয়াগুলি ডিবাগ এবং সমস্যা সমাধানের জন্য একটি সরঞ্জাম হিসাবেও ব্যবহার করতে পারেন।

তুমি কি করবে

এই কোডল্যাবে, আপনি নমুনা অ্যাপের সোর্স কোড ডাউনলোড করবেন এবং ডিভাইসগুলি কমিশন এবং শেয়ার করার জন্য হোম মোবাইল SDK ব্যবহার করতে শিখবেন। আপনি ম্যাটার রেপো ( connectedhomeip ) থেকে কমিশনিং এবং ক্লাস্টার লাইব্রেরি কীভাবে ব্যবহার করবেন তাও শিখবেন।

নমুনা অ্যাপটি ডাউনলোড করার পরে, আমরা Android Studio-তে সোর্স কোড পর্যালোচনা করব এবং নিম্নলিখিত Home Mobile SDK API গুলি বাস্তবায়ন করব:

আপনি কমিশনিং ধারণা, ম্যাটার ফ্যাব্রিক এবং ম্যাটার ডিভাইসগুলি কীভাবে নিয়ন্ত্রণ করবেন সে সম্পর্কে আরও শিখবেন।

তোমার যা লাগবে

শুরু করার আগে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করতে ভুলবেন না:

নমুনা অ্যাপের মাধ্যমে ডিভাইসগুলি চালু এবং নিয়ন্ত্রণ করার জন্য আপনার কোনও হাবের প্রয়োজন নেই, যেমন একটি Google Nest Hub (দ্বিতীয় প্রজন্ম)।

2. সেট আপ করুন

কোডল্যাব স্টার্টার অ্যাপটি codelab শাখায় অবস্থিত। কোডল্যাব সোর্স কোড দিয়ে কাজ শুরু করতে, আপনি জিপ ফাইলটি ডাউনলোড করতে পারেন।

একটি কার্যকরী নমুনা তৈরি করতে আপনি এই codelab জিপ ফাইলটি ব্যবহার করবেন।

কোডল্যাব সংস্করণ

codelab শাখাটি নমুনা অ্যাপের 2.0.0 রিলিজের সাথে ট্যাগ করা হয়েছে। প্রতিটি ধাপে কাজ করার সময় আপনার আপডেটগুলির তুলনা করতে, আপনি এই রিলিজের জন্য সম্পূর্ণ সোর্স কোডটি ডাউনলোড করতে পারেন।

আপনি যদি GitHub রিপোজিটরি ক্লোন করতে চান, তাহলে Sample অ্যাপ README- এর নির্দেশাবলী অনুসরণ করুন।

নির্ভরতা

ডিভাইসগুলি শেয়ার এবং কমিশন করার জন্য প্রয়োজনীয় সোর্স কোড সম্পর্কে আমরা আপনাকে গাইড করব, তবে শুরু করার আগে নিম্নলিখিত নির্ভরতাগুলি সম্পর্কে সচেতন থাকা সাহায্য করতে পারে। মনে রাখবেন যে এই নির্ভরতাগুলি libs.versions.toml ফাইলে ঘোষণা করা হয়েছে এবং build.gradle.kts ফাইলে তাদের ব্যবহার উল্লেখ করা হয়েছে।

সোর্স কোড

ইউজার ইন্টারফেস এবং বেশিরভাগ কার্যকারিতা ইতিমধ্যেই আপনার জন্য তৈরি করা হয়েছে।

এই কোডল্যাবের জন্য, আমরা নিম্নলিখিত ফাইলগুলিতে ম্যাটার কার্যকারিতা যুক্ত করব:

  • java/com/google/homesampleapp/commissioning/AppCommissioningService : আপনাকে ডেভেলপমেন্ট ফ্যাব্রিকে ডিভাইস কমিশন করার অনুমতি দেয়
  • java/com/google/homesampleapp/screens/home/HomeScreen এবং java/com/google/homesampleapp/screens/home/HomeViewModel.kt : হোম মোবাইল SDK কমিশনিং কার্যকারিতা অন্তর্ভুক্ত করে
  • java/com/google/homesampleapp/screens/device/DeviceScreen এবং java/com/google/homesampleapp/screens/device/DeviceViewModel : শেয়ার ডিভাইস API কল অন্তর্ভুক্ত করে

প্রতিটি ফাইলে আপনার পরিবর্তন করা কোড-ব্লকটি ব্যবহার করে মন্তব্য করা হবে, উদাহরণস্বরূপ:

// CODELAB: add commissioningFunction()

এটি আপনাকে কোডল্যাবে সংশ্লিষ্ট বিভাগটি দ্রুত সনাক্ত করতে দেয়।

৩. গুগলে কমিশন

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

ম্যাটার কমিশনিং সম্পর্কে নিম্নলিখিত ধারণাগুলি বোঝা গুরুত্বপূর্ণ:

  • কাপড়ের সাহায্যে ডিভাইসগুলি একে অপরের সাথে যোগাযোগ করতে পারে।
  • কাপড়গুলি অনন্য প্রমাণপত্রাদির একটি ভাগ করা সেট বজায় রাখে।
  • ইকোসিস্টেমগুলি বিশ্বস্ত রুট সার্টিফিকেট ইস্যু করা, ফ্যাব্রিক আইডি বরাদ্দ করা এবং অনন্য নোড আইডি বরাদ্দ করার জন্য দায়ী। একটি ইকোসিস্টেম হল একজন কমিশনারের ব্যাক-এন্ড পরিষেবা, উদাহরণস্বরূপ গুগল হোম ইকোসিস্টেমের জন্য হোম গ্রাফ।
  • ডিভাইসগুলি একাধিক ফ্যাব্রিকে (মাল্টি-অ্যাডমিন বৈশিষ্ট্য) কমিশন করা যেতে পারে।

একটি ডিভাইস চালু করার জন্য, আপনাকে CommissioningClient API ব্যবহার করতে হবে। .commissionDevice() এ কল করলে একটি IntentSender ফিরে আসে, যা Google Play পরিষেবাগুলিতে সঠিক কার্যকলাপ চালু করে:

interface CommissioningClient {
  Task<IntentSender> commissionDevice(CommissioningRequest request);
}

পরবর্তী বিভাগগুলিতে, আমরা গুগল ফ্যাব্রিকে ডিভাইসগুলি কমিশন করার জন্য প্রয়োজনীয় ন্যূনতম কোডটি নিয়ে আলোচনা করব।

ধাপ ১: অ্যাক্টিভিটি লঞ্চার

CommissioningClient থেকে IntentSender পরিচালনা করতে, আপনি একটি ActivityResultLauncher ব্যবহার করতে পারেন:

val commissioningLauncher = registerForActivityResult(
    StartIntentSenderForResult()
) { result: ActivityResult ->
    if (result.resultCode == RESULT_OK) {
        Timber.d(TAG, "Commissioning succeeded.")
    } else {
        Timber.d(TAG, "Commissioning failed. " + result.resultCode)
    }
}

ধাপ ২: কমিশনিং ফাংশন

এখানে একটি মৌলিক উদাহরণ দেওয়া হল যেখানে CommissioningClient API ব্যবহার করে Google ফ্যাব্রিকে একটি ডিভাইস কমিশন করা হয়।

  1. কমিশনিং প্রক্রিয়াটি commissionDevice() ফাংশন দিয়ে শুরু হয়। প্রথমে, একটি CommissioningRequest সংজ্ঞায়িত করা হয়। এই ডিফল্ট কনফিগারেশনের মাধ্যমে, ডিভাইসগুলি শুধুমাত্র স্থানীয় অ্যান্ড্রয়েড ফ্যাব্রিকে কমিশন করা হয়।
  2. Matter হল হোম মোবাইল SDK-এর প্রবেশ বিন্দু। পরবর্তী কলে, .getCommissioningClient this (অ্যাক্টিভিটি) দ্বারা একটি CommissioningClient পায়।
  3. .commissionDevice() CommissioningRequest গ্রহণ করে।
  4. এবং পরিশেষে, .addOnSuccessListener CommissioningResult প্রক্রিয়া করার জন্য এবং Google Play Services (GPS) কমিশন ডিভাইস অ্যাক্টিভিটি চালু করার জন্য ডাকা হয়।
private fun commissionDevice() {
    val request: CommissioningRequest = CommissioningRequest.builder().build()
    Matter.getCommissioningClient(this)
        .commissionDevice(request)
        .addOnSuccessListener { result ->
            commissioningLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
}

অন্যান্য কাপড়ের সাথে এর ডিভাইসগুলি কমিশন করার প্রক্রিয়া সহজ করার জন্য, লোকাল অ্যান্ড্রয়েড ফ্যাব্রিককে অ্যান্ড্রয়েড সেটিংসের মাধ্যমে ব্যবহার করা যেতে পারে।

এরপর, আপনি শিখবেন কিভাবে একটি ডিভাইসকে একটি ডেভেলপমেন্ট ফ্যাব্রিকে কমিশন করতে হয়।

কমিশনিং প্রক্রিয়া চলাকালীন ব্যবহারকারীর ইন্টারফেসের একটি সারসংক্ষেপের জন্য, ম্যাটার গাইডের জন্য গুগল হোম নমুনা অ্যাপটি দেখুন।

৪. একটি উন্নয়ন কাঠামোতে কমিশন

ডিভাইসগুলি একাধিক ফ্যাব্রিকে কমিশন করা যেতে পারে। বিশ্বস্ত পেয়ারিং পরিচালনা করার জন্য, ডিভাইসগুলিতে বিভিন্ন FabricInfo সদস্য সহ একটি FabricTable সংরক্ষণ করা হয়, উদাহরণস্বরূপ:

  • কাপড় শনাক্তকরণ
  • ডিভাইসে ফ্যাব্রিক দ্বারা নির্ধারিত নোড আইডি
  • বিক্রেতা আইডি
  • ফ্যাব্রিক আইডি
  • ডিভাইসের কার্যক্ষমতার প্রমাণপত্রাদি

অ্যাডমিনিস্ট্রেটিভ ডোমেন ম্যানেজার (ADM) ফ্যাব্রিক ক্রেডেনশিয়াল সংজ্ঞায়িত করে। পূর্ববর্তী পরিস্থিতিতে, Google Play Services হল একটি ইকোসিস্টেম যা একটি বিশ্বস্ত রুট সার্টিফিকেট অথরিটি (CA) হিসেবে কাজ করে। যখন আপনি স্থানীয় অ্যান্ড্রয়েড ফ্যাব্রিকে ডিভাইস কমিশন করেন, তখন প্রতিটি ডিভাইসে একই ফ্যাব্রিক ক্রেডেনশিয়াল এবং একই CA সেট থাকে।

কাস্টম কমিশনিং পরিষেবা

লোকাল অ্যান্ড্রয়েড ফ্যাব্রিকে কমিশন করার জন্য, আমরা CommissioningClient API-তে CommissioningRequest তৈরি করতে ডিফল্ট প্যারামিটার ব্যবহার করেছি:

val request: CommissioningRequest = CommissioningRequest.builder().build()

আপনি যদি আপনার অ্যাপ থেকে নতুন ডিভাইস নিয়ন্ত্রণ এবং পরিচালনা করতে চান, তাহলে আপনাকে একটি স্থানীয় ডেভেলপমেন্ট ফ্যাব্রিক তৈরি করতে হবে এবং ডিভাইসগুলি কমিশন করার জন্য অপারেশনাল শংসাপত্রগুলি পেতে হবে। এই পরিস্থিতিতে, আপনার অ্যাপটি একটি অনন্য, স্বাধীন ইকোসিস্টেমে পরিণত হয় যা ডিভাইসগুলিকে উপযুক্ত নোড শংসাপত্রগুলি বরাদ্দ করে।

আপনি হোম মোবাইল SDK-কে জানাতে পারেন যে আপনি আপনার নিজস্ব ফ্যাব্রিকে ডিভাইসগুলি কমিশন করতে চান, CommissioningRequest- এ একটি কাস্টম পরিষেবা প্রদান করে:

class CommissioningRequest {
  static CommissioningRequest.Builder builder();

  class Builder {
    Builder setCommissioningService(@Nullable ComponentName commissioningService);

    CommissioningRequest build();
  }
}

পরবর্তী ধাপে, আমরা একটি কাস্টম পরিষেবা ব্যবহার করার জন্য commissionDevice() ফাংশনটি পরিবর্তন করব। আমরা Home ফ্র্যাগমেন্টে একটি Activity Launcherও যোগ করব এবং API প্রবাহ পরিচালনা করতে LiveData অবজেক্ট ব্যবহার করব।

ধাপ ১: একটি জিপিএস অ্যাক্টিভিটি লঞ্চার তৈরি করুন

প্রথমে, CommissioningClient API থেকে IntentSender পরিচালনা করার জন্য একটি Activity Launcher তৈরি করা যাক।

  1. java/com/google/homesampleapp/screens/home/ ফোল্ডারে HomeScreen খুলুন।
  2. কমিশনিং অ্যাক্টিভিটি ফলাফল নিবন্ধন এবং পরিচালনা করতে // CODELAB: commissionDeviceLauncher definition মন্তব্যটি নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:
    val commissionDeviceLauncher =
      rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartIntentSenderForResult()
      ) { result ->
        // Commission Device Step 5.
        // The Commission Device activity in GPS (step 4) has completed.
        val resultCode = result.resultCode
        if (resultCode == Activity.RESULT_OK) {
          Timber.d("CommissionDevice: Success")
          // We let the ViewModel know that GPS commissioning has completed successfully.
          // The ViewModel knows that we still need to capture the device name and will\
          // update UI state to trigger the NewDeviceAlertDialog.
          homeViewModel.gpsCommissioningDeviceSucceeded(result)
        } else {
          homeViewModel.commissionDeviceFailed(resultCode)
        }
      }
    

ধাপ ২: কমিশন ডিভাইস অ্যাকশনটি ট্রিগার করুন

এই ধাপে, ব্যবহারকারী হোম স্ক্রিনের নীচে ডানদিকে "+" বোতামে ক্লিক করে "কমিশন ডিভাইস" অ্যাকশনটি ট্রিগার করে। এরপর commissionDevice() এ একটি কল করা হয়।

val onCommissionDevice = {
  ...
  commissionDevice(activity!!.applicationContext, commissionDeviceLauncher)
}

ধাপ ৩: API-তে কল করুন

  1. এখনও java/com/google/homesampleapp/screens/home ফোল্ডারের HomeScreen.kt এ আছে।
  2. // CODELAB: commissionDevice মন্তব্যটি নিম্নলিখিত commissionDeviceRequest দিয়ে প্রতিস্থাপন করুন। setCommissioningService AppCommissioningService কে একটি CommissioningService ইনস্ট্যান্সের সাথে আবদ্ধ করে, যা একটি কলব্যাক ফাংশনে ফিরে আসে। যখন আপনি একটি কাস্টম পরিষেবা পাস করেন, তখন Home Mobile SDK প্রথমে ডিভাইসগুলিকে Android স্থানীয় ফ্যাব্রিকে কমিশন করবে, তারপর অনবোর্ডিং পেলোডটি AppCommissioningService এ ফেরত পাঠাবে।
    val commissionDeviceRequest =
        CommissioningRequest.builder()
            .setCommissioningService(ComponentName(
                context, AppCommissioningService::class.java))
            .build()
    
  3. .getCommissioningClient() কল করুন, তারপর .commissionDevice() কল করুন।
Matter.getCommissioningClient(context)
    .commissionDevice(commissionDeviceRequest)

আমাদের commissionDevice ফাংশনটি সম্পূর্ণ করতে, একটি addOnSuccessListener এবং addOnFailureListener যোগ করুন:

    .addOnSuccessListener { result ->
      commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
    }
    .addOnFailureListener { error ->
      Timber.e(error)
    }

৫. একটি কমিশনিং পরিষেবা তৈরি করুন

commissionDevice() ফাংশনে, আমরা CommissioningClient API থেকে একটি CommissioningService পাওয়ার অনুরোধ করেছি। এই প্রবাহে, CommissioningClient API প্রথমে ডিভাইসগুলিকে Local Android ফ্যাব্রিকে কমিশন করে, তারপর একটি কলব্যাক ফেরত দেয় যার মধ্যে CommissioningRequestMetadata অবজেক্ট থাকে:

public interface CommissioningService {
interface Callback {
    void onCommissioningRequested(CommissioningRequestMetadata metadata);
  }
}

এখন, আমাদের CommissioningService.Callback উত্তরাধিকারসূত্রে নিতে হবে এবং আমাদের নমুনা অ্যাপে ডিভাইসগুলি কমিশন করার জন্য প্রয়োজনীয় কার্যকারিতা প্রদান করতে হবে। এখানে একটি মৌলিক CommissioningService বাস্তবায়নের একটি উদাহরণ দেওয়া হল:

class MatterCommissioningService : Service(), CommissioningService.Callback {
   private val commissioningServiceDelegate =
     CommissioningService.Builder(this)
       .setCallback(this)
       .build()

   override fun onBind(intent: Intent) = commissioningServiceDelegate.asBinder()

   override fun onCommissioningRequested(metadata: CommissioningRequestMetadata) {
     // perform commissioning

     commissioningServiceDelegate
       .sendCommissioningComplete(CommissioningCompleteMetadata.builder().build())
   }
 }

ধাপ ১: কাস্টম AppCommissioningService অন্বেষণ করুন

শুরু করতে আপনাকে সাহায্য করার জন্য, আমরা ইতিমধ্যেই আমাদের কাস্টম CommissioningService-এর জন্য মৌলিক ক্লাস কাঠামো সংজ্ঞায়িত করেছি। এখানে পরিষেবার কার্যকারিতার একটি সংক্ষিপ্ত সারসংক্ষেপ দেওয়া হল। অনুসরণ করার জন্য, java/commissioningAppCommissioningService খুলুন।

আমরা হোম মোবাইল SDK API-এর জন্য নিম্নলিখিত আমদানিগুলি যোগ করেছি:

import com.google.android.gms.home.matter.commissioning.CommissioningCompleteMetadata
import com.google.android.gms.home.matter.commissioning.CommissioningRequestMetadata
import com.google.android.gms.home.matter.commissioning.CommissioningService

AppCommissioningService Matter repo ( connectedhomeip ) থেকে লাইব্রেরিও অন্তর্ভুক্ত রয়েছে:

import com.google.homesampleapp.chip.ChipClient

অবশেষে, পরিষেবাটিতে হিল্ট এবং কোটলিন কোরোটিনগুলিকে সমর্থন করার জন্য আমদানি অন্তর্ভুক্ত রয়েছে।

এরপর, আমরা কনস্ট্রাক্টর তৈরি করি এবং কিছু জিনিস সেট আপ করি, যার মধ্যে রয়েছে commissioningServiceDelegate , যা আমরা Google Play Services কে কমিশনিং সম্পূর্ণ হলে জানাতে ব্যবহার করব।

private lateinit var commissioningServiceDelegate: CommissioningService
...
commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()

এখন কমিশনিং ফাংশন যোগ করার সময়।

ধাপ ২: কমিশনিং-এর অনুরোধ বাতিল করুন

অ্যাপের ডেভেলপমেন্ট ফ্যাব্রিকে ডিভাইসগুলিকে কমিশন করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. java/commissioningAppCommissioningService খুলুন।
  2. onCommissioningRequested() ফাংশনটি সনাক্ত করুন। আমরা একটি লগ বার্তা প্রদান করেছি যা CommissioningRequestMetadata প্রিন্ট করে। serviceScope coroutine শুরু করতে // CODELAB: onCommissioningRequested() মন্তব্যটি প্রতিস্থাপন করুন এবং deviceId পান।
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. কমিশনিং সম্পাদন করুন। এই ধাপের জন্য, আমরা CommissioningRequestMetadata অবজেক্টে ফেরত ডিভাইসের তথ্য প্রেরণ করতে পারি। ChipClient এই মেটাডেটা তথ্য ব্যবহার করে GHSA for Matter অ্যাপ এবং আপনার ডিভাইসের মধ্যে একটি নিরাপদ চ্যানেল তৈরি করে।
    try {
      Timber.d(
          "Commissioning: App fabric -> ChipClient.establishPaseConnection(): deviceId [${deviceId}]")
      chipClient.awaitEstablishPaseConnection(
          deviceId,
          metadata.networkLocation.ipAddress.hostAddress!!,
          metadata.networkLocation.port,
          metadata.passcode)
      Timber.d(
          "Commissioning: App fabric -> ChipClient.commissionDevice(): deviceId [${deviceId}]")
      chipClient.awaitCommissionDevice(deviceId, null)
    } catch (e: Exception) {
      Timber.e(e, "onCommissioningRequested() failed")
      // No way to determine whether this was ATTESTATION_FAILED or DEVICE_UNREACHABLE.
      commissioningServiceDelegate
          .sendCommissioningError(CommissioningError.OTHER)
          .addOnSuccessListener {
            Timber.d(
                "Commissioning: commissioningServiceDelegate.sendCommissioningError() succeeded")
          }
          .addOnFailureListener { e2 ->
            Timber.e(e2, "Commissioning: commissioningServiceDelegate.sendCommissioningError() failed")
          }
      return@launch
    }
    
  4. Google Play Services কে কমিশনিং সম্পূর্ণ হয়েছে তা জানাতে commissioningServiceDelegate ব্যবহার করুন। .sendCommissioningComplete() এ, CommissioningCompleteMetadata পাস করুন।
    commissioningServiceDelegate
        .sendCommissioningComplete(
            CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build())
        .addOnSuccessListener {
          Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded")
        }
        .addOnFailureListener { e ->
          Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed")
        }
    }
    

অ্যাপটি চালান

এখন যেহেতু আমাদের স্থানীয় ফ্যাব্রিকে কমিশন করার জন্য সমস্ত প্রয়োজনীয় কোড তৈরি করা হয়েছে, তাই এটি পরীক্ষা করার সময় এসেছে। আপনার অ্যান্ড্রয়েড ডিভাইসটি বেছে নিন এবং অ্যাপটি চালান। হোম স্ক্রিন থেকে, "ডিভাইস যোগ করুন" এ আলতো চাপুন এবং আপনার ডিভাইসটি কমিশন করার জন্য পদক্ষেপগুলি সম্পূর্ণ করুন।

কমিশনিং সম্পন্ন হলে, আপনার ডিভাইসটি এখন দুটি ফ্যাব্রিকে অংশগ্রহণ করে: লোকাল অ্যান্ড্রয়েড ফ্যাব্রিক এবং আপনার লোকাল ডেভেলপমেন্ট ফ্যাব্রিক। প্রতিটি ফ্যাব্রিকের নিজস্ব শংসাপত্রের সেট এবং একটি অনন্য, 64-বিট ফ্যাব্রিক আইডি থাকে।

6. নিয়ন্ত্রণ ডিভাইস

একটি ডেভেলপমেন্ট ফ্যাব্রিকে কমিশন করার মাধ্যমে আপনি ম্যাটার রেপো ( connectedhomeip ) থেকে লাইব্রেরি ব্যবহার করে নমুনা অ্যাপ থেকে ডিভাইসগুলি নিয়ন্ত্রণ করতে পারবেন।

ডিভাইস ক্লাস্টার অ্যাক্সেস করা এবং কমান্ড পাঠানো সহজ করার জন্য আমরা কিছু হেল্পার ক্লাস তৈরি করেছি। আরও জানতে, java/clustersClustersHelper খুলুন। এই Singleton হেল্পার ডিভাইসের তথ্য অ্যাক্সেস করার জন্য নিম্নলিখিত লাইব্রেরিগুলি আমদানি করে:

import chip.devicecontroller.ChipClusters
import chip.devicecontroller.ChipStructs

আমরা এই ক্লাসটি ব্যবহার করে একটি ডিভাইসের জন্য On/Off ক্লাস্টার পেতে পারি, তারপর .toggle কল করতে পারি:

suspend fun toggleDeviceStateOnOffCluster(deviceId: Long, endpoint: Int) {
  Timber.d("toggleDeviceStateOnOffCluster())")
  val connectedDevicePtr =
      try {
        chipClient.getConnectedDevicePointer(deviceId)
      } catch (e: IllegalStateException) {
        Timber.e("Can't get connectedDevicePointer.")
        return
      }
  return suspendCoroutine { continuation ->
    getOnOffClusterForDevice(connectedDevicePtr, endpoint)
        .toggle(
            object : ChipClusters.DefaultClusterCallback {
              override fun onSuccess() {
                continuation.resume(Unit)
              }
              override fun onError(ex: Exception) {
                Timber.e("readOnOffAttribute command failure: $ex")
                continuation.resumeWithException(ex)
              }
            })
  }
}

একটি ডিভাইস টগল করুন

একটি ডিভাইস কমিশন করার পর, CommissioningResult- এ ফিরে আসা পেলোড DataStore-এ যোগ করা হয়। এটি আমাদের অ্যাপকে ডিভাইসের তথ্য অ্যাক্সেস দেয় যা আমরা কমান্ড পাঠাতে ব্যবহার করতে পারি।

ম্যাটার অ্যাপগুলি ইভেন্ট চালিত। যখন ম্যাটার স্ট্যাকটি শুরু করা হয়, তখন ক্লাস্টার পরিষেবাগুলি আগত বার্তাগুলি শোনে। একবার একটি ডিভাইস চালু হয়ে গেলে, ম্যাটার ক্লায়েন্টরা ডিভাইস কমিশনিংয়ের সময় প্রতিষ্ঠিত সুরক্ষিত অপারেশনাল চ্যানেলের মাধ্যমে কমান্ড পাঠায়।

ডিভাইসে, প্যাকেটগুলি যাচাই করা হয়, ডিক্রিপ্ট করা হয়, তারপর কলব্যাকের মাধ্যমে প্রেরণ করা হয়। কলব্যাক ফাংশনগুলির মধ্যে রয়েছে EndpointId, ClusterId এবং AttributeId, যা attributePath থেকে অ্যাক্সেসযোগ্য। উদাহরণস্বরূপ, এই কোডটি একটি Matter ডিভাইসে প্রয়োগ করা যেতে পারে:

void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type,
                                       uint16_t size, uint8_t * value)
{
    // handle callback
    ClusterId clusterId     = attributePath.mClusterId;
    AttributeId attributeId = attributePath.mAttributeId;
}

পরবর্তী ধাপগুলিতে, আপনি একটি ডিভাইস টগল করতে Matter SDK এবং ClustersHelper ব্যবহার করবেন।

  1. java/screens/deviceDeviceViewModel এ যান।
  2. updateDeviceStateOn ফাংশনটি সনাক্ত করুন।
  3. // CODELAB: toggle clustersHelper কল করার জন্য মন্তব্যটি কোড দিয়ে টগল করুন, তারপর ডিভাইস সংগ্রহস্থল আপডেট করুন:
    Timber.d("Handling real device")
        try {
          clustersHelper.setOnOffDeviceStateOnOffCluster(deviceUiModel.device.deviceId, isOn, 1)
          devicesStateRepository.updateDeviceState(deviceUiModel.device.deviceId, true, isOn)
        } catch (e: Throwable) {
          Timber.e("Failed setting on/off state")
        }
    

এই ফাংশনটি DeviceScreen থেকে ডাকা হয়:

// On/Off Switch click.
val onOnOffClick: (value: Boolean) -> Unit = { value ->
  deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value)
}

অ্যাপটি চালান

আপনার আপডেটগুলি পুনরায় লোড করতে অ্যাপটি চালান। হোম স্ক্রিন থেকে, আপনার ডিভাইসটি চালু এবং বন্ধ করুন।

৭. অন্যান্য বাস্তুতন্ত্রের সাথে ডিভাইস শেয়ার করুন

ম্যাটার স্পেসিফিকেশনে ডিভাইস শেয়ার করাকে মাল্টি-অ্যাডমিন ফ্লো বলা হয়।

পূর্ববর্তী ধাপগুলিতে, আমরা শিখেছি যে হোম মোবাইল SDK ডিভাইসগুলিকে স্থানীয় অ্যান্ড্রয়েড ফ্যাব্রিকে এবং নমুনা অ্যাপের জন্য একটি ডেভেলপমেন্ট ফ্যাব্রিকে কমিশন করা সম্ভব করে তোলে। এটি মাল্টি-অ্যাডমিন প্রবাহের একটি উদাহরণ, যেখানে ডিভাইসগুলিকে একাধিক ফ্যাব্রিকে কমিশন করা যেতে পারে।

এখন, আপনি আরও বেশি কাপড়ের সাথে ডিভাইসগুলি ভাগ করে নিতে চাইতে পারেন, বিশেষ করে যদি এটি এমন একটি পরিবার হয় যেখানে অ্যাপ্লিকেশন এবং প্ল্যাটফর্মের ক্ষেত্রে মানুষের নিজস্ব পছন্দ থাকে।

হোম মোবাইল SDK ShareDeviceRequest API- তে এই কার্যকারিতা প্রদান করে, যা আপনাকে এগুলি করতে দেয়:

  1. ডিভাইসগুলির জন্য একটি অস্থায়ী কমিশনিং উইন্ডো খুলুন।
  2. আপনার ডিভাইসের অবস্থা পরিবর্তন করুন, যাতে সেগুলিকে অন্য ফ্যাব্রিকে কমিশন করা যায়।
  3. অন্যান্য অ্যাপ এবং ইকোসিস্টেম থেকে আপনার ডিভাইসগুলি নিয়ন্ত্রণ করুন।

পরবর্তী ধাপগুলিতে, আপনি ডিভাইসগুলি ভাগ করে নেওয়ার জন্য হোম মোবাইল SDK ব্যবহার করবেন।

ধাপ ১: একটি জিপিএস অ্যাক্টিভিটি লঞ্চার তৈরি করুন

আমরা যখন একটি ডেভেলপমেন্ট ফ্যাব্রিকে কমিশন করেছিলাম তখন কমিশনিং অ্যাক্টিভিটি লঞ্চার তৈরি করেছিলাম, ঠিক তেমনই আমরা কমিশনিংক্লায়েন্ট API থেকে IntentSender পরিচালনা করার জন্য একটি শেয়ার ডিভাইস অ্যাক্টিভিটি লঞ্চার তৈরি করেছি।

  1. java/com/google/homesampleapp/screens/device/ ফোল্ডারে DeviceScreen খুলুন।
  2. .shareDevice() অ্যাক্টিভিটি ফলাফল নিবন্ধন এবং পরিচালনা করতে // CODELAB: shareDeviceLauncher definition মন্তব্যটি নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:
    val shareDeviceLauncher = rememberLauncherForActivityResult(
      contract = ActivityResultContracts.StartIntentSenderForResult()
    ) { result ->
      // Commission Device Step 5.
      // The Share Device activity in GPS (step 4) has completed.
      val resultCode = result.resultCode
      if (resultCode == Activity.RESULT_OK) {
        deviceViewModel.shareDeviceSucceeded()
      } else {
        deviceViewModel.shareDeviceFailed(resultCode)
      }
    }
    

ধাপ ২: শেয়ার ডিভাইস অ্যাকশনটি ট্রিগার করুন

এই ধাপে, ব্যবহারকারী ডিভাইস স্ক্রিনে "শেয়ার" বোতামে ক্লিক করে "ডিভাইস শেয়ার করুন" অ্যাকশনটি ট্রিগার করে। এরপর ডিভাইস শেয়ার করার জন্য একটি পেয়ারিং উইন্ডো খুলতে deviceViewModel একটি কল করা হয়।

// Share Device button click.
val onShareDevice: () -> Unit = remember {
 {
   deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId)
 }
}

সফলভাবে প্যারিং উইন্ডো খোলার পর, deviceViewModel সেই তথ্যটি UI-তে যোগাযোগ করে। ViewModel এবং UI-এর মধ্যে যোগাযোগ StateFlow অবজেক্টের মাধ্যমে করা হয়।

// Communicate to the UI that the pairing window is open.
// UI can then launch the GPS activity for device sharing.
_pairingWindowOpenForDeviceSharing.value = true

StateFlow অবজেক্টে পরিবর্তন দেখার পর, DeviceScreen নিম্নলিখিত কলটি করে:

shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)

ধাপ ৩: API-তে কল করুন

এখন একটি শেয়ার ডিভাইস টাস্ক শুরু করার সময়।

  1. java/com/google/homesampleapp/screens/device/ ফোল্ডারে DeviceScreen.kt খুলুন।
  2. shareDevice() ফাংশনটি সনাক্ত করুন। // CODELAB: shareDevice মন্তব্যটি ShareDeviceRequest দিয়ে প্রতিস্থাপন করুন। DeviceDescriptor ডিভাইস সম্পর্কে নির্দিষ্ট তথ্য প্রদান করে যেমন এর Vendor Id, Product Id, এবং deviceType। এই উদাহরণে, আমরা মানগুলি হার্ড-কোড করি।
    val shareDeviceRequest =
      ShareDeviceRequest.builder()
        .setDeviceDescriptor(DeviceDescriptor.builder().build())
        .setDeviceName("GHSAFM temp device name")
    
  3. কমিশনিং উইন্ডো এবং প্যারামিটার সেট করুন।
        .setCommissioningWindow(
            CommissioningWindow.builder()
                .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR))
                .setPasscode(SETUP_PIN_CODE)
                .setWindowOpenMillis(SystemClock.elapsedRealtime())
                .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong())
                .build())
        .build()
    
  4. .getCommissioningClient() এ কল করুন, শুধুমাত্র এবার, .shareDevice() API ব্যবহার করুন।
    Matter.getCommissioningClient(context)
        .shareDevice(shareDeviceRequest)
    

commissioningClient.shareDevice() API এর সফল কলব্যাক Google Play পরিষেবাগুলিতে শেয়ার ডিভাইস অ্যাক্টিভিটি চালু করার জন্য IntentSender প্রদান করে।

  1. আমাদের shareDevice ফাংশনটি সম্পূর্ণ করতে, একটি addOnSuccessListener এবং addOnFailureListener যোগ করুন। সফল হলে, ডিভাইস শেয়ারিংয়ের জন্য GPS অ্যাক্টিভিটি চালু করার জন্য shareDeviceLauncherlaunch ডাকা হয়।
        .addOnSuccessListener { result ->
          Timber.d("ShareDevice: Success getting the IntentSender: result [${result}]")
          shareDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
        .addOnFailureListener { error ->
          Timber.e(error)
          deviceViewModel.showMsgDialog("Share device failed", error.toString())
        }
    

অ্যাপটি চালান

আপনার ম্যাটার ডিভাইসটি অন্যান্য ইকোসিস্টেমের সাথে শেয়ার করতে, আপনার অ্যান্ড্রয়েড ডিভাইসে আরেকটি প্ল্যাটফর্ম ইনস্টল করা প্রয়োজন। আমরা নমুনা অ্যাপের আরেকটি উদাহরণ তৈরি করেছি যা আপনি টার্গেট কমিশনার হিসেবে ব্যবহার করতে পারেন।

আপনার অ্যান্ড্রয়েড ডিভাইসে টার্গেট কমিশনার ইনস্টল হয়ে গেলে, যাচাই করুন যে আপনি আপনার ম্যাটার ডিভাইসটি শেয়ার করতে পারেন। টার্গেট কমিশনার অ্যাপটির লেবেল GHSAFM-TC

আপনার ডিভাইসগুলি এখন তিনটি কাপড়ে অংশগ্রহণ করতে পারে:

  1. স্থানীয় অ্যান্ড্রয়েড ফ্যাব্রিক।
  2. আপনার উন্নয়নের ফ্যাব্রিক (এই অ্যাপ)।
  3. এই তৃতীয় ফ্যাব্রিকটি যার সাথে আপনি ডিভাইসটি শেয়ার করেছেন।

৮. পরবর্তী পদক্ষেপ

অভিনন্দন

অভিনন্দন, আপনি এই কোডল্যাবটি সফলভাবে সম্পন্ন করেছেন এবং হোম মোবাইল SDK ব্যবহার করে ডিভাইসগুলি কীভাবে কমিশন এবং শেয়ার করতে হয় তা শিখেছেন।

যদি আপনার নমুনা অ্যাপটি নিয়ে সমস্যা হয়, তাহলে আপনার পরিবেশ যাচাই করার জন্য ধাপগুলি সম্পূর্ণ করার চেষ্টা করুন:

যদি আপনার নমুনা অ্যাপ ব্যবহার সম্পর্কে কোন প্রশ্ন থাকে অথবা কোন কোড বাগ আবিষ্কার হয়, তাহলে আপনি GitHub সংগ্রহস্থলের Issue Tracker-এ সমস্যাগুলি জমা দিতে পারেন:

প্রযুক্তিগত প্রশ্নে গুগলের কাছ থেকে অফিসিয়াল নির্দেশনা পেতে, স্মার্ট হোম ডেভেলপার ফোরাম ব্যবহার করুন:

কমিউনিটি থেকে প্রযুক্তিগত সহায়তা পেতে, স্ট্যাক ওভারফ্লোতে google-smart-home ট্যাগটি ব্যবহার করুন: