1. Chào mừng
Được xây dựng với mục tiêu hợp nhất các tiêu chuẩn IoT, Matter kết nối các thiết bị nhà thông minh trên nhiều hệ sinh thái như Google Home, Zigbee, Bluetooth Mesh, Z-Wave và nhiều hệ sinh thái khác.
Thiết bị di động là điểm tương tác trung tâm với các thiết bị nhà thông minh. Nếu bạn muốn xây dựng ứng dụng Android của riêng mình để hỗ trợ các thiết bị theo chuẩn Matter, thì chúng tôi có thể giúp bạn bắt đầu nhanh chóng.
Ứng dụng mẫu của Google Home cho Matter (GHSA cho Matter) giới thiệu các API SDK dành cho thiết bị di động Home, cho phép người dùng kích hoạt và chia sẻ thiết bị. Bạn cũng có thể dùng ứng dụng mẫu làm công cụ học tập để hiểu rõ hơn về các khái niệm chính của Matter, đồng thời là một công cụ để gỡ lỗi và khắc phục sự cố tương tác với các thiết bị theo chuẩn Matter.
Bạn sẽ thực hiện
Trong lớp học lập trình này, bạn sẽ tải mã nguồn cho ứng dụng mẫu xuống, đồng thời tìm hiểu cách sử dụng Home Mobile SDK để chạy thử nghiệm và chia sẻ thiết bị. Bạn cũng sẽ tìm hiểu cách sử dụng các thư viện uỷ quyền và Cụm trong Kho lưu trữ Matt (connectedhomeip
).
Sau khi bạn tải ứng dụng mẫu xuống, chúng tôi sẽ xem xét mã nguồn trong Android Studio và triển khai các API SDK dành cho thiết bị di động Home sau đây:
Bạn cũng sẽ tìm hiểu thêm về các khái niệm lắp đặt thiết bị, các loại vải Matter và cách điều khiển các thiết bị Matter.
Bạn cần có
Trước khi bắt đầu, hãy nhớ hoàn thành các bước sau:
- Xem Hướng dẫn về ứng dụng mẫu của Google Home cho Matter.
- Tải Android Studio xuống.
- Có thiết bị chạy 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ợ Matter mới nhất, hãy xem Mô-đun Xác minh vấn đề và Hướng dẫn về các dịch vụ.
- Sử dụng thiết bị theo chuẩn 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 sẽ dễ dàng kiểm tra xem ứng dụng mẫu có được dùng để chống lại MVD hay không. Dưới đây là một vài lựa chọn khác:
- Tạo thiết bị ảo theo chuẩn Matter bằng ứng dụng
rootnode_dimmablelight_bCwGYSDpoe
. Khi bạn Tạo chế độ tích hợp Matter trong Bảng điều khiển dành cho nhà phát triển trên Home, hãy sử 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 Developer 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 theo chuẩn Matter bằng ứng dụng
- Xem cách Thiết lập Dịch vụ Google Play.
Bạn không cần một thiết bị trung tâm, chẳng hạn như Google Nest Hub (Thế hệ 2), để vận hành và điều khiển các thiết bị bằng ứng dụng mẫu.
2. Bắt đầu thiết lập
Ứng dụng khởi đầu của lớp học lập trình này nằm trong nhánh codelab
. Để bắt đầu làm việc với mã nguồn của lớp học lập trình này, bạn có thể tải tệp ZIP xuống.
Bạn sẽ dùng tệp ZIP codelab
này để tạo một mẫu hoạt động.
Các phiên bản của lớp học lập trình
Nhánh codelab
được gắn thẻ với bản phát hành 2.0.0 của ứng dụng mẫu. Để so sánh các bản cập nhật trong khi thực hiện từng bước, bạn có thể tải mã nguồn đã hoàn tất cho bản phát hành này.
Nếu bạn muốn sao chép kho lưu trữ GitHub, hãy làm theo hướng dẫn trong phần README ứng dụng mẫu.
Phần phụ thuộc
Chúng tôi sẽ hướng dẫn bạn về mã nguồn cần thiết để chia sẻ và cài đặt thiết bị. Tuy nhiên, bạn nên nắm rõ các phần phụ thuộc sau đây trước khi bắt đầu. Xin lưu ý rằng bạn đã khai báo các phần phụ thuộc này trong tệp libs.versions.toml và cách sử dụng sẽ được chỉ định trong tệp build.gradle.kts
- SDK dành cho thiết bị di động Home
- Thư viện SDK Matt.
- 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 MDC-103 Android: Tuỳ chỉnh giao diện Material bằng màu sắc, độ cao và kiểu (Kotlin) và Material Theme Builder (Trình tạo giao diện Material).
- DataStore Proto, dùng để duy trì dữ liệu ứng dụng. 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ả 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 bài viết Làm việc với DataStore Proto. - Hilt để lưu trữ dữ liệu và hỗ trợ chèn phần phụ thuộc.
Mã nguồn
Chúng tôi đã tạo giao diện người dùng và hầu hết chức năng cho bạn.
Đối với lớp học lập trình này, chúng ta sẽ thêm chức năng Matter vào các tệp sau:
java/com/google/homesampleapp/commissioning/AppCommissioningService
: cho phép bạn đưa thiết bị vào kết cấu phát triểnjava/com/google/homesampleapp/screens/home/HomeScreen
vàjava/com/google/homesampleapp/screens/home/HomeViewModel.kt
: có chức năng uỷ quyền SDK Home dành cho thiết bị di độngjava/com/google/homesampleapp/screens/device/DeviceScreen
vàjava/com/google/homesampleapp/screens/device/DeviceViewModel
: bao gồm các lệnh gọi Share Device API
Mỗi tệp có nhận xét bằng khối mã mà bạn sẽ sửa đổi, ví dụ:
// CODELAB: add commissioningFunction()
Điều này giúp bạn nhanh chóng tìm thấy phần tương ứng trong lớp học lập trình.
3. Phí hoa hồng cho Google
Trước khi bạn có thể điều khiển các thiết bị và cho phép các thiết bị đó giao tiếp với nhau trong cùng một loại vải, các thiết bị đó cần phải được một Uỷ viên uỷ quyền, trong trường hợp này là ứng dụng mẫu này, Ứng dụng mẫu Google Home for Matter.
Bạn cần nắm được các khái niệm sau đây về quy trình uỷ quyền cho vấn đề:
- Vải cho phép các thiết bị giao tiếp với nhau.
- Các vải duy trì một bộ thông tin đăng nhập riêng biệt dùng chung.
- Các hệ sinh thái chịu trách nhiệm phát hành chứng chỉ gốc đáng tin cậy, gán mã nhận dạng vải và chỉ định mã nút duy nhất. Hệ sinh thái là dịch vụ phụ trợ của một cố vấn, chẳng hạn như Home Graph cho hệ sinh thái Google Home.
- Các thiết bị có thể được chỉ định cho nhiều loại vải (tính năng nhiều quản trị viên).
Để kích hoạt phí hoa hồng cho một thiết bị, bạn cần sử dụng CommissioningClient API. Lệnh gọi đến .commissionDevice()
sẽ trả về một IntentSender, giúp khởi chạy hoạt động thích hợp trong Dịch vụ Google Play:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
Trong các phần tiếp theo, chúng ta sẽ đề cập đến đoạn mã tối thiểu cần có để vận hành các thiết bị cho nền tảng Google.
Bước 1: Trình chạy hoạt động
Để xử lý IntentSender
qua CommissioningClient
, bạn có thể dùng ActivityResultLaunch:
val commissioningLauncher = registerForActivityResult( StartIntentSenderForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { Timber.d(TAG, "Commissioning succeeded.") } else { Timber.d(TAG, "Commissioning failed. " + result.resultCode) } }
Bước 2: Chức năng uỷ quyền
Dưới đây là một ví dụ cơ bản sử dụng API CommissioningClient để lắp đặt một thiết bị vào vải của Google.
- Quá trình uỷ quyền bắt đầu bằng hàm
commissionDevice()
. Trước tiên,CommissioningRequest
được xác định. Với cấu hình mặc định này, các thiết bị chỉ được uỷ quyền cho nền tảng Android cục bộ. Matter
là điểm truy cập cho SDK dành cho thiết bị di động Home. Trong lệnh gọi tiếp theo,.getCommissioningClient
sẽ nhận được một CommissioningClient thuộcthis
(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ị hoa hồng trên Dịch vụ Google Play (GPS).
private fun commissionDevice() { val request: CommissioningRequest = CommissioningRequest.builder().build() Matter.getCommissioningClient(this) .commissionDevice(request) .addOnSuccessListener { result -> commissioningLauncher.launch(IntentSenderRequest.Builder(result).build()) } }
Bạn có thể tận dụng Local Android Fabric thông qua các chế độ cài đặt Android để đơn giản hoá quy trình vận hành thiết bị của mình với các nền tảng khác.
Tiếp theo, bạn sẽ tìm hiểu cách lắp ráp một thiết bị vào vải phát triển.
Để biết thông tin tổng quan về giao diện người dùng trong quá trình vận hành, hãy tham khảo Hướng dẫn về ứng dụng mẫu Google Home cho Matter.
4. uỷ quyền cho nền tảng phát triển
Bạn có thể đặt thiết bị cho nhiều loại vải. Để quản lý các ghép nối đáng tin cậy, các thiết bị lưu trữ một FabricTable
chứa nhiều thành viên FabricInfo
, ví dụ:
- Nhận dạng vải
- Mã nút do vải gán cho thiết bị
- Mã nhà cung cấp
- Mã nhận dạng vải
- Thông tin xác thực hoạt động của thiết bị
Trình quản lý miền quản trị (ADM) xác định thông tin xác thực vải. Trong trường hợp trước, Dịch vụ Google Play là hệ sinh thái đóng vai trò là một tổ chức phát hành chứng chỉ gốc (CA) đáng tin cậy. Khi bạn đặt phí cho thiết bị vào vải Android cục bộ, mọi thiết bị đều bao gồm cùng một bộ thông tin xác thực vải và cùng một bộ CA.
Dịch vụ uỷ quyền tuỳ chỉnh
Để triển khai cho vải Android cục bộ, chúng tôi đã sử dụng các tham số mặc định để tạo CommissioningRequest
trong API CommissioningClient:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Nếu muốn điều khiển và quản lý thiết bị mới từ ứng dụng của mình, bạn cần tạo nền tảng phát triển cục bộ và lấy thông tin đăng nhập hoạt động để ủy quyền cho thiết bị. Trong trường hợp này, ứng dụng của bạn sẽ trở thành một hệ sinh thái độc lập, duy nhất giúp chỉ định thông tin đăng nhập nút thích hợp cho thiết bị.
Bạn có thể thông báo cho Home Mobile SDK biết rằng bạn muốn tích hợp thiết bị vào kết cấu của riêng mình bằng cách chuyển một dịch vụ tuỳ chỉnh đến CommissioningRequest:
class CommissioningRequest { static CommissioningRequest.Builder builder(); class Builder { Builder setCommissioningService(@Nullable ComponentName commissioningService); CommissioningRequest build(); } }
Trong các bước tiếp theo, chúng ta sẽ sửa đổi hàm commissionDevice()
để sử dụng một dịch vụ tuỳ chỉnh. Chúng ta cũng sẽ thêm Trình chạy hoạt động vào mảnh Trang chủ và sử dụng các đối tượng LiveData để quản lý luồng API.
Bước 1: Tạo Trình chạy hoạt động GPS
Trước tiên, hãy tạo một Trình chạy hoạt động để xử lý IntentSender
từ API CommissioningClient.
- Mở
HomeScreen
trong thư mụcjava/com/google/homesampleapp/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:val commissionDeviceLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartIntentSenderForResult() ) { result -> // Commission Device Step 5. // The Commission Device activity in GPS (step 4) has completed. val resultCode = result.resultCode if (resultCode == Activity.RESULT_OK) { Timber.d("CommissionDevice: Success") // We let the ViewModel know that GPS commissioning has completed successfully. // The ViewModel knows that we still need to capture the device name and will\ // update UI state to trigger the NewDeviceAlertDialog. homeViewModel.gpsCommissioningDeviceSucceeded(result) } else { homeViewModel.commissionDeviceFailed(resultCode) } }
Bước 2: Kích hoạt hành động phí hoa hồng trên thiết bị
Ở bước này, người dùng kích hoạt "Thiết bị tính phí hoa hồng" bằng cách nhấp vào dấu "+" ở góc dưới bên phải Màn hình chính. Sau đó, cuộc gọi sẽ được thực hiện đến commissionDevice()
.
val onCommissionDevice = { ... commissionDevice(activity!!.applicationContext, commissionDeviceLauncher) }
Bước 3: Gọi API
- Vẫn ở
HomeScreen.kt
trong thư mụcjava/com/google/homesampleapp/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
. Hàm này được trả về trong một hàm callback. Khi bạn truyền một dịch vụ tuỳ chỉnh, trước tiên, Home Mobile SDK sẽ đưa các thiết bị vào kết cấu cục bộ của Android, sau đó gửi lại tải trọng quy trình tích hợp vềAppCommissioningService
.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build()
- 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ụ uỷ quyền
Trong hàm commissionDevice()
, chúng ta đã yêu cầu lấy một CommissioningService từ API CommissioningClient. Trong quy trình này, trước tiên, API CommissioningClient gửi đơn đặt hàng cho các cấu trúc Android cục bộ, sau đó trả về một lệnh gọi lại bao gồm đối tượng CommissioningRequestMetadata:
public interface CommissioningService { interface Callback { void onCommissioningRequested(CommissioningRequestMetadata metadata); } }
Bây giờ, chúng ta phải kế thừa CommissioningService.Callback và cung cấp chức năng cần thiết để chạy các thiết bị cho ứng dụng mẫu của chúng ta. Dưới đây là ví dụ về cách triển khai CommissioningService cơ bản:
class MatterCommissioningService : Service(), CommissioningService.Callback { private val commissioningServiceDelegate = CommissioningService.Builder(this) .setCallback(this) .build() override fun onBind(intent: Intent) = commissioningServiceDelegate.asBinder() override fun onCommissioningRequested(metadata: CommissioningRequestMetadata) { // perform commissioning commissioningServiceDelegate .sendCommissioningComplete(CommissioningCompleteMetadata.builder().build()) } }
Bước 1: Khám phá AppCommissioningService tuỳ chỉnh
Để giúp bạn bắt đầu, chúng tôi đã xác định cấu trúc lớp cơ bản cho CommissioningService tuỳ chỉnh của mình. Dưới đây là tổng quan nhanh về chức năng của dịch vụ. Để theo dõi, hãy mở AppCommissioningService
trong java/commissioning
.
Chúng tôi đã thêm các nội dung nhập sau cho các API Home Mobile SDK:
import com.google.android.gms.home.matter.commissioning.CommissioningCompleteMetadata import com.google.android.gms.home.matter.commissioning.CommissioningRequestMetadata import com.google.android.gms.home.matter.commissioning.CommissioningService
AppCommissioningService
cũng bao gồm các thư viện trong Kho lưu trữ Matter (connectedhomeip
):
import com.google.homesampleapp.chip.ChipClient
Cuối cùng, dịch vụ này bao gồm các lệnh nhập để hỗ trợ Hilt và các coroutine Kotlin.
Tiếp theo, chúng ta sẽ tạo hàm khởi tạo và thiết lập một vài thứ, bao gồm cả commissioningServiceDelegate
. Chúng ta sẽ sử dụng hàm này để cho Dịch vụ Google Play biết khi quá trình vận hành hoàn tất.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Giờ là lúc thêm các chức năng uỷ quyền.
Bước 2: Ghi đè onCommissioningRequested
Để đưa thiết bị vào kết quả phát triển của ứng dụng, hãy hoàn tất các bước sau:
- 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ý inCommissioningRequestMetadata
. Thay thế nhận xét// CODELAB: onCommissioningRequested()
để bắt đầu coroutineserviceScope
và lấydeviceId
.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- Thực hiện việc uỷ quyền. Đối với bước này, chúng ta có thể truyền thông tin thiết bị được trả về trong đối tượng CommissioningRequestMetadata.
ChipClient
sử dụng thông tin siêu dữ liệu này để tạo một kênh bảo mật giữa ứng dụng GHSA cho Matter và thiết bị của bạn.try { Timber.d( "Commissioning: App fabric -> ChipClient.establishPaseConnection(): deviceId [${deviceId}]") chipClient.awaitEstablishPaseConnection( deviceId, metadata.networkLocation.ipAddress.hostAddress!!, metadata.networkLocation.port, metadata.passcode) Timber.d( "Commissioning: App fabric -> ChipClient.commissionDevice(): deviceId [${deviceId}]") chipClient.awaitCommissionDevice(deviceId, null) } catch (e: Exception) { Timber.e(e, "onCommissioningRequested() failed") // No way to determine whether this was ATTESTATION_FAILED or DEVICE_UNREACHABLE. commissioningServiceDelegate .sendCommissioningError(CommissioningError.OTHER) .addOnSuccessListener { Timber.d( "Commissioning: commissioningServiceDelegate.sendCommissioningError() succeeded") } .addOnFailureListener { e2 -> Timber.e(e2, "Commissioning: commissioningServiceDelegate.sendCommissioningError() failed") } return@launch }
- Hãy sử dụng
commissioningServiceDelegate
để cho Dịch vụ Google Play biết rằng quá trình uỷ quyền đã hoàn tất. Trong.sendCommissioningComplete()
, hãy truyền CommissioningCompleteMetadata.commissioningServiceDelegate .sendCommissioningComplete( CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build()) .addOnSuccessListener { Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded") } .addOnFailureListener { e -> Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed") } }
Chạy ứng dụng
Giờ đây, tất cả mã bắt buộc đã có sẵn để chạy cho vải cục bộ, đã đến lúc kiểm tra mã. Chọn thiết bị Android của bạn và chạy ứng dụng. Trên Màn hình chính, hãy nhấn vào Thêm thiết bị rồi hoàn thành các bước để kích hoạt thiết bị.
Khi quá trình uỷ quyền hoàn tất, thiết bị của bạn giờ đây sẽ tham gia vào hai loại vải: vải Android cục bộ và vải phát triển cục bộ. Mỗi loại vải có bộ thông tin đăng nhập riêng và một mã vải 64 bit duy nhất.
6. Điều khiển thiết bị
Việc uỷ quyền cho kết cấu phát triển cho phép bạn sử dụng các thư viện trong Kho lưu trữ Matt (connectedhomeip
) để điều khiển các thiết bị trong ứng dụng mẫu.
Chúng tôi đã tạo một số lớp trợ giúp để giúp bạn dễ dàng truy cập vào các cụm của thiết bị và gửi lệnh. Để tìm hiểu thêm, hãy mở ClustersHelper
trong java/clusters
. Trình trợ giúp Singleton này nhập các thư viện sau để truy cập vào thông tin thiết bị:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
Chúng ta có thể dùng lớp này để lấy cụm Bật/Tắt cho một thiết bị, sau đó gọi .toggle
:
suspend fun toggleDeviceStateOnOffCluster(deviceId: Long, endpoint: Int) { Timber.d("toggleDeviceStateOnOffCluster())") val connectedDevicePtr = try { chipClient.getConnectedDevicePointer(deviceId) } catch (e: IllegalStateException) { Timber.e("Can't get connectedDevicePointer.") return } return suspendCoroutine { continuation -> getOnOffClusterForDevice(connectedDevicePtr, endpoint) .toggle( object : ChipClusters.DefaultClusterCallback { override fun onSuccess() { continuation.resume(Unit) } override fun onError(ex: Exception) { Timber.e("readOnOffAttribute command failure: $ex") continuation.resumeWithException(ex) } }) } }
Bật/tắt thiết bị
Sau khi bạn chạy phí cho một thiết bị, tải trọng được trả về trong CommissioningResult được thêm vào DataStore. Việc này cho phép ứng dụng truy cập vào thông tin thiết bị mà chúng ta có thể dùng để gửi lệnh.
Các ứng dụng Matter được mô hình dựa trên sự kiện. Khi khởi động ngăn xếp Matter, dịch vụ cụm sẽ theo dõi các thông báo đến. Sau khi thiết bị được đưa vào hoạt động, ứng dụng theo chuẩn Matter sẽ gửi lệnh qua kênh vận hành bảo mật đã được thiết lập trong quá trình vận hành thiết bị.
Trên thiết bị, gói được xác thực, giải mã, sau đó được gửi đi bằng lệnh gọi lại. Các hàm gọi lại bao gồm EndpointId, ClusterId và AttributesId, có thể truy cập được từ attributePath
. Ví dụ: bạn có thể triển khai mã này trên thiết bị theo chuẩn Matter:
void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type, uint16_t size, uint8_t * value) { // handle callback ClusterId clusterId = attributePath.mClusterId; AttributeId attributeId = attributePath.mAttributeId; }
Trong các bước tiếp theo, bạn sẽ dùng SDK Matter và ClustersHelper
để bật/tắt một thiết bị.
- Đi đến
DeviceViewModel
trongjava/screens/device
. - Tìm hàm
updateDeviceStateOn
. - Thay thế nhận xét
// 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 nội dung cập nhật. Trên Màn hình chính, hãy bật và tắt thiết bị của bạn.
7. Dùng chung thiết bị với các hệ sinh thái khác
Việc dùng chung thiết bị được gọi là quy trình nhiều quản trị viên trong thông số kỹ thuật của Matter.
Trong các bước trước, chúng ta đã biết rằng Home Mobile SDK giúp bạn có thể đưa các thiết bị vào hệ thống Android cục bộ cũng như cho kết cấu phát triển cho ứng dụng mẫu. Đây là ví dụ về quy trình nhiều quản trị viên, trong đó các thiết bị có thể được ủy quyền cho nhiều loại vải.
Giờ đây, bạn có thể muốn chia sẻ thiết bị với nhiều loại vải hơn nữa, đặc biệt nếu đây là hộ gia đình mà mọi người có sở thích riêng về các ứng dụng và nền tảng.
SDK Home dành cho thiết bị di động cung cấp chức năng này trong API ShareDeviceRequest, cho phép bạn:
- Mở một cửa sổ vận hành 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ị đặt các thiết bị đó lên một loại vải 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 các bước tiếp theo, bạn sẽ sử dụng SDK Home dành cho thiết bị di động để chia sẻ thiết bị.
Bước 1: Tạo Trình chạy hoạt động GPS
Tương tự như Trình chạy hoạt động uỷ quyền mà chúng tôi đã tạo khi uỷ quyền phát triển mô hình phát triển, chúng ta đã tạo Trình chạy hoạt động chia sẻ trên thiết bị để xử lý IntentSender
từ API CommissioningClient.
- Mở
DeviceScreen
trong thư mụcjava/com/google/homesampleapp/screens/device/
. - Thay thế nhận xét
// CODELAB: shareDeviceLauncher definition
bằng mã sau để đăng ký và xử lý kết quả của Hoạt động.shareDevice()
:val shareDeviceLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartIntentSenderForResult() ) { result -> // Commission Device Step 5. // The Share Device activity in GPS (step 4) has completed. val resultCode = result.resultCode if (resultCode == Activity.RESULT_OK) { deviceViewModel.shareDeviceSucceeded() } else { deviceViewModel.shareDeviceFailed(resultCode) } }
Bước 2: Kích hoạt hành động chia sẻ thiết bị
Ở bước này, người dùng kích hoạt nút "Chia sẻ thiết bị" bằng cách nhấp vào nút "Chia sẻ" trên màn hình thiết bị. Sau đó, lệnh gọi được thực hiện đến deviceViewModel
để mở Cửa sổ ghép nối để chia sẻ thiết bị.
// Share Device button click. val onShareDevice: () -> Unit = remember { { deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId) } }
Sau khi mở thành công cửa sổ ghép nối, deviceViewModel
sẽ truyền thông tin này đến giao diện người dùng. Hoạt động giao tiếp giữa ViewModel
và giao diện người dùng được thực hiện thông qua các đối tượng StateFlow
.
// Communicate to the UI that the pairing window is open. // UI can then launch the GPS activity for device sharing. _pairingWindowOpenForDeviceSharing.value = true
Khi thấy thay đổi đối với đối tượng StateFlow, DeviceScreen thực hiện lệnh gọi sau:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
Bước 3: Gọi API
Giờ đã đến lúc bắt đầu tác vụ chia sẻ trên thiết bị.
- Mở
DeviceScreen.kt
trong thư mụcjava/com/google/homesampleapp/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à 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()
- Hãy gọi
.getCommissioningClient()
, chỉ lần này, sử dụng API.shareDevice()
.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
Lệnh gọi lại thành công của API commissioningClient.shareDevice()
cung cấp IntentSender để chạy tính năng Chia sẻ hoạt động trên thiết bị trong Dịch vụ Google Play.
- Để hoàn tất hàm
shareDevice
, hãy thêmaddOnSuccessListener
vàaddOnFailureListener
. Khi thành công,launch
được gọi trênshareDeviceLauncher
để khởi chạy hoạt động GPS để chia sẻ thiết bị..addOnSuccessListener { result -> Timber.d("ShareDevice: Success getting the IntentSender: result [${result}]") shareDeviceLauncher.launch(IntentSenderRequest.Builder(result).build()) } .addOnFailureListener { error -> Timber.e(error) deviceViewModel.showMsgDialog("Share device failed", error.toString()) }
Chạy ứng dụng
Để chia sẻ thiết bị Matter với các hệ sinh thái khác, bạn cần phải cài đặt một nền tảng khác trên thiết bị Android. Chúng tôi đã tạo một phiên bản khác của ứng dụng mẫu mà bạn có thể dùng làm uỷ viên mục tiêu.
Sau khi cài đặt uỷ viên mục tiêu trên thiết bị Android, hãy xác minh rằng bạn có thể chia sẻ thiết bị Matter. Ứng dụng ủy viên mục tiêu được gắn nhãn GHSAFM-TC.
Thiết bị của bạn hiện có thể tham gia vào ba loại vải:
- Kết cấu Android cục bộ.
- Sơ đồ phát triển của bạn (ứng dụng này).
- Lớp vải thứ ba này mà bạn vừa chia sẻ thiết bị.
8. Các bước tiếp theo
Xin chúc mừng
Xin chúc mừng, bạn đã hoàn tất thành công lớp học lập trình này, đồng thời học cách chạy thử nghiệm và chia sẻ thiết bị bằng SDK Home dành cho thiết bị di động.
Nếu bạn gặp sự cố với ứng dụng mẫu, hãy thử hoàn tất các bước để xác minh môi trường của bạn:
Nếu có thắc mắc về việc sử dụng ứng dụng mẫu hoặc phát hiện ra lỗi mã, bạn có thể gửi vấn đề đến Công cụ theo dõi lỗi trong kho lưu trữ GitHub:
Để nhận hướng dẫn chính thức từ Google về các câu hỏi kỹ thuật, hãy sử dụng Diễn đàn nhà phát triển nhà thông minh:
Để nhận hỗ trợ kỹ thuật từ cộng đồng, hãy sử dụng thẻ google-smart-home
trên Stack Overflow: