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 thống 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ị 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) giới thiệu API Home Mobile SDK, cho phép người dùng hoa hồng 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 các khái niệm chính của Matter, cũng như công cụ gỡ lỗi và khắc phục sự cố tương tác với 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 xuống cho ứng dụng mẫu và tìm hiểu cách sử dụng Home Mobile SDK để đặt hoa hồng và chia sẻ thiết bị. Bạn cũng sẽ tìm hiểu cách sử dụng thư viện vận hành và thư viện Cụm trong 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 các API Home Mobile SDK sau đây:

Bạn cũng sẽ tìm hiểu thêm về việc vận hành các khái niệm, kết cấu 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, chẳng hạn như thiết bị Google Nest Hub (Thế hệ 2) để có thể đặt hoa hồng và kiểm soát 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, 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.

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 khi thực hiện từng bước, bạn có thể tải mã nguồn đã hoàn chỉnh xuống 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 trên 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à đặt hoa hồng cho thiết bị. Tuy nhiên, trước khi bạn bắt đầu, bạn nên biết các phần phụ thuộc sau. 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 chú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.

Đố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/commissioning/AppCommissioningService: cho phép bạn đưa thiết bị đến cơ chế phát triển
  • java/screens/home/HomeScreenjava/screens/home/HomeViewModel.kt: bao gồm chức năng vận hành SDK Home dành cho thiết bị di động
  • java/screens/device/DeviceScreenjava/screens/device/DeviceViewModel: bao gồm các lệnh gọi API Chia sẻ thiết bị

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

Việc 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 chúng giao tiếp với nhau trong cùng một kết cấu, 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, ứng dụng mẫu này là Ứng dụng mẫu của Google Home cho Matter.

Bạn cần hiểu rõ các khái niệm sau đây về việc vận hành Matter:

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

Để đặt hoa hồng cho một thiết bị, bạn cần phải sử dụng API CommissioningClient. Lệnh gọi đến .commissionDevice() trả về 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ẽ tìm hiểu về mã tối thiểu cần có để đưa thiết bị đến giao diện của Google.

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

Để xử lý IntentSender qua CommissioningClient, bạn có thể sử 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: Hàm uỷ quyền

Dưới đây là một ví dụ cơ bản sử dụng API CommissioningClient để đặt hoa hồng một thiết bị cho kết cấu của Google.

  1. Quy trình vận hành 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 cấu trúc Android cục bộ.
  2. Matter là điểm truy cập cho SDK dành cho thiết bị di động dành cho gia đình. Trong lệnh gọi tiếp theo, .getCommissioningClient nhận được CommissioningClient của 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ị nhận 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 ứng dụng cho các thành phần khác.

Tiếp theo, bạn sẽ tìm hiểu cách đưa một thiết bị vào một kết cấu 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 của Google Home cho Matter.

4. Phí hoa hồng đối với một cấu trúc phát triển

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

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

Người quản lý miền quản trị (ADM) xác định thông tin xác thực kết nố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ỉ (CA) gốc đáng tin cậy. Khi bạn đặt thiết bị cho cấu trúc Android cục bộ, mọi thiết bị sẽ bao gồm cùng một bộ thông tin đăng nhập và cùng một bộ CA.

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

Để hoa hồng cho cấu trúc Android cục bộ, chúng ta đã 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 một cấu trúc phát triển cục bộ và lấy thông tin đăng nhập hoạt động để hoa hồng cho thiết bị. Trong trường hợp này, ứng dụng của bạn trở thành một hệ sinh thái độc lập, duy nhất chỉ định thông tin xác thực nút thích hợp cho các thiết bị.

Bạn có thể thông báo cho Home Mobile SDK biết rằng bạn muốn trả phí hoa hồng thiết bị cho 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/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 thử nghiệm:
    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 cho thiết bị

Trong bước này, người dùng kích hoạt hành động "Thiết bị phí hoa hồng" 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 đó, 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 ở trong HomeScreen.kt trong thư mục java/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, được trả về trong một hàm callback. Khi bạn chuyển một dịch vụ tuỳ chỉnh, trước tiên, Home Mobile SDK sẽ đặt thiết bị hoa hồng cho thiết bị Android cục bộ, sau đó gửi tải trọng làm quen với ứng dụng trở lại AppCommissioningService.
    val commissionDeviceRequest =
        CommissioningRequest.builder()
            .setCommissioningService(ComponentName(
                context, AppCommissioningService::class.java))
            .build()
    
  3. Gọi .getCommissioningClient(), rồi 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 sẽ đặt phí hoa hồng thiết bị cho cấu trúc Android cục bộ, sau đó trả về một lệnh gọi lại có chứa đố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 để hoa hồng 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: Tìm hiểu 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. 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 mục nhập sau đây cho Home Mobile 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 cũng bao gồm các thư viện thuộc Kho lưu trữ Matter (connectedhomeip):

import com.google.home_sample_app_for_matter.chip.ChipClient

Cuối cùng, dịch vụ này bao gồm các lệnh 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ố nội dung, bao gồm cả commissioningServiceDelegate mà chúng ta sẽ sử dụng để cho Dịch vụ Google Play biết thời điểm quá trình vận hành hoàn tất.

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

Đã đến lúc thêm các hàm vận hành.

Bước 2: Ghi đè onCommissioningRequested

Để đặt thiết bị cho kết cấu 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() để khởi động coroutine serviceScope và tải deviceId.
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. Thực hiện vận hành. Đối với bước này, chúng ta có thể chuyển thông tin thiết bị được trả về trong đối tượng khoáingRequestMetadata. ChipClient sử dụng thông tin siêu dữ liệu này để tạo kênh bảo mật giữa GHSA cho ứng dụng 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 để cho Dịch vụ Google Play biết rằng quá trình vận hành đã hoàn tất. Trong .sendCommissioningComplete(), hãy chuyể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ả các đoạn mã cần thiết đã sẵn sàng để đặt hàng cho vải cục bộ của chúng ta, đã đến lúc kiểm thử mã. 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 thành các bước để phí hoa hồng thiết bị.

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

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

Việc chuyển sang một cấu trúc phát triển cho phép bạn sử dụng các thư viện từ kho lưu trữ Matter (connectedhomeip) để điều khiển các thiết bị qua ứ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 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ể sử 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 đặt phí hoa hồng cho một thiết bị, tải trọng được trả về trong CommissioningResult sẽ được thêm vào DataStore. Thao tá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 theo chuẩn Matter hoạt động theo sự kiện. Khi ngăn xếp Matter được khởi động, các dịch vụ Cụm sẽ theo dõi tin nhắn đến. Sau khi uỷ quyền cho một thiết bị, ứng dụng Matter sẽ gửi các lệnh qua kênh vận hành bảo mật đã thiết lập trong quá trình vận hành thiết bị.

Trên thiết bị, các 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 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. Chuyển tới DeviceViewModel trong java/screens/device.
  2. Tìm hàm updateDeviceStateOn.
  3. Hãy 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 các bản cập nhật. Từ Màn hình chính, hãy bật và tắt thiết bị của bạn.

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à luồng 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 đã tìm hiểu rằng SDK dành cho thiết bị di động dành cho gia đình giúp bạn có thể đặt trước các thiết bị cho cấu trúc Android cục bộ cũng như cấu trúc 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 uỷ quyền cho nhiều chế độ xem.

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

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

  1. Mở một cửa sổ chạy thử tạm thời cho các thiết bị.
  2. Thay đổi trạng thái của thiết bị để có thể chuyển thiết bị sang một chế độ cài đặt 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 bước tiếp theo, bạn sẽ dùng Home Mobile SDK để 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 được uỷ quyền mà chúng ta đã tạo khi uỷ quyền cho kết cấu phát triển, chúng ta đã tạo một 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/screens/device/.
  2. Thay thế nhận xét // CODELAB: shareDeviceLauncher definition bằng mã sau để đăng ký và xử lý kết quả 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 thao tác chia sẻ thiết bị

Ở bước này, người dùng kích hoạt hành động "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 nhằm chia sẻ thiết bị.

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

Sau khi mở thành công cửa sổ phân tách, deviceViewModel sẽ truyền đạt thông tin đó với 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 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 tác vụ chia sẻ thiết bị.

  1. Mở DeviceScreen.kt trong thư mục java/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 CommissioningWindowparameter.
        .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() sẽ 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. Sau khi thành công, launch được gọi vào shareDeviceLauncher để chạy hoạt động GPS nhằm 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ị theo chuẩn Matter với các hệ sinh thái khác, bạn sẽ 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ể sử dụng làm ủy 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 của mình. Ứng dụng cho cố vấn mục tiêu được gắn nhãn GHSAFM-TC.

Giờ đây, thiết bị của bạn có thể tham gia vào 3 chế độ cài đặt:

  1. Kết cấu Android cục bộ.
  2. Bố cục phát triển của bạn (ứng dụng này).
  3. Kết nố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 cũng như học cách đặt hoa hồng và chia sẻ thiết bị bằng Home Mobile SDK.

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

Nếu có thắc mắc về việc sử dụng ứng dụng mẫu hoặc phát hiện 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 truy cập vào Diễn đàn dành cho 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: