Xây dựng một ứng dụng Android quan trọng

1. Chào mừng

Được xây dựng với mục tiêu hợp nhất các tiêu chuẩn IoT, Matter kết nối các thiết bị nhà thông minh trên nhiều hệ sinh thái như Google Home, Zigbee, Bluetooth Mesh, Z-Wave và nhiều hệ sinh thái khác.

Thiết bị di động là điểm tương tác trung tâm với các thiết bị nhà thông minh. Nếu bạn muốn xây dựng ứng dụng Android của riêng mình để hỗ trợ các thiết bị theo chuẩn Matter, thì chúng tôi có thể giúp bạn bắt đầu nhanh chóng.

Ứng dụng mẫu của Google Home cho Matter (GHSA cho Matter) giới thiệu các API SDK dành cho thiết bị di động Home, cho phép người dùng kích hoạt và chia sẻ thiết bị. Bạn cũng có thể dùng ứng dụng mẫu làm công cụ học tập để hiểu rõ hơn về các khái niệm chính của Matter, đồng thời là một công cụ để gỡ lỗi và khắc phục sự cố tương tác với các thiết bị theo chuẩn Matter.

Bạn sẽ thực hiện

Trong lớp học lập trình này, bạn sẽ tải mã nguồn cho ứng dụng mẫu xuống, đồng thời tìm hiểu cách sử dụng Home Mobile SDK để chạy thử nghiệm và chia sẻ thiết bị. Bạn cũng sẽ tìm hiểu cách sử dụng các thư viện uỷ quyền và Cụm trong Kho lưu trữ Matt (connectedhomeip).

Sau khi bạn tải ứng dụng mẫu xuống, chúng tôi sẽ xem xét mã nguồn trong Android Studio và triển khai các API SDK dành cho thiết bị di động Home sau đây:

Bạn cũng sẽ tìm hiểu thêm về các khái niệm lắp đặt thiết bị, các loại vải Matter và cách điều khiển các thiết bị Matter.

Bạn cần có

Trước khi bắt đầu, hãy nhớ hoàn thành các bước sau:

Bạn không cần một thiết bị trung tâm, chẳng hạn như Google Nest Hub (Thế hệ 2), để vận hành và điều khiển các thiết bị bằng ứng dụng mẫu.

2. Bắt đầu thiết lập

Ứng dụng khởi đầu của lớp học lập trình này nằm trong nhánh codelab. Để bắt đầu làm việc với mã nguồn của lớp học lập trình này, bạn có thể tải tệp ZIP xuống.

Bạn sẽ dùng tệp ZIP codelab này để tạo một mẫu hoạt động.

Các phiên bản của lớp học lập trình

Nhánh codelab được gắn thẻ với bản phát hành 2.0.0 của ứng dụng mẫu. Để so sánh các bản cập nhật trong khi thực hiện từng bước, bạn có thể tải mã nguồn đã hoàn tất cho bản phát hành này.

Nếu bạn muốn sao chép kho lưu trữ GitHub, hãy làm theo hướng dẫn trong phần README ứng dụng mẫu.

Phần phụ thuộc

Chúng tôi sẽ hướng dẫn bạn về mã nguồn cần thiết để chia sẻ và cài đặt thiết bị. Tuy nhiên, bạn nên nắm rõ các phần phụ thuộc sau đây trước khi bắt đầu. Xin lưu ý rằng bạn đã khai báo các phần phụ thuộc này trong tệp libs.versions.toml và cách sử dụng sẽ được chỉ định trong tệp build.gradle.kts

Mã nguồn

Chúng tôi đã tạo giao diện người dùng và hầu hết chức năng cho bạn.

Đối với lớp học lập trình này, chúng ta sẽ thêm chức năng Matter vào các tệp sau:

  • java/com/google/homesampleapp/commissioning/AppCommissioningService: cho phép bạn đưa thiết bị vào kết cấu phát triển
  • java/com/google/homesampleapp/screens/home/HomeScreenjava/com/google/homesampleapp/screens/home/HomeViewModel.kt: có chức năng uỷ quyền SDK Home dành cho thiết bị di động
  • java/com/google/homesampleapp/screens/device/DeviceScreenjava/com/google/homesampleapp/screens/device/DeviceViewModel: bao gồm các lệnh gọi Share Device API

Mỗi tệp có nhận xét bằng khối mã mà bạn sẽ sửa đổi, ví dụ:

// CODELAB: add commissioningFunction()

Điều này giúp bạn nhanh chóng tìm thấy phần tương ứng trong lớp học lập trình.

3. Phí hoa hồng cho Google

Trước khi bạn có thể điều khiển các thiết bị và cho phép các thiết bị đó giao tiếp với nhau trong cùng một loại vải, các thiết bị đó cần phải được một Uỷ viên uỷ quyền, trong trường hợp này là ứng dụng mẫu này, Ứng dụng mẫu Google Home for Matter.

Bạn cần nắm được các khái niệm sau đây về quy trình uỷ quyền cho vấn đề:

  • Vải cho phép các thiết bị giao tiếp với nhau.
  • Các vải duy trì một bộ thông tin đăng nhập riêng biệt dùng chung.
  • Các hệ sinh thái chịu trách nhiệm phát hành chứng chỉ gốc đáng tin cậy, gán mã nhận dạng vải và chỉ định mã nút duy nhất. Hệ sinh thái là dịch vụ phụ trợ của một cố vấn, chẳng hạn như Home Graph cho hệ sinh thái Google Home.
  • Các thiết bị có thể được chỉ định cho nhiều loại vải (tính năng nhiều quản trị viên).

Để kích hoạt phí hoa hồng cho một thiết bị, bạn cần sử dụng CommissioningClient API. Lệnh gọi đến .commissionDevice() sẽ trả về một IntentSender, giúp khởi chạy hoạt động thích hợp trong Dịch vụ Google Play:

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

Trong các phần tiếp theo, chúng ta sẽ đề cập đến đoạn mã tối thiểu cần có để vận hành các thiết bị cho nền tảng Google.

Bước 1: Trình chạy hoạt động

Để xử lý IntentSender qua CommissioningClient, bạn có thể dùng ActivityResultLaunch:

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

Bước 2: Chức năng uỷ quyền

Dưới đây là một ví dụ cơ bản sử dụng API CommissioningClient để lắp đặt một thiết bị vào vải của Google.

  1. Quá trình uỷ quyền bắt đầu bằng hàm commissionDevice(). Trước tiên, CommissioningRequest được xác định. Với cấu hình mặc định này, các thiết bị chỉ được uỷ quyền cho nền tảng Android cục bộ.
  2. Matter là điểm truy cập cho SDK dành cho thiết bị di động Home. Trong lệnh gọi tiếp theo, .getCommissioningClient sẽ nhận được một CommissioningClient thuộc this (Hoạt động).
  3. .commissionDevice() chấp nhận CommissioningRequest.
  4. Cuối cùng, .addOnSuccessListener được gọi để xử lý CommissioningResult và chạy Hoạt động trên thiết bị hoa hồng trên Dịch vụ Google Play (GPS).
private fun commissionDevice() {
    val request: CommissioningRequest = CommissioningRequest.builder().build()
    Matter.getCommissioningClient(this)
        .commissionDevice(request)
        .addOnSuccessListener { result ->
            commissioningLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
}

Bạn có thể tận dụng Local Android Fabric thông qua các chế độ cài đặt Android để đơn giản hoá quy trình vận hành thiết bị của mình với các nền tảng khác.

Tiếp theo, bạn sẽ tìm hiểu cách lắp ráp một thiết bị vào vải phát triển.

Để biết thông tin tổng quan về giao diện người dùng trong quá trình vận hành, hãy tham khảo Hướng dẫn về ứng dụng mẫu Google Home cho Matter.

4. uỷ quyền cho nền tảng phát triển

Bạn có thể đặt thiết bị cho nhiều loại vải. Để quản lý các ghép nối đáng tin cậy, các thiết bị lưu trữ một FabricTable chứa nhiều thành viên FabricInfo, ví dụ:

  • Nhận dạng vải
  • Mã nút do vải gán cho thiết bị
  • Mã nhà cung cấp
  • Mã nhận dạng vải
  • Thông tin xác thực hoạt động của thiết bị

Trình quản lý miền quản trị (ADM) xác định thông tin xác thực vải. Trong trường hợp trước, Dịch vụ Google Play là hệ sinh thái đóng vai trò là một tổ chức phát hành chứng chỉ gốc (CA) đáng tin cậy. Khi bạn đặt phí cho thiết bị vào vải Android cục bộ, mọi thiết bị đều bao gồm cùng một bộ thông tin xác thực vải và cùng một bộ CA.

Dịch vụ uỷ quyền tuỳ chỉnh

Để triển khai cho vải Android cục bộ, chúng tôi đã sử dụng các tham số mặc định để tạo CommissioningRequest trong API CommissioningClient:

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

Nếu muốn điều khiển và quản lý thiết bị mới từ ứng dụng của mình, bạn cần tạo nền tảng phát triển cục bộ và lấy thông tin đăng nhập hoạt động để ủy quyền cho thiết bị. Trong trường hợp này, ứng dụng của bạn sẽ trở thành một hệ sinh thái độc lập, duy nhất giúp chỉ định thông tin đăng nhập nút thích hợp cho thiết bị.

Bạn có thể thông báo cho Home Mobile SDK biết rằng bạn muốn tích hợp thiết bị vào kết cấu của riêng mình bằng cách chuyển một dịch vụ tuỳ chỉnh đến CommissioningRequest:

class CommissioningRequest {
  static CommissioningRequest.Builder builder();

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

    CommissioningRequest build();
  }
}

Trong các bước tiếp theo, chúng ta sẽ sửa đổi hàm commissionDevice() để sử dụng một dịch vụ tuỳ chỉnh. Chúng ta cũng sẽ thêm Trình chạy hoạt động vào mảnh Trang chủ và sử dụng các đối tượng LiveData để quản lý luồng API.

Bước 1: Tạo Trình chạy hoạt động GPS

Trước tiên, hãy tạo một Trình chạy hoạt động để xử lý IntentSender từ API CommissioningClient.

  1. Mở HomeScreen trong thư mục java/com/google/homesampleapp/screens/home/.
  2. Thay thế nhận xét // CODELAB: commissionDeviceLauncher definition bằng mã sau để đăng ký và xử lý kết quả Hoạt động chạy:
    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)
        }
      }
    

Bước 2: Kích hoạt hành động phí hoa hồng trên thiết bị

Ở bước này, người dùng kích hoạt "Thiết bị tính phí hoa hồng" bằng cách nhấp vào dấu "+" ở góc dưới bên phải Màn hình chính. Sau đó, cuộc gọi sẽ được thực hiện đến commissionDevice().

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

Bước 3: Gọi API

  1. Vẫn ở HomeScreen.kt trong thư mục java/com/google/homesampleapp/screens/home.
  2. Thay thế nhận xét // CODELAB: commissionDevice bằng commissionDeviceRequest sau. setCommissioningService liên kết AppCommissioningService với một thực thể CommissioningService. Hàm này được trả về trong một hàm callback. Khi bạn truyền một dịch vụ tuỳ chỉnh, trước tiên, Home Mobile SDK sẽ đưa các thiết bị vào kết cấu cục bộ của Android, sau đó gửi lại tải trọng quy trình tích hợp về AppCommissioningService.
    val commissionDeviceRequest =
        CommissioningRequest.builder()
            .setCommissioningService(ComponentName(
                context, AppCommissioningService::class.java))
            .build()
    
  3. Gọi .getCommissioningClient(), sau đó gọi .commissionDevice().
Matter.getCommissioningClient(context)
    .commissionDevice(commissionDeviceRequest)

Để hoàn tất hàm commissionDevice, hãy thêm addOnSuccessListeneraddOnFailureListener:

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

5. Tạo Dịch vụ uỷ quyền

Trong hàm commissionDevice(), chúng ta đã yêu cầu lấy một CommissioningService từ API CommissioningClient. Trong quy trình này, trước tiên, API CommissioningClient gửi đơn đặt hàng cho các cấu trúc Android cục bộ, sau đó trả về một lệnh gọi lại bao gồm đối tượng CommissioningRequestMetadata:

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

Bây giờ, chúng ta phải kế thừa CommissioningService.Callback và cung cấp chức năng cần thiết để chạy các thiết bị cho ứng dụng mẫu của chúng ta. Dưới đây là ví dụ về cách triển khai CommissioningService cơ bản:

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

Bước 1: Khám phá AppCommissioningService tuỳ chỉnh

Để giúp bạn bắt đầu, chúng tôi đã xác định cấu trúc lớp cơ bản cho CommissioningService tuỳ chỉnh của mình. Dưới đây là tổng quan nhanh về chức năng của dịch vụ. Để theo dõi, hãy mở AppCommissioningService trong java/commissioning.

Chúng tôi đã thêm các nội dung nhập sau cho các API Home Mobile SDK:

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 cũng bao gồm các thư viện trong Kho lưu trữ Matter (connectedhomeip):

import com.google.homesampleapp.chip.ChipClient

Cuối cùng, dịch vụ này bao gồm các lệnh nhập để hỗ trợ Hiltcác coroutine Kotlin.

Tiếp theo, chúng ta sẽ tạo hàm khởi tạo và thiết lập một vài thứ, bao gồm cả commissioningServiceDelegate. Chúng ta sẽ sử dụng hàm này để cho Dịch vụ Google Play biết khi quá trình vận hành hoàn tất.

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

Giờ là lúc thêm các chức năng uỷ quyền.

Bước 2: Ghi đè onCommissioningRequested

Để đưa thiết bị vào kết quả phát triển của ứng dụng, hãy hoàn tất các bước sau:

  1. Mở AppCommissioningService trong java/commissioning.
  2. Tìm hàm onCommissioningRequested(). Chúng tôi đã cung cấp một thông điệp nhật ký in CommissioningRequestMetadata. Thay thế nhận xét // CODELAB: onCommissioningRequested() để bắt đầu coroutine serviceScope và lấy deviceId.
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. Thực hiện việc uỷ quyền. Đối với bước này, chúng ta có thể truyền thông tin thiết bị được trả về trong đối tượng CommissioningRequestMetadata. ChipClient sử dụng thông tin siêu dữ liệu này để tạo một kênh bảo mật giữa ứng dụng GHSA cho Matter và thiết bị của bạn.
    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. Hãy sử dụng commissioningServiceDelegate để cho Dịch vụ Google Play biết rằng quá trình uỷ quyền đã hoàn tất. Trong .sendCommissioningComplete(), hãy truyền 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")
        }
    }
    

Chạy ứng dụng

Giờ đây, tất cả mã bắt buộc đã có sẵn để chạy cho vải cục bộ, đã đến lúc kiểm tra mã. Chọn thiết bị Android của bạn và chạy ứng dụng. Trên Màn hình chính, hãy nhấn vào Thêm thiết bị rồi hoàn thành các bước để kích hoạt thiết bị.

Khi quá trình uỷ quyền hoàn tất, thiết bị của bạn giờ đây sẽ tham gia vào hai loại vải: vải Android cục bộ và vải phát triển cục bộ. Mỗi loại vải có bộ thông tin đăng nhập riêng và một mã vải 64 bit duy nhất.

6. Điều khiển thiết bị

Việc uỷ quyền cho kết cấu phát triển cho phép bạn sử dụng các thư viện trong Kho lưu trữ Matt (connectedhomeip) để điều khiển các thiết bị trong ứng dụng mẫu.

Chúng tôi đã tạo một số lớp trợ giúp để giúp bạn dễ dàng truy cập vào các cụm của thiết bị và gửi lệnh. Để tìm hiểu thêm, hãy mở ClustersHelper trong java/clusters. Trình trợ giúp Singleton này nhập các thư viện sau để truy cập vào thông tin thiết bị:

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

Chúng ta có thể dùng lớp này để lấy cụm Bật/Tắt cho một thiết bị, sau đó gọi .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)
              }
            })
  }
}

Bật/tắt thiết bị

Sau khi bạn chạy phí cho một thiết bị, tải trọng được trả về trong CommissioningResult được thêm vào DataStore. Việc này cho phép ứng dụng truy cập vào thông tin thiết bị mà chúng ta có thể dùng để gửi lệnh.

Các ứng dụng Matter được mô hình dựa trên sự kiện. Khi khởi động ngăn xếp Matter, dịch vụ cụm sẽ theo dõi các thông báo đến. Sau khi thiết bị được đưa vào hoạt động, ứng dụng theo chuẩn Matter sẽ gửi lệnh qua kênh vận hành bảo mật đã được thiết lập trong quá trình vận hành thiết bị.

Trên thiết bị, gói được xác thực, giải mã, sau đó được gửi đi bằng lệnh gọi lại. Các hàm gọi lại bao gồm EndpointId, ClusterId và AttributesId, có thể truy cập được từ attributePath. Ví dụ: bạn có thể triển khai mã này trên thiết bị theo chuẩn 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;
}

Trong các bước tiếp theo, bạn sẽ dùng SDK Matter và ClustersHelper để bật/tắt một thiết bị.

  1. Đi đến DeviceViewModel trong java/screens/device.
  2. Tìm hàm updateDeviceStateOn.
  3. Thay thế nhận xét // CODELAB: toggle bằng mã để gọi clustersHelper, sau đó cập nhật kho lưu trữ thiết bị:
    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")
        }
    

Hàm này được gọi từ DeviceScreen:

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

Chạy ứng dụng

Chạy ứng dụng để tải lại nội dung cập nhật. Trên Màn hình chính, hãy bật và tắt thiết bị của bạn.

7. Dùng chung thiết bị với các hệ sinh thái khác

Việc dùng chung thiết bị được gọi là quy trình nhiều quản trị viên trong thông số kỹ thuật của Matter.

Trong các bước trước, chúng ta đã biết rằng Home Mobile SDK giúp bạn có thể đưa các thiết bị vào hệ thống Android cục bộ cũng như cho kết cấu phát triển cho ứng dụng mẫu. Đây là ví dụ về quy trình nhiều quản trị viên, trong đó các thiết bị có thể được ủy quyền cho nhiều loại vải.

Giờ đây, bạn có thể muốn chia sẻ thiết bị với nhiều loại vải hơn nữa, đặc biệt nếu đây là hộ gia đình mà mọi người có sở thích riêng về các ứng dụng và nền tảng.

SDK Home dành cho thiết bị di động cung cấp chức năng này trong API ShareDeviceRequest, cho phép bạn:

  1. Mở một cửa sổ vận hành tạm thời cho các thiết bị.
  2. Thay đổi trạng thái của thiết bị để cho phép thiết bị đặt các thiết bị đó lên một loại vải khác.
  3. Kiểm soát thiết bị của bạn từ các ứng dụng và hệ sinh thái khác.

Trong các bước tiếp theo, bạn sẽ sử dụng SDK Home dành cho thiết bị di động để chia sẻ thiết bị.

Bước 1: Tạo Trình chạy hoạt động GPS

Tương tự như Trình chạy hoạt động uỷ quyền mà chúng tôi đã tạo khi uỷ quyền phát triển mô hình phát triển, chúng ta đã tạo Trình chạy hoạt động chia sẻ trên thiết bị để xử lý IntentSender từ API CommissioningClient.

  1. Mở DeviceScreen trong thư mục java/com/google/homesampleapp/screens/device/.
  2. Thay thế nhận xét // CODELAB: shareDeviceLauncher definition bằng mã sau để đăng ký và xử lý kết quả của Hoạt động .shareDevice():
    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)
      }
    }
    

Bước 2: Kích hoạt hành động chia sẻ thiết bị

Ở bước này, người dùng kích hoạt nút "Chia sẻ thiết bị" bằng cách nhấp vào nút "Chia sẻ" trên màn hình thiết bị. Sau đó, lệnh gọi được thực hiện đến deviceViewModel để mở Cửa sổ ghép nối để chia sẻ thiết bị.

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

Sau khi mở thành công cửa sổ ghép nối, deviceViewModel sẽ truyền thông tin này đến giao diện người dùng. Hoạt động giao tiếp giữa ViewModel và giao diện người dùng được thực hiện thông qua các đối tượng StateFlow.

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

Khi thấy thay đổi đối với đối tượng StateFlow, DeviceScreen thực hiện lệnh gọi sau:

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

Bước 3: Gọi API

Giờ đã đến lúc bắt đầu tác vụ chia sẻ trên thiết bị.

  1. Mở DeviceScreen.kt trong thư mục java/com/google/homesampleapp/screens/device/.
  2. Tìm hàm shareDevice(). Thay thế nhận xét // CODELAB: shareDevice bằng ShareDeviceRequest. DeviceDescriptor cung cấp thông tin cụ thể về thiết bị, chẳng hạn như mã nhà cung cấp, mã sản phẩm và deviceType. Trong ví dụ này, chúng ta mã hoá cứng các giá trị.
    val shareDeviceRequest =
      ShareDeviceRequest.builder()
        .setDeviceDescriptor(DeviceDescriptor.builder().build())
        .setDeviceName("GHSAFM temp device name")
    
  3. Đặt CommissioningWindowcác tham số.
        .setCommissioningWindow(
            CommissioningWindow.builder()
                .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR))
                .setPasscode(SETUP_PIN_CODE)
                .setWindowOpenMillis(SystemClock.elapsedRealtime())
                .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong())
                .build())
        .build()
    
  4. Hãy gọi .getCommissioningClient(), chỉ lần này, sử dụng API .shareDevice().
    Matter.getCommissioningClient(context)
        .shareDevice(shareDeviceRequest)
    

Lệnh gọi lại thành công của API commissioningClient.shareDevice() cung cấp IntentSender để chạy tính năng Chia sẻ hoạt động trên thiết bị trong Dịch vụ Google Play.

  1. Để hoàn tất hàm shareDevice, hãy thêm addOnSuccessListeneraddOnFailureListener. Khi thành công, launch được gọi trên shareDeviceLauncher để khởi chạy hoạt động GPS để chia sẻ thiết bị.
        .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())
        }
    

Chạy ứng dụng

Để chia sẻ thiết bị Matter với các hệ sinh thái khác, bạn cần phải cài đặt một nền tảng khác trên thiết bị Android. Chúng tôi đã tạo một phiên bản khác của ứng dụng mẫu mà bạn có thể dùng làm uỷ viên mục tiêu.

Sau khi cài đặt uỷ viên mục tiêu trên thiết bị Android, hãy xác minh rằng bạn có thể chia sẻ thiết bị Matter. Ứng dụng ủy viên mục tiêu được gắn nhãn GHSAFM-TC.

Thiết bị của bạn hiện có thể tham gia vào ba loại vải:

  1. Kết cấu Android cục bộ.
  2. Sơ đồ phát triển của bạn (ứng dụng này).
  3. Lớp vải thứ ba này mà bạn vừa chia sẻ thiết bị.

8. Các bước tiếp theo

Xin chúc mừng

Xin chúc mừng, bạn đã hoàn tất thành công lớp học lập trình này, đồng thời học cách chạy thử nghiệm và chia sẻ thiết bị bằng SDK Home dành cho thiết bị di động.

Nếu bạn gặp sự cố với ứng dụng mẫu, hãy thử hoàn tất các bước để xác minh môi trường của bạn:

Nếu có thắc mắc về việc sử dụng ứng dụng mẫu hoặc phát hiện ra lỗi mã, bạn có thể gửi vấn đề đến Công cụ theo dõi lỗi trong kho lưu trữ GitHub:

Để nhận hướng dẫn chính thức từ Google về các câu hỏi kỹ thuật, hãy sử dụng Diễn đàn nhà phát triển nhà thông minh:

Để nhận hỗ trợ kỹ thuật từ cộng đồng, hãy sử dụng thẻ google-smart-home trên Stack Overflow: