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

1. Chào mừng bạn

Đượ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 chính với các thiết bị nhà thông minh. Nếu bạn muốn tạo ứng dụng Android của riêng mình để hỗ trợ các thiết bị Matter, chúng tôi có thể giúp bạn bắt đầu nhanh chóng.

Ứng dụng mẫu Google Home cho Matter (GHSA cho Matter) minh hoạ API Home Mobile SDK, cho phép người dùng thiết lập và chia sẻ thiết bị. Bạn cũng có thể sử dụng ứng dụng mẫu này 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, cũng như làm công cụ gỡ lỗi và khắc phục sự cố khi tương tác với các thiết bị 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 và tìm hiểu cách sử dụng Home Mobile SDK để thiết lập 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 khởi tạo và Cụm từ kho lưu trữ Matter (connectedhomeip).

Sau khi bạn tải ứng dụng mẫu xuống, chúng ta sẽ xem xét mã nguồn trong Android Studio và triển khai API Home Mobile SDK sau đây:

Bạn cũng sẽ tìm hiểu thêm về các khái niệm liên quan đến việc thiết lập, cấu trúc liên kết 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 tất các bước sau:

Bạn không cần thiết bị trung tâm (ví dụ: Google Nest Hub (thế hệ thứ 2)) để thiết lập 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ằ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, bạn có thể tải tệp ZIP xuống.

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

Phiên bản lớp học lập trình

Nhánh codelab được gắn thẻ bản phát hành 2.0.0 của ứng dụng mẫu. Để so sánh các nội dung cập nhật 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 xuống.

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 của ứ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à uỷ quyền thiết bị, nhưng bạn nên biết các phần phụ thuộc sau đây trước khi bắt đầu. Xin lưu ý rằng các phần phụ thuộc này được khai báo trong tệp libs.versions.toml và cách sử dụng được chỉ định trong tệp build.gradle.kts

Mã nguồn

Giao diện người dùng và hầu hết các chức năng đã được tạo cho bạn.

Trong 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 thiết lập các thiết bị cho cấu trúc phát triển
  • java/com/google/homesampleapp/screens/home/HomeScreenjava/com/google/homesampleapp/screens/home/HomeViewModel.kt: bao gồm chức năng thiết lập Home Mobile SDK
  • 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 đều được chú thích 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. 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 chúng giao tiếp với nhau trong cùng một mạng, bạn cần phải uỷ quyền cho chúng bằng một Trình uỷ quyền. Trong trường hợp này, đó là ứng dụng mẫu này, tức là Google Home Sample App for Matter.

Bạn cần hiểu rõ những khái niệm sau đây về quy trình thiết lập Matter:

  • Fabric cho phép các thiết bị giao tiếp với nhau.
  • Fabric duy trì một bộ thông tin đăng nhập duy nhất được chia sẻ.
  • Hệ sinh thái chịu trách nhiệm phát hành chứng chỉ gốc tin cậy, chỉ định mã nhận dạng cấu trúc liên kết và chỉ định mã nhận dạng nút duy nhất. Hệ sinh thái là dịch vụ phụ trợ của một bên uỷ quyền, ví dụ: Home Graph cho hệ sinh thái Google Home.
  • Bạn có thể thiết lập nhiều thiết bị cho nhiều mạng lưới (tính năng nhiều quản trị viên).

Để thiết lập 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, lệnh này sẽ 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ẽ xem xét đoạn mã tối thiểu cần thiết để đưa các thiết bị vào hệ thống của Google.

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

Để xử lý IntentSender từ CommissioningClient, bạn có thể dùng 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)
    }
}

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

Sau đây là một ví dụ cơ bản sử dụng API CommissioningClient để thiết lập một thiết bị cho Google Fabric.

  1. Quy trình thiết lập 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 đưa vào sử dụng trong Local Android fabric.
  2. Matter là điểm truy cập cho Home Mobile SDK. Trong lệnh gọi tiếp theo, .getCommissioningClient nhận CommissioningClient theo this (Hoạt động).
  3. .commissionDevice() chấp nhận CommissioningRequest.
  4. Cuối cùng, .addOnSuccessListener được gọi để xử lý CommissioningResult và khởi chạy Hoạt động Commission Device (Thiết bị uỷ quyền) của 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 phần cài đặt Android để đơn giản hoá quy trình thiết lập các thiết bị của Local Android Fabric với các fabric khác.

Tiếp theo, bạn sẽ tìm hiểu cách thiết lập một thiết bị cho một cấu trúc phát triển.

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

4. Hoa hồng cho một cấu trúc phát triển

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

  • Nhận dạng vải
  • Mã nút do cấu trúc liên kết chỉ định cho thiết bị
  • Mã nhà cung cấp
  • Mã 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 đăng nhập của cấu trúc. Trong trường hợp trước, Dịch vụ Google Play là hệ sinh thái đóng vai trò là tổ chức phát hành chứng chỉ gốc (CA) đáng tin cậy. Khi bạn thiết lập các thiết bị cho mạng cục bộ Android, mọi thiết bị đều có cùng một bộ thông tin xác thực mạng và cùng một bộ CA.

Dịch vụ vận hành theo yêu cầu

Để uỷ quyền cho Local Android Fabric, 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 kiểm soát và quản lý các thiết bị mới từ ứng dụng của mình, bạn cần tạo một cấu trúc phát triển cục bộ và lấy thông tin xác thực hoạt động để thiết lập các 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 và duy nhất, có thể chỉ định cho các thiết bị thông tin đăng nhập nút phù hợp.

Bạn có thể thông báo cho Home Mobile SDK rằng bạn muốn uỷ quyền các thiết bị cho mạng lưới của riêng mình bằng cách truyề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 một Trình chạy hoạt động vào fragment Trang chủ và sử dụng các đối tượng LiveData để quản lý luồng API.

Bước 1: Tạo một 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ế chú thích // CODELAB: commissionDeviceLauncher definition bằng đoạn mã sau để đăng ký và xử lý kết quả của Hoạt động thiết lập:
    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 thao tác thiết bị thiết lập

Trong bước này, người dùng kích hoạt thao tác "Commission Device" (Thiết lập thiết bị) bằng cách nhấp vào nút "+" ở dưới cùng bên phải của màn hình chính. Sau đó, một lệnh 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 trong HomeScreen.kt trong thư mục java/com/google/homesampleapp/screens/home.
  2. Thay thế chú thích // CODELAB: commissionDevice bằng commissionDeviceRequest sau đây. setCommissioningService liên kết AppCommissioningService với một thực thể CommissioningService, được trả về trong một hàm callback. Khi bạn truyền một dịch vụ tuỳ chỉnh, Home Mobile SDK sẽ uỷ quyền cho các thiết bị vào cấu trúc cục bộ của Android trước, sau đó gửi tải trọng tham gia trở lại 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ụ cấp phép

Trong hàm commissionDevice(), chúng tôi đã yêu cầu nhận một CommissioningService từ CommissioningClient API. Trong quy trình này, CommissioningClient API sẽ uỷ quyền cho các thiết bị vào Local Android fabric trước, 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);
  }
}

Giờ đây, chúng ta phải kế thừa CommissioningService.Callback và cung cấp chức năng cần thiết để thiết lập các thiết bị cho ứng dụng mẫu. 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. Sau đây là thông tin tổng quan ngắn gọn 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 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 hoạt động nhập để hỗ trợ Hiltcoroutine Kotlin.

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

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

Giờ là lúc thêm các hàm khởi động.

Bước 2: Ghi đè onCommissioningRequested

Để đưa các thiết bị vào cấu trúc 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 ra CommissioningRequestMetadata. Thay thế nhận xét // CODELAB: onCommissioningRequested() để bắt đầu coroutine serviceScope và nhận deviceId.
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. Thực hiện quy trình thiết lập. Đố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. Sử dụng commissioningServiceDelegate để thông báo cho Dịch vụ Google Play rằng quá trình thiết lập đã 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, khi tất cả mã cần thiết đã được đặt vào vị trí để đưa vào cấu trúc cục bộ, đã đến lúc kiểm thử mã này. Chọn thiết bị Android của bạn rồi 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 tất các bước để thiết lập thiết bị.

Khi quá trình thiết lập hoàn tất, thiết bị của bạn sẽ tham gia vào hai cấu trúc: cấu trúc Android cục bộ và cấu trúc phát triển cục bộ. Mỗi cấu trúc liên kết có một bộ thông tin đăng nhập riêng và một mã nhận dạng cấu trúc liên kết duy nhất gồm 64 bit.

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

Việc thiết lập vào một mạng phát triển cho phép bạn sử dụng các thư viện trong kho lưu trữ Matter (connectedhomeip) để điều khiển các thiết bị từ ứ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ụm thiết bị và gửi lệnh. Để tìm hiểu thêm, hãy mở ClustersHelper trong java/clusters. 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 thiết lập một thiết bị, tải trọng được trả về trong CommissioningResult sẽ được thêm vào DataStore. Quyền này cho phép ứng dụng của chúng tôi truy cập vào thông tin thiết bị mà chúng tôi có thể dùng để gửi lệnh.

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

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

  1. Chuyển đến DeviceViewModel trong java/screens/device.
  2. Tìm hàm updateDeviceStateOn.
  3. Thay thế chú thích // 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ị.

7. Chia sẻ thiết bị với các hệ sinh thái khác

Việc chia sẻ thiết bị được gọi là quy trình nhiều quản trị viên trong quy cách Matter.

Trong các bước trước, chúng ta đã biết rằng Home Mobile SDK cho phép thiết lập các thiết bị cho Local Android fabric và cả một fabric phát triển cho ứng dụng mẫu. Đây là một ví dụ về quy trình nhiều quản trị viên, trong đó các thiết bị có thể được thiết lập cho nhiều fabric.

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

Home Mobile SDK cung cấp chức năng này trong ShareDeviceRequest API, cho phép bạn:

  1. Mở cửa sổ thiết lập 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ị được đưa vào hoạt động trong một hệ thống khác.
  3. Điều khiển thiết bị của bạn bằng 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 Home Mobile SDK để chia sẻ thiết bị.

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

Tương tự như Trình chạy hoạt động thiết lập mà chúng tôi đã tạo khi thiết lập cho một cấu trúc phát triển, chúng tôi đã tạo Trình chạy hoạt động chia sẻ 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ế chú thích // CODELAB: shareDeviceLauncher definition bằng mã sau để đăng ký và xử lý kết quả .shareDevice() của Hoạt động:
    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 thao tác chia sẻ thiết bị

Trong bước này, người dùng kích hoạt thao tác "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 đó, một lệnh gọi sẽ được thực hiện đến deviceViewModel để mở Cửa sổ ghép nối cho tính năng 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ẽ thông báo cho giao diện người dùng về việc này. 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 sẽ thực hiện lệnh gọi sau:

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

Bước 3: Gọi API

Giờ là lúc bắt đầu một tác vụ chia sẻ 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ận dạng nhà cung cấp, Mã nhận dạng sản phẩm và deviceType. Trong ví dụ này, chúng ta sẽ 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. Gọi .getCommissioningClient(), chỉ lần này, hã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 sẽ được dùng để chạy Hoạt động chia sẻ 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 sẽ được gọi trên shareDeviceLauncher để khởi chạy hoạt động GPS cho tính năng 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 cài đặt một nền tảng khác trên thiết bị Android của mình. 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 bên uỷ thác mục tiêu.

Sau khi cài đặt trình thiết lập đích 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 đích của uỷ viên được gắn nhãn GHSAFM-TC.

Giờ đây, các thiết bị của bạn có thể tham gia vào 3 mạng lưới:

  1. Local Android fabric.
  2. Nền tảng phát triển của bạn (ứng dụng này).
  3. Đây là nhóm thứ ba 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 và tìm hiểu cách thiết lập và chia sẻ thiết bị bằng Home Mobile SDK.

Nếu bạn gặp vấn đề 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ề cách sử dụng ứng dụng mẫu hoặc phát hiện thấy lỗi mã, bạn có thể gửi vấn đề đến Trình theo dõi sự cố trong kho lưu trữ GitHub:

Để nhận hướng dẫn chính thức của 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 được sự hỗ trợ kỹ thuật từ cộng đồng, hãy sử dụng thẻ google-smart-home trên Stack Overflow: