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:
- Xem Hướng dẫn về Ứng dụng mẫu Google Home cho Matter.
- Tải Android Studio xuống.
- Có sẵn một thiết bị Android O (8.1, cấp độ API 27) trở lên để kiểm thử. Để đảm bảo thiết bị của bạn có phiên bản hỗ trợ Matter mới nhất, hãy xem hướng dẫn Xác minh các mô-đun và dịch vụ Matter.
- Sử dụng thiết bị Matter có chức năng Bật/Tắt. Để giảm thiểu các vấn đề về môi trường, bạn nên sử dụng Thiết bị ảo Matter (MVD) để bắt đầu. Nếu bạn gặp phải vấn đề, thì việc điều tra sẽ dễ dàng hơn nhiều nếu ứng dụng mẫu được dùng cho MVD. Dưới đây là một số lựa chọn khác:
- Tạo một Thiết bị ảo Matter bằng ứng dụng
rootnode_dimmablelight_bCwGYSDpoe. Khi bạn Tạo một chế độ tích hợp Matter trong Home Developer Console, hãy sử dụng0xFFF1làm Mã nhà cung cấp và0x8000làm Mã sản phẩm. - Tạo một Thiết bị Espressif bằng
all-clusters-app. Khi bạn Tạo một chế độ tích hợp Matter trong Home Developer Console, hãy sử dụng0xFFF1làm Mã nhà cung cấp và0x8001làm Mã sản phẩm.
- Tạo một Thiết bị ảo Matter bằng ứng dụng
- Tìm hiểu cách Thiết lập Dịch vụ Google Play.
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
- Home Mobile SDK
- Thư viện Matter SDK.
- Jetpack Compose. Giao diện người dùng được triển khai hoàn toàn bằng Compose.
- Material Design. Để tìm hiểu thêm, hãy tham khảo MDC-103 Android: Tuỳ chỉnh giao diện Material với màu sắc, độ cao và kiểu chữ (Kotlin) và Material Theme Builder.
- Proto DataStore, dùng để duy trì dữ liệu ứng dụng. Datastore Repositories và Serializers được lưu trữ trong
java/data, bao gồm cả các giản đồ cho thiết bị và lựa chọn ưu tiên của người dùng. Để tìm hiểu thêm về DataStore, hãy tham khảo phần Làm việc với Proto DataStore. - Hilt để duy trì dữ liệu và hỗ trợ việc chèn phần phụ thuộc.
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ểnjava/com/google/homesampleapp/screens/home/HomeScreenvàjava/com/google/homesampleapp/screens/home/HomeViewModel.kt: bao gồm chức năng thiết lập Home Mobile SDKjava/com/google/homesampleapp/screens/device/DeviceScreenvàjava/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.
- 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. Matterlà điểm truy cập cho Home Mobile SDK. Trong lệnh gọi tiếp theo,.getCommissioningClientnhận CommissioningClient theothis(Hoạt động)..commissionDevice()chấp nhậnCommissioningRequest.- Cuối cùng,
.addOnSuccessListenerđược gọi để xử lýCommissioningResultvà 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.
- Mở
HomeScreentrong thư mụcjava/com/google/homesampleapp/screens/home/. - Thay thế chú thích
// CODELAB: commissionDeviceLauncher definitionbằ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
- Vẫn trong
HomeScreen.kttrong thư mụcjava/com/google/homesampleapp/screens/home. - Thay thế chú thích
// CODELAB: commissionDevicebằngcommissionDeviceRequestsau đây.setCommissioningServiceliên kếtAppCommissioningServicevớ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ạiAppCommissioningService.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build() - Gọi
.getCommissioningClient(), sau đó gọi.commissionDevice().
Matter.getCommissioningClient(context)
.commissionDevice(commissionDeviceRequest)
Để hoàn tất hàm commissionDevice, hãy thêm addOnSuccessListener và addOnFailureListener:
.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ợ Hilt và coroutine 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:
- Mở
AppCommissioningServicetrongjava/commissioning. - Tìm hàm
onCommissioningRequested(). Chúng tôi đã cung cấp một thông điệp nhật ký in raCommissioningRequestMetadata. Thay thế nhận xét// CODELAB: onCommissioningRequested()để bắt đầu coroutineserviceScopevà nhậndeviceId.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId() - 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.
ChipClientsử 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 } - 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ị.
- Chuyển đến
DeviceViewModeltrongjava/screens/device. - Tìm hàm
updateDeviceStateOn. - Thay thế chú thích
// CODELAB: togglebằng mã để gọiclustersHelper, 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:
- Mở cửa sổ thiết lập tạm thời cho các thiết bị.
- 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.
- Đ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.
- Mở
DeviceScreentrong thư mụcjava/com/google/homesampleapp/screens/device/. - Thay thế chú thích
// CODELAB: shareDeviceLauncher definitionbằ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ị.
- Mở
DeviceScreen.kttrong thư mụcjava/com/google/homesampleapp/screens/device/. - Tìm hàm
shareDevice(). Thay thế nhận xét// CODELAB: shareDevicebằngShareDeviceRequest.DeviceDescriptorcung 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") - Đặt CommissioningWindow và cá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() - 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.
- Để hoàn tất hàm
shareDevice, hãy thêmaddOnSuccessListenervàaddOnFailureListener. Khi thành công,launchsẽ được gọi trênshareDeviceLauncherđể 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:
- Local Android fabric.
- Nền tảng phát triển của bạn (ứng dụng này).
- Đâ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: