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

1. স্বাগতম

IoT মানকে একীভূত করার লক্ষ্য নিয়ে তৈরি, ম্যাটার বিভিন্ন ইকোসিস্টেম যেমন Google Home, Zigbee, Bluetooth Mesh, Z-Wave এবং আরও অনেক কিছু জুড়ে স্মার্ট হোম ডিভাইসগুলিকে সংযুক্ত করে৷

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

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

আপনি কি করবেন

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

আপনি নমুনা অ্যাপ ডাউনলোড করার পরে, আমরা অ্যান্ড্রয়েড স্টুডিওতে সোর্স কোড পর্যালোচনা করব এবং নিম্নলিখিত হোম মোবাইল SDK APIগুলি প্রয়োগ করব:

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

আপনি কি প্রয়োজন হবে

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

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

2. সেট আপ করুন

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

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

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

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

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

নির্ভরতা

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

সোর্স কোড

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

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

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

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

// CODELAB: add commissioningFunction()

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

3. Google-এ কমিশন

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

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

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

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

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

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

ধাপ 1: কার্যকলাপ লঞ্চার

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)
    }
}

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

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

  1. কমিশনিং প্রক্রিয়া commissionDevice() ফাংশন দিয়ে শুরু হয়। প্রথমত, একটি CommissioningRequest সংজ্ঞায়িত করা হয়। এই ডিফল্ট কনফিগারেশনের সাথে, ডিভাইসগুলি শুধুমাত্র স্থানীয় Android ফ্যাব্রিকে কমিশন করা হয়।
  2. হোম মোবাইল SDK-এর জন্য Matter হল এন্ট্রি পয়েন্ট। পরবর্তী কলে, .getCommissioningClient this (ক্রিয়াকলাপ) দ্বারা একটি কমিশনিং ক্লায়েন্ট পায়।
  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())
        }
}

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

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

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

4. একটি উন্নয়ন ফ্যাব্রিক কমিশন

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

  • ফ্যাব্রিক সনাক্তকরণ
  • ডিভাইসে ফ্যাব্রিক দ্বারা নির্ধারিত নোড আইডি
  • বিক্রেতা সনাক্তকরন সংখ্যা
  • ফ্যাব্রিক আইডি
  • ডিভাইস অপারেশনাল শংসাপত্র

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

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

স্থানীয় অ্যান্ড্রয়েড ফ্যাব্রিকে কমিশন করার জন্য, কমিশনিং ক্লায়েন্ট এপিআইতে CommissioningRequest তৈরি করতে আমরা ডিফল্ট প্যারামিটার ব্যবহার করেছি:

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

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

আপনি Home Mobile SDK কে জানাতে পারেন যে আপনি কমিশনিং রিকোয়েস্টে একটি কাস্টম পরিষেবা পাস করে আপনার নিজস্ব ফ্যাব্রিকে ডিভাইসগুলি কমিশন করতে চান:

class CommissioningRequest {
  static CommissioningRequest.Builder builder();

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

    CommissioningRequest build();
  }
}

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

ধাপ 1: একটি GPS কার্যকলাপ লঞ্চার তৈরি করুন

প্রথমে, কমিশনিং ক্লায়েন্ট API থেকে IntentSender হ্যান্ডেল করার জন্য একটি অ্যাক্টিভিটি লঞ্চার তৈরি করি।

  1. java/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)
        }
      }
    

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

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

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

ধাপ 3: API কল করুন

  1. এখনও java/screens/home/ ফোল্ডারে HomeScreen.kt এ।
  2. // CODELAB: commissionDevice মন্তব্যটি নিম্নলিখিত commissionDeviceRequest দিয়ে প্রতিস্থাপন করুন। setCommissioningService AppCommissioningService CommissioningService ইনস্ট্যান্সে আবদ্ধ করে, একটি কলব্যাক ফাংশনে ফিরে আসে। আপনি যখন একটি কাস্টম পরিষেবা পাস করবেন, হোম মোবাইল 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)
    }

5. একটি কমিশনিং সার্ভিস তৈরি করুন

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

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

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

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())
   }
 }

ধাপ 1: কাস্টম AppCommissioningService এক্সপ্লোর করুন

আপনাকে শুরু করতে সাহায্য করার জন্য, আমরা ইতিমধ্যেই আমাদের কাস্টম কমিশনিং সার্ভিসের জন্য প্রাথমিক শ্রেণি কাঠামো সংজ্ঞায়িত করেছি। এখানে পরিষেবা কার্যকারিতা একটি দ্রুত ওভারভিউ আছে. অনুসরণ করতে, 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 ম্যাটার রেপো ( connectedhomeip ) থেকে লাইব্রেরিও রয়েছে:

import com.google.home_sample_app_for_matter.chip.ChipClient

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

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

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

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

ধাপ 2: ওভাররাইড onCommissioningRequested

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

  1. java/commissioningAppCommissioningService খুলুন।
  2. onCommissioningRequested() ফাংশনটি সনাক্ত করুন। আমরা একটি লগ বার্তা প্রদান করেছি যা CommissioningRequestMetadata প্রিন্ট করে। serviceScope কোরোটিন শুরু করতে এবং deviceId পেতে // CODELAB: onCommissioningRequested() মন্তব্যটি প্রতিস্থাপন করুন।
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. কমিশনিং সঞ্চালন. এই ধাপের জন্য, আমরা কমিশনিং রিকোয়েস্টমেটাডাটা অবজেক্টে ফিরে আসা ডিভাইসের তথ্য পাস করতে পারি। 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 পরিষেবাগুলিকে কমিশনিং সম্পূর্ণ হয়েছে তা জানাতে 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/clusters ClustersHelper খুলুন। এই সিঙ্গেলটন সাহায্যকারী ডিভাইসের তথ্য অ্যাক্সেস করতে নিম্নলিখিত লাইব্রেরিগুলি আমদানি করে:

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

আমরা একটি ডিভাইসের জন্য চালু/বন্ধ ক্লাস্টার পেতে এই ক্লাসটি ব্যবহার করতে পারি, তারপর .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)
              }
            })
  }
}

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

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

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

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

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;
}

পরবর্তী ধাপে, আপনি একটি ডিভাইস টগল করতে ম্যাটার 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)
}

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

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

7. অন্যান্য ইকোসিস্টেমের সাথে ডিভাইস শেয়ার করুন

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

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

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

Home Mobile SDK ShareDeviceRequest API- তে এই কার্যকারিতা প্রদান করে, যা আপনাকে করতে দেয়:

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

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

ধাপ 1: একটি GPS কার্যকলাপ লঞ্চার তৈরি করুন

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

  1. java/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)
      }
    }
    

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

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

// Share Device button click.
val onShareDevice: () -> Unit = {
 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

স্টেটফ্লো অবজেক্টে পরিবর্তন দেখে, ডিভাইসস্ক্রিন নিম্নলিখিত কল করে:

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

ধাপ 3: API কল করুন

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

  1. java/screens/device/ ফোল্ডারে DeviceScreen.kt খুলুন।
  2. shareDevice() ফাংশন সনাক্ত করুন। // CODELAB: shareDevice মন্তব্যটি ShareDeviceRequest এর সাথে প্রতিস্থাপন করুন। DeviceDescriptor ডিভাইস সম্পর্কে নির্দিষ্ট তথ্য প্রদান করে যেমন এর ভেন্ডর আইডি, প্রোডাক্ট আইডি এবং ডিভাইস টাইপ। এই উদাহরণে, আমরা মানগুলিকে হার্ড-কোড করি।
    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 যোগ করুন। সফল হলে, ডিভাইস শেয়ার করার জন্য জিপিএস অ্যাক্টিভিটি চালু করতে shareDeviceLauncher launch ডাকা হয়।
        .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. এই তৃতীয় ফ্যাব্রিক যার সাথে আপনি ডিভাইসটি শেয়ার করেছেন।

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

অভিনন্দন

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

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

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

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

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