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 lại 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ị theo chuẩn Matter đầu tiên bằng tài nguyên trong SDK Matter.

Để tìm hiểu về Matter, hãy truy cập vào Trung tâm dành cho nhà phát triển của Google Home hoặc trang web của Liên minh Tiêu chuẩn Kết nối.

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

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

Bạn cần có

  • Một thiết bị trung tâm, là bất kỳ thiết bị Google Nest nào hỗ trợ Matter, chẳng hạn như Nest Hub (thế hệ thứ 2).
  • Máy Linux chạy hệ thống cửa sổ X11.
  • Docker.
  • Git.
  • Có kiến thức cơ bản về Linux.
    • 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 của bạn

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à xây dựng Matter theo cách thủ công trên macOS.

Ngoài ra, những 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 SDK Matter, ghi lại 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 hình ảnh CI công khai của SDK và thực thi thiết bị ảo mới được xây dựng từ trong vùng chứa này. Định vị hình ảnh để sử dụng khớ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:66Trước tiên, hãy chuyển tiếp các cổng xhost để chúng ta có thể sử dụng các ứng dụng giao diện người dùng sau:
    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ủ lưu trữ (tài nguyên thanh toán SDK, kết nối mạng và 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 lệnh docker và các tuỳ chọn mà chúng ta đã truyền vào đó:

  • xhost local:1000 cho phép Hệ thống X Window nhận kết nối từ máy chủ cục bộ trên cổng 1000, do đó cho phép sử dụng giao diện người dùng đồ hoạ.
  • docker run … image 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ủ lưu trữ của bạn.
  • --net=host cho phép Docker sử dụng ngăn xếp mạng của máy chủ bên trong vùng chứa. Việc này là bắt buộc để Docker truyền lưu lượng truy cập mDNS từ máy chủ đế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ủ, cung cấp quyền truy cập vào giao diện đồ hoạ hệ thống của bạn. Bạn bắt buộc phải làm 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ì dưới dạng quy trình nền.
  • --mount sẽ gắn SDK mà chúng ta đã kiểm tra trước đó vào vùng chứa.
  • --workdir thiết lập thư mục đang hoạt động khi khởi chạy thành thư mục SDK được gắn của chúng tôi.

Nếu muốn, bạn có thể chạy một thực thể phiên đầu cuối thứ hai:

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 có hình ảnh được chỉ định. Khi bạn làm như vậy, dữ liệu cũ đã được lưu vào thực thể 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 bằng một bản cài đặt mới. Tuy nhiên, đôi khi bạn muốn lưu cấu hình công việc và cấu hình môi trường giữa các phiên.

Do đó, sau khi tạo vùng chứa, bạn có thể dừng vùng chứa đó để tránh mất công việc đang làm.

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ở một 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 hoạt động đầu cuối cho vùng chứa của mình bằng:

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

Hoặc bắt đầu 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 SDK Matter. 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 mã:

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

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

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

Nói chung, hãy sử dụng tính năng liên kết liên kết bằng cách chạy vùng chứa với đối số bổ sung --mount source=$(pwd),target=/workspace,type=bind để liên kết thư mục đang làm việc 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 kết trong máy chủ lưu trữ.

Lấy mã 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 đầu cuối 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 được vùng chứa gắn kết.

Đặt nhóm theo quy tắc đệ quy cho các tệp trong thư mục đã gắn vào 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 bạn muốn trong thư mục. Ví dụ này cung 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 .

Lưu ý rằng các lệnh này không ảnh hưởng đến quyền đối với tệp mới do người dùng máy chủ tạo. Hãy nhớ cập nhật quyền của các tệp mới được tạo trong máy chủ nếu 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. Bảng điều khiển dành cho nhà phát triển trên Google Home

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

Mọi thiết bị Matter đã vượt qua 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. Thiết bị đang trong quá trình phát triển và chưa được chứng nhận có thể được ủy quyền trong hệ sinh thái Google Home với một số điều kiện nhất định. Hãy xem bài viết Hạn chế về tính năng ghép nối để biết thêm thông tin.

Tạo dự án của nhà phát triển

Để bắt đầu, hãy truy cập Google Home Developer Console:

  1. Nhấp vào Tạo dự án.
  2. Nhập một 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 công cụ tích hợp. Sau đó, bạn sẽ được chuyển đến màn hình Tài nguyên dữ liệu. Tại đây, bạn có thể xem tài liệu về hoạt động 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ẽ cho thấy trang Danh sách kiểm tra các yếu tố.
  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 phần Mã nhà cung cấp (VID), hãy chọn VID Thử nghiệm rồi chọn 0xFFF1 trong trình đơn thả xuống Thử nghiệm VID. Trong mã sản phẩm (PID), hãy nhập 0x8000 rồi nhấp vào Lưu & tiếp tục, rồi nhấp vào Lưu trên trang sau. Bạn có thể dùng các giá trị VID/PID chính xác này, các bước trong lớp học lập trình sau này sẽ phụ thuộc vào các giá trị đó. Thiết lập dự án
  9. Bây giờ, bạn sẽ thấy dữ liệu tích hợp trong mục Tích hợp đối tượng.
  10. Hãy khởi động lại thiết bị trung tâm để đảm bảo thiết bị đó nhận được cấu hình dự án tích hợp theo chuẩn Matter mới nhất. Nếu sau này phải thay đổi VID hoặc PID, 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 khởi động lại từng bước.

4. Tạo thiết bị

Bạn có thể tìm thấy tất cả ví dụ trong Matter ở thư mục examples trong kho lưu trữ GitHub. Có một số mẫu, nhưng chúng ta sẽ tập trung vào lớp học lập trình này về Chef.

Đầu bếp là cả:

  • Ứng dụng mẫu cung cấp giao diện dòng lệnh, tính năng gói cũng có trên ứng dụng examples/shell.
  • Một tập lệnh áp dụng nguyên tắc quy ước qua cấu hình để đóng gói một số nhiệm vụ phổ biến cần thiết để phát triển một 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

Đầu bếp có một số tuỳ chọn mà bạn có thể xem bằng cách chạy chef.py -h. Các tuỳ chọn chúng tôi đang sử dụng ở đây là:

  • -d: xác định loại thiết bị sẽ được sử 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 nút điều khiển bật/tắt và cấp độ.
  • -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 ánh sáng của bạn, ZAP sẽ tự động tạo mã để tích 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] bật 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 mục tiêu. Các nền tảng hỗ trợ là linux, nrfconnectesp32. Bạn có thể chạy ./chef.py -h để xem tất cả lệnh có sẵn và nền tảng mục tiêu được hỗ trợ. linux được dùng cho các thiết bị theo chuẩn Matter ảo.

Chạy thiết bị

Matter sử dụng cổng TCP/UDP 5540. Vì vậy, nếu bạn có tường lửa đang chạy trong máy tính, hãy tắt tường lửa đó hoặc cho phép 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:

$ ./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ị tiếp tục chạy. Bây giờ, chúng ta sẽ chú ý đến Ứng dụng Google Home để có thể cài đặt thiết bị của bạn thành Google Home.

Dừng thiết bị

Nếu cần dừng thiết bị, bạn có thể thoát khỏi 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 sử dụng Ctrl+\.

Thông tin đăng nhập của thiết bị ảo được lưu trữ trong thư mục /tmp/, trong những 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 vận hành từ đầu, bạn phải xoá các tệp đó bằng cách chạy lệnh sau:

$ rm /tmp/chip*

5. Ủy quyền cho 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

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

Tham khảo danh sách này để biết trung tâm hỗ trợ Matter.

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

  • Thiết bị trung tâm của bạn được ghép nối với cùng một Tài khoản Google mà bạn đã dùng để đăng nhập trên Google Home Console.
  • Thiết bị trung tâm của bạn kết nối với cùng một mạng Wi-Fi với máy tính mà bạn đang dùng để chạy Thiết bị Matter ảo.
  • Thiết bị trung tâm của bạn nằm trong cùng 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

Quy trình vận hành cần được cung cấp thông tin về ban đầu của Matter thông qua mã QR. Kiểm tra đầu ra trên bảng điều khiển của ứng dụng Matter chứa đường liên kết cho mã QR liên quan đến quá trình vận hành.

Thực hiện hoạt động phí hoa hồng

  1. Mở ứng dụng Google Home.
  2. Nhấn vào dấu + ở góc trên 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à riêng của bạn rồi nhấn vào Tiếp theo.
  6. Ứng dụng Google Home quét tìm thiết bị của bạn. Nếu thấy thông báo "Đã tìm thấy thiết bị không cố định...", hãy nhấn vào "Có". Nếu không, hãy nhấn vào Set up a other device (Thiết lập một thiết bị khác), rồi chọn Matter device (Thiết bị Matt) 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 trên ứng dụng Google Home.

Sau khi bạn hoàn tất những bước này, thiết bị ảo Matter đã được chạy 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 của bạn.

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

Khắc phục sự cố

Không uỷ quyền được do "Sự cố kết nối" hoặc "Không thể liên hệ với Google" thông báo lỗi

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

Không uỷ quyền được sau khi "Quét thiết bị của bạn" 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ủa bạn đi vào hoạt động và xuất hiện trong ứng dụng Google Home dưới dạng bóng đèn, bạn có thể thử nghiệm khả năng điều khiển thiết bị theo nhiều phương pháp:

  • Đang sử dụng Trợ lý Google.
  • Dùng ứng dụng Google Home.

Trợ lý Google

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

Hãy xem phần Điều khiển các thiết bị nhà thông minh bằng lệnh thoại 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 ví dụ về các lệnh.

Ứng dụng Google Home

Bạn có thể nhấn vào các 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 các 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ị theo chuẩn 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ột môi trường phát triển Matter.
  • Tạo và chạy thiết bị ảo theo chuẩn Matter.
  • Cài đặt và kiểm soát thiết bị ảo của bạn từ Google Home.

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

  • Matter Prime trên Trung tâm dành cho nhà phát triển Google Home. Tại đây, bạn sẽ tìm hiểu thông tin cơ bản về các khái niệm Matter.
  • Thông số kỹ thuật Matter, Thư viện thiết bị Matter và Thư viện cụm ứng dụng Matter, do Connectivity Standards Alliance xuất bản.
  • Kho lưu trữ GitHub.