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:
- Xem Hướng dẫn về ứng dụng mẫu trên Google Home dành cho Matter.
- Tải Android Studio xuống.
- Có thiết bị Android O (8.1, API cấp 27) trở lên để kiểm thử. Để đảm bảo rằng thiết bị của bạn có tính năng hỗ trợ mới nhất của Matter, hãy xem hướng dẫn Xác minh các mô-đun và dịch vụ của Matter.
- Dùng thiết bị Matter có tính 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 mờ (MVD) để bắt đầu. Nếu từng gặp vấn đề, bạn có thể dễ dàng điều tra xem ứng dụng mẫu có được dùng để xử lý MVD hay không. Dưới đây là một số lựa chọn khác:
- Tạo thiết bị ảo Matter bằng ứng dụng
rootnode_dimmablelight_bCwGYSDpoe
. Khi bạn Tạo chế độ tích hợp Matter trong Home Console, hãy dùng0xFFF1
làm Mã nhà cung cấp và0x8000
làm Mã sản phẩm. - Tạo thiết bị Espressif bằng
all-clusters-app
. Khi bạn Tạo chế độ tích hợp Matter trong Home Console, hãy sử dụng0xFFF1
làm Mã nhà cung cấp và0x8001
làm Mã sản phẩm.
- Tạo 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, 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
- SDK Home dành cho thiết bị di động
- Thư viện SDK cơ bản.
- Jetpack Compose. Giao diện người dùng được triển khai đầy đủ bằng Compose.
- Material Design. Để tìm hiểu thêm, hãy tham khảo nội dung MDC-103 Android: Tuỳ chỉnh giao diện Material với màu sắc, độ cao và loại (Kotlin) và Trình tạo giao diện Material.
- DataStore Proto, dùng để lưu trữ dữ liệu ứng dụng. Các kho lưu trữ và trình chuyển đổi tuần tự của Datastore được lưu trữ trong
java/data
, bao gồm cả giản đồ dành 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 bài viết Làm việc với DataStore Proto. - Hilt để lưu trữ dữ liệu và hỗ trợ tính năng 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.
Đố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ểnjava/screens/home/HomeScreen
vàjava/screens/home/HomeViewModel.kt
: bao gồm chức năng vận hành SDK Home dành cho thiết bị di độngjava/screens/device/DeviceScreen
vàjava/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.
- 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ộ. 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ủathis
(Hoạt động)..commissionDevice()
chấp nhậnCommissioningRequest
.- 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.
- Mở
HomeScreen
trong thư mụcjava/screens/home/
. - 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
- Vẫn ở trong
HomeScreen.kt
trong thư mụcjava/screens/home/
. - Thay thế nhận xét
// CODELAB: commissionDevice
bằngcommissionDeviceRequest
sau.setCommissioningService
liên kếtAppCommissioningService
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ạiAppCommissioningService
.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build()
- Gọi
.getCommissioningClient()
, rồi 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ụ 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ợ 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ố 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:
- Mở
AppCommissioningService
trongjava/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()
để khởi động coroutineserviceScope
và tảideviceId
.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- 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 }
- 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ị.
- Chuyển tới
DeviceViewModel
trongjava/screens/device
. - Tìm hàm
updateDeviceStateOn
. - Hãy thay thế chú thích
// CODELAB: toggle
bằ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 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:
- Mở một cửa sổ chạy thử tạm thời cho các thiết bị.
- 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.
- 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.
- Mở
DeviceScreen
trong thư mụcjava/screens/device/
. - 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ị.
- Mở
DeviceScreen.kt
trong thư mụcjava/screens/device/
. - Tìm hàm
shareDevice()
. Thay thế nhận xét// CODELAB: shareDevice
bằngShareDeviceRequest
.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")
- Đặt CommissioningWindow và parameter.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build()
- 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.
- Để hoàn tất hàm
shareDevice
, hãy thêmaddOnSuccessListener
vàaddOnFailureListener
. Sau khi thành công,launch
được gọi vàoshareDeviceLauncher
để 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:
- Kết cấu Android cục bộ.
- Bố cục phát triển của bạn (ứng dụng này).
- 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: