Xây dựng một thiết bị ảo có vai trò quan trọng

1. Giới thiệu

Matter là một giao thức kết nối mang đến những cơ hội thú vị cho việc phát triển các thiết bị thông minh. Trong lớp học lập trình này, bạn sẽ tạo thiết bị Matter đầu tiên bằng các tài nguyên trong Matter SDK.

Để tìm hiểu về Matter, hãy truy cập vào Trung tâm dành cho nhà phát triển Google Home hoặc trang web của Connectivity Standards Alliance.

Kiến thức bạn sẽ học được

  • Cách thiết lập môi trường tạo bản dựng Matter
  • Cách tạo một thiết bị Matter ảo chạy trên máy tính
  • Cách thiết lập và điều khiển thiết bị ảo theo chuẩn Matter bằng Google Home

Bạn cần có

  • Một trung tâm, tức là mọi thiết bị Google Nest có hỗ trợ Matter, chẳng hạn như Nest Hub (thế hệ thứ 2).
  • Một máy Linux chạy hệ thống cửa sổ X11.
  • Docker.
  • Git.
  • Kiến thức cơ bản về Linux.
    • Xin lưu ý rằng shell giả định cho tất cả các lệnh trong lớp học lập trình này là BASH.

2. Thiết lập môi trường

Kiểm tra phần cứng

Bản cài đặt Docker này không hỗ trợ máy tính Windows và macOS. Bạn có thể cài đặt và tạo Matter theo cách thủ công trên macOS.

Ngoài ra, hướng dẫn này giả định rằng máy Linux của bạn đang chạy hệ thống cửa sổ X11. Nếu máy Linux của bạn chạy Wayland, hãy đảm bảo rằng bạn cũng đã cài đặt X.Org.

Thiết lập môi trường phát triển

  1. Cài đặt Docker Engine (không sử dụng Docker Desktop).
  2. Sao chép Matter SDK, lưu ý đến cam kết mà chúng ta đang sử dụng trong phần sau.
    git clone https://github.com/project-chip/connectedhomeip.git
    cd connectedhomeip
    git show
    commit f2f3d0eb03ba5bea32b22f19982c402a8c1c9063
    
  3. Chạy một vùng chứa bản dựng bằng cách sử dụng các hình ảnh CI công khai của SDK và thực thi thiết bị ảo mới tạo từ bên trong vùng chứa này. Tìm hình ảnh để sử dụng phù hợp với phiên bản SDK của chúng tôi như sau:
    buildimage=$(grep chip-build .github/workflows/chef.yaml | head -n 1 | awk '{print $2}')
    echo $buildimage
    
    Nếu đang sử dụng cùng một cam kết, bạn sẽ thấy ghcr.io/project-chip/chip-build:66First, forward xhost ports so we can later use UI applications:
    xhost local:1000
    
    Tiếp theo, hãy khởi động vùng chứa bằng các tài nguyên thích hợp được chuyển tiếp từ máy chủ (SDK thanh toán, mạng và tài nguyên hiển thị/giao tiếp của chúng tôi).
    docker run -it --ipc=host --net=host -e DISPLAY --name matter-container --mount source=$(pwd),target=/workspace,type=bind   --workdir="/workspace" $buildimage /bin/bash
    

Hãy tìm hiểu về lệnh docker và các lựa chọn mà chúng ta đã truyền cho lệnh này:

  • xhost local:1000 cho phép Hệ thống cửa sổ X nhận các kết nối từ máy chủ cục bộ trên cổng 1000, nhờ đó cho phép sử dụng giao diện người dùng đồ hoạ.
  • docker run … image sẽ chạy hình ảnh đã cho, kéo hình ảnh đó từ sổ đăng ký Docker nếu cần.
  • --ipc=host cho phép Docker chia sẻ không gian tên giao tiếp liên quy trình với máy chủ.
  • --net=host cho phép Docker sử dụng ngăn xếp mạng của máy chủ lưu trữ bên trong vùng chứa. Điều này là cần thiết để Docker truyền lưu lượng truy cập mDNS từ máy chủ lưu trữ đến vùng chứa và chia sẻ màn hình X11 của máy chủ lưu trữ.
  • -e DISPLAY xuất $DISPLAY sang máy chủ lưu trữ, cho phép truy cập vào giao diện đồ hoạ hệ thống của bạn. Bạn phải thực hiện việc này để chạy công cụ ZAP khi chỉnh sửa các cụm Matter.
  • -it chạy Docker bằng một thiết bị đầu cuối tương tác (tty), thay vì chạy dưới dạng một quy trình nền.
  • --mount gắn SDK mà chúng ta đã kiểm tra trước đó vào vùng chứa.
  • --workdir đặt thư mục đang hoạt động khi khởi chạy thành thư mục SDK đã gắn kết của chúng tôi.

Bạn có thể chạy phiên thiết bị đầu cuối thứ hai (không bắt buộc):

user@host> docker exec -it matter-container /bin/bash
$

Dừng và khởi động vùng chứa Matter Docker

Mỗi khi chạy lệnh docker run, bạn sẽ tạo một vùng chứa mới bằng hình ảnh đã chỉ định. Khi bạn làm như vậy, dữ liệu cũ đã lưu trên một phiên bản vùng chứa trước đó sẽ bị mất. Đôi khi, đây là điều bạn muốn xảy ra, vì nó cho phép bạn bắt đầu với một bản cài đặt mới. Tuy nhiên, có những lúc bạn muốn lưu công việc và cấu hình môi trường giữa các phiên.

Vì lý do này, sau khi tạo vùng chứa, bạn có thể dừng vùng chứa để tránh mất dữ liệu.

user@host> docker stop matter-container

Khi bạn đã sẵn sàng chạy lại, hãy khởi động vùng chứa và mở cửa sổ dòng lệnh:

user@host> docker start matter-container
user@host> docker exec -it matter-container /bin/bash

Bạn có thể mở thêm các phiên thiết bị đầu cuối cho vùng chứa bằng cách:

user@host> docker exec -it matter-container /bin/bash

Hoặc bắt đầu một phiên gốc bằng cách sử dụng:

user@host> docker exec -u 0 -it matter-container /bin/bash

Thiết lập Matter ban đầu

Khởi chạy SDK

Khởi chạy Matter SDK. Thao tác này sẽ mất vài phút để hoàn tất.

source scripts/bootstrap.sh
python3 scripts/checkout_submodules.py --shallow --platform linux

SDK Matter của bạn hiện đã được khởi chạy. Để nhanh chóng khởi động lại môi trường trong tương lai, hãy chạy:

sudo docker exec -it  matter-container /bin/bash
source ./scripts/activate.sh

Chia sẻ tệp giữa máy chủ và vùng chứa

Trước đây, chúng ta đã truy cập vào các tệp trên máy chủ lưu trữ từ bên trong vùng chứa bằng cách sử dụng một điểm gắn kết liên kết. Bạn cũng có thể ghi tệp vào thư mục được gắn từ bên trong vùng chứa để truy cập từ máy chủ.

Nói chung, hãy sử dụng các liên kết kết nối bằng cách chạy vùng chứa với đối số bổ sung --mount source=$(pwd),target=/workspace,type=bind để gắn thư mục đang hoạt động hiện tại vào vùng chứa tại /workspace.

user@host> docker run -it --ipc=host --net=host -e DISPLAY --name matter-container --mount source=$(pwd),target=/workspace,type=bind us-docker.pkg.dev/nest-matter/docker-repo/virtual-device-image:latest

Bạn phải quản lý quyền của người dùng vùng chứa đối với thư mục đã gắn trong máy chủ lưu trữ.

Lấy mã nhận dạng nhóm của người dùng vùng chứa từ bên trong vùng chứa.

$ id
uid=1000(matter) gid=1000(matter) groups=1000(matter)

Mở một phiên dòng lệnh khác trên máy chủ lưu trữ vùng chứa và đặt thư mục đang hoạt động thành thư mục do vùng chứa gắn kết.

Đặt đệ quy nhóm cho các tệp trong thư mục được gắn thành nhóm của người dùng vùng chứa.

user@host> sudo chgrp -R 1000 .

Cấp cho nhóm các quyền mà bạn muốn trong thư mục. Ví dụ này cấp cho nhóm của người dùng vùng chứa quyền đọc, ghi và thực thi trên tất cả các tệp trong thư mục được gắn.

user@host> sudo chmod -R g+rwx .

Xin lưu ý rằng các lệnh này không ảnh hưởng đến quyền của các tệp mới do người dùng chủ sở hữu tạo. Hãy nhớ cập nhật quyền của các tệp mới được tạo trong tệp lưu trữ khi cần.

Bạn có thể thêm người dùng lưu trữ vào nhóm của người dùng vùng chứa để kế thừa quyền đối với các tệp do người dùng vùng chứa tạo.

user@host> currentuser=$(whoami)
user@host> sudo usermod -a -G 1000 $currentuser

3. Google Home Developer Console

Google Home Developer Console là ứng dụng web nơi bạn quản lý các hoạt động tích hợp Matter với Google Home.

Mọi thiết bị Matter đã đạt chứng nhận Matter của Liên minh Tiêu chuẩn Kết nối (Liên minh) đều hoạt động trong hệ sinh thái Google Home. Các thiết bị đang trong quá trình phát triển và chưa được chứng nhận có thể được đưa vào hoạt động trong hệ sinh thái Google Home trong một số điều kiện nhất định – hãy xem phần Hạn chế về việc ghép nối để biết thêm thông tin.

Tạo dự án dành cho nhà phát triển

Bắt đầu bằng cách truy cập vào Google Home Developer Console:

  1. Nhấp vào Tạo dự án.
  2. Nhập tên riêng biệt cho dự án rồi nhấp vào Tạo dự án. Hộp thoại tạo dự án mới
  3. Nhấp vào + Thêm mục liên kết tích hợp. Thao tác này sẽ đưa bạn đến màn hình Tài nguyên Matter. Tại đây, bạn có thể xem tài liệu phát triển Matter và đọc về một số công cụ.
  4. Khi bạn đã sẵn sàng tiếp tục, hãy nhấp vào Tiếp theo: Phát triển. Thao tác này sẽ hiển thị trang Danh sách kiểm tra Matter.
  5. Nhấp vào Tiếp theo: Thiết lập
  6. Trên trang Thiết lập, hãy nhập Tên sản phẩm.
  7. Nhấp vào Chọn loại thiết bị rồi chọn loại thiết bị trong trình đơn thả xuống (trong trường hợp này là Light).
  8. Trong Vendor ID (VID) (Mã nhận dạng nhà cung cấp), hãy chọn Test VID (VID thử nghiệm) rồi chọn 0xFFF1 trong trình đơn thả xuống Test VID (VID thử nghiệm). Trong Product ID (PID) (Mã sản phẩm), hãy nhập 0x8000 rồi nhấp vào Lưu và tiếp tục, sau đó nhấp vào Lưu trong trang tiếp theo. Hãy sử dụng chính xác các giá trị VID/PID này, các bước sau trong lớp học lập trình sẽ phụ thuộc vào các giá trị này.
    Thiết lập dự án
  9. Giờ đây, bạn sẽ thấy chế độ tích hợp của mình trong phần Chế độ tích hợp Matter.
  10. Khởi động lại trung tâm để đảm bảo trung tâm nhận được cấu hình dự án tích hợp Matter mới nhất. Nếu phải thay đổi VID hoặc PID sau này, bạn cũng cần khởi động lại sau khi lưu dự án để thay đổi có hiệu lực. Hãy xem bài viết Khởi động lại thiết bị Google Nest hoặc Google Wifi để biết hướng dẫn từng bước về cách khởi động lại.

4. Tạo thiết bị

Tất cả ví dụ trong Matter đều có trong thư mục examples trong kho lưu trữ Github. Có một số mẫu, nhưng trọng tâm của chúng ta trong lớp học lập trình này là Chef.

Chef là cả:

  • Một ứng dụng mẫu cung cấp giao diện thiết bị đầu cuối, bao gồm cả các tính năng có trong ứng dụng examples/shell.
  • Một tập lệnh tuân theo nguyên tắc quy ước hơn cấu hình để đóng gói một số tác vụ phổ biến cần thiết cho việc phát triển thiết bị theo chuẩn Matter.

Chuyển đến thư mục ví dụ về Chef và tạo bản dựng Matter đầu tiên:

$ cd examples/chef
$ ./chef.py -zbr -d rootnode_dimmablelight_bCwGYSDpoe -t linux

Chef có một số lựa chọn mà bạn có thể xem bằng cách chạy chef.py -h. Các lựa chọn mà chúng ta sẽ sử dụng ở đây là:

  • -d: xác định loại thiết bị sẽ được dùng. Trong trường hợp này, chúng ta sẽ tạo một ứng dụng chiếu sáng có các chế độ bật/tắt và điều khiển mức độ.
  • -z: gọi công cụ ZAP để tạo các tệp nguồn triển khai loại thiết bị. Tức là dựa trên lựa chọn của bạn về ánh sáng, ZAP sẽ tự động tạo mã để kết hợp vào bản dựng xác định ánh sáng (mô hình dữ liệu) và cách ánh sáng tương tác với các thiết bị khác (mô hình tương tác).
  • -b: bản dựng.
  • -r: [không bắt buộc] cho phép máy chủ RPC trên thiết bị Matter ảo để các thành phần khác (chẳng hạn như GUI) có thể giao tiếp với thiết bị để đặt và truy xuất Thuộc tính mô hình dữ liệu.
  • -t linux: nền tảng nhắm mục tiêu. Các nền tảng được hỗ trợ là linux, nrfconnectesp32. Bạn có thể chạy ./chef.py -h để xem tất cả các lệnh hiện có và nền tảng mục tiêu được hỗ trợ. linux được dùng cho các thiết bị Matter ảo.

Chạy thiết bị

Matter sử dụng cổng TCP/UDP 5540, vì vậy, nếu bạn đang chạy tường lửa trên máy tính, hãy tắt tường lửa hoặc cho phép các kết nối TCP/UDP đến trên cổng 5540.

Chạy thiết bị ảo trong vùng chứa bằng cách:

$ ./linux/out/rootnode_dimmablelight_bCwGYSDpoe
   [1648589956496] [14264:16538181] CHIP: [DL] _Init]
...
[1648562026.946882][433632:433632] CHIP:SVR: SetupQRCode: [MT:Y3.13Y2N00KA0648G00]
[1648562026.946893][433632:433632] CHIP:SVR: Copy/paste the below URL in a browser to see the QR Code:
[1648562026.946901][433632:433632] CHIP:SVR: https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AY3.13Y2N00KA0648G00
[1648562026.946915][433632:433632] CHIP:SVR: Manual pairing code: [34970112332]

Để thiết bị của bạn chạy. Bây giờ, chúng ta sẽ chuyển sang ứng dụng Google Home để có thể thiết lập thiết bị của bạn trong Google Home.

Dừng thiết bị

Nếu cần dừng thiết bị, bạn có thể thoát chương trình bằng tổ hợp phím CTRL+C. Nếu ứng dụng không thoát, bạn cũng có thể cần dùng tổ hợp phím CTRL+\.

Thông tin đăng nhập cho thiết bị ảo của bạn được lưu trữ trong thư mục /tmp/, trong các tệp bắt đầu bằng tiền tố chip.

Nếu muốn lặp lại toàn bộ quy trình thiết lập từ đầu, bạn sẽ phải xoá các tệp đó bằng cách chạy lệnh sau:

$ rm /tmp/chip*

5. Uỷ quyền thiết bị

Lưu ý: Bước này sẽ chỉ thành công nếu bạn đã thiết lập dự án trong Google Home Developer Console.

Nest Hub

Bạn phải có một thiết bị trung tâm để thiết lập thiết bị trên hệ sinh thái Matter. Đây là một thiết bị Google Nest (chẳng hạn như Nest Hub (thế hệ thứ 2)) hỗ trợ Matter và sẽ đóng vai trò là cả Bộ định tuyến biên cho các thiết bị hỗ trợ Thread và là đường dẫn thực hiện cục bộ để định tuyến các ý định Nhà thông minh.

Hãy tham khảo danh sách này để biết những trung tâm nào hỗ trợ Matter.

Trước khi bắt đầu quy trình thiết lập, hãy kiểm tra để đảm bảo rằng:

  • Trung tâm của bạn được ghép nối với chính Tài khoản Google mà bạn đã dùng để đăng nhập vào Google Home Console.
  • Trung tâm của bạn đang kết nối với cùng mạng Wi-Fi với máy tính mà bạn đang dùng để chạy Thiết bị Matter ảo.
  • Trung tâm của bạn nằm trong cùng một cấu trúc mà bạn đang sử dụng trên Ứng dụng Google Home. ("Nhà" trong Google Home Graph đại diện cho cấu trúc của bạn).

Nhận mã QR

Quá trình thiết lập cần có thông tin thiết lập Matter được cung cấp thông qua mã QR. Kiểm tra đầu ra của bảng điều khiển ứng dụng Matter. Đầu ra này sẽ chứa một đường liên kết đến mã QR liên quan đến quá trình thiết lập.

Thực hiện thao tác hoa hồng

  1. Mở ứng dụng Google Home.
  2. Nhấn vào biểu tượng + ở góc trên cùng bên trái.
  3. Nhấn vào Thiết lập thiết bị.
  4. Nhấn vào Thiết bị mới.
  5. Chọn nhà của bạn rồi nhấn vào Tiếp theo.
  6. Ứng dụng Google Home sẽ quét để tìm thiết bị của bạn. Nếu bạn thấy thông báo "Đã tìm thấy thiết bị Matter...", hãy nhấn vào "Có". Nếu không, hãy nhấn vào Thiết lập một thiết bị khác, rồi chọn Thiết bị Matter trong danh sách thiết bị.
  7. Hướng camera vào mã QR của thiết bị hoặc mã QR do trang web tạo.
  8. Tiếp tục quá trình ghép nối như hướng dẫn trong quy trình của ứng dụng Google Home.

Sau khi bạn hoàn tất các bước này, thiết bị ảo Matter sẽ được thiết lập thành công và sẽ xuất hiện dưới dạng một biểu tượng mới trong ứng dụng Google Home.

Bóng đèn đã ghép nối trên ứng dụng Google Home

Khắc phục sự cố

Quá trình thiết lập thất bại với thông báo lỗi "Vấn đề về kết nối" hoặc "Không thể liên hệ với Google"

  • Đảm bảo rằng bạn đã tạo một dự án có sự kết hợp VID/PID chính xác trong Google Home Console và bạn không có dự án nào khác sử dụng cùng một sự kết hợp VID/PID.

Không thể thiết lập sau khi "Quét thiết bị" trong một thời gian dài

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

Sau khi thiết bị theo chuẩn Matter được thiết lập thành công và xuất hiện trong ứng dụng Google Home dưới dạng bóng đèn, bạn có thể kiểm thử việc điều khiển thiết bị bằng nhiều phương thức:

  • Sử dụng Trợ lý Google.
  • Sử dụng ứng dụng Google Home.

Trợ lý Google

Sử dụng Trợ lý Google trên điện thoại hoặc trung tâm để chuyển đổi trạng thái của thiết bị bằng lệnh thoại, chẳng hạn như nói "Ok Google, chuyển đổi trạng thái đèn".

Hãy xem phần Điều khiển thiết bị nhà thông minh bằng lệnh thoại trong bài viết Điều khiển thiết bị nhà thông minh được thêm vào ứng dụng Google Home để biết thêm ví dụ về các lệnh.

Ứng dụng Google Home

Bạn có thể nhấn vào nhãn BậtTắt bên cạnh biểu tượng bóng đèn xuất hiện trên Ứng dụng Google Home.

Hãy xem phần Điều khiển thiết bị bằng ứng dụng Google Home trong bài viết Điều khiển các thiết bị nhà thông minh được thêm vào ứng dụng Google Home để biết thêm thông tin.

7. Xin chúc mừng!

Bạn đã tạo thành công thiết bị Matter đầu tiên. Tuyệt vời!

Trong lớp học lập trình này, bạn đã tìm hiểu cách:

  • Cài đặt môi trường phát triển Matter.
  • Tạo và chạy một thiết bị ảo Matter.
  • Thiết lập và điều khiển thiết bị ảo của bạn thông qua Google Home.

Để tìm hiểu thêm về Matter, hãy tham khảo các tài liệu sau: