สร้างอุปกรณ์เสมือนจริงกรณี

1. บทนำ

Matter เป็นโปรโตคอลการเชื่อมต่อที่มอบโอกาสที่น่าตื่นเต้นสำหรับการพัฒนาอุปกรณ์อัจฉริยะ ใน Codelab นี้ คุณจะได้สร้างอุปกรณ์ Matter เครื่องแรกโดยใช้ทรัพยากรจาก Matter SDK

ดูข้อมูลเกี่ยวกับ Matter ได้ที่ศูนย์นักพัฒนาแอป Google Home หรือเว็บไซต์ Connectivity Standards Alliance

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าสภาพแวดล้อมการสร้าง Matter
  • วิธีสร้างอุปกรณ์ Matter เสมือนที่ทำงานบนคอมพิวเตอร์
  • วิธีคอมมิชชันและควบคุมอุปกรณ์ Matter เสมือนด้วย Google Home

สิ่งที่คุณต้องมี

  • ฮับ ซึ่งก็คืออุปกรณ์ Google Nest ที่รองรับ Matter เช่น Nest Hub (รุ่นที่ 2)
  • เครื่อง Linux ที่ใช้ระบบหน้าต่าง X11
  • Docker
  • Git
  • มีความรู้พื้นฐานเกี่ยวกับ Linux
    • โปรดทราบว่าเชลล์ที่ใช้สำหรับคำสั่งทั้งหมดในโค้ดแล็บนี้คือ BASH

2. ตั้งค่าสภาพแวดล้อม

ตรวจสอบฮาร์ดแวร์

การติดตั้ง Docker นี้ไม่รองรับคอมพิวเตอร์ Windows และ macOS คุณติดตั้งและสร้าง Matter ด้วยตนเองใน macOS ได้

นอกจากนี้ คำสั่งเหล่านี้ยังถือว่าเครื่อง Linux ของคุณใช้ระบบหน้าต่าง X11 หากเครื่อง Linux ใช้ Wayland ให้ตรวจสอบว่าได้ติดตั้ง X.Org ด้วย

ตั้งค่าสภาพแวดล้อมในการพัฒนา

  1. ติดตั้ง Docker Engine (อย่าใช้ Docker Desktop)
  2. โคลน Matter SDK และจดบันทึกคอมมิตที่เราใช้ในส่วนต่อไปนี้
    git clone https://github.com/project-chip/connectedhomeip.git
    cd connectedhomeip
    git show
    commit f2f3d0eb03ba5bea32b22f19982c402a8c1c9063
    
  3. เรียกใช้คอนเทนเนอร์บิลด์โดยใช้อิมเมจ CI สาธารณะของ SDK และเรียกใช้อุปกรณ์เสมือนที่สร้างขึ้นใหม่จากภายในคอนเทนเนอร์นี้ ค้นหาอิมเมจที่จะใช้ให้ตรงกับ SDK เวอร์ชันของเรา ดังนี้
    buildimage=$(grep chip-build .github/workflows/chef.yaml | head -n 1 | awk '{print $2}')
    echo $buildimage
    
    หากคุณใช้คอมมิตเดียวกัน คุณควรเห็น ghcr.io/project-chip/chip-build:66First, forward xhost ports so we can later use UI applications:
    xhost local:1000
    
    จากนั้นเริ่มคอนเทนเนอร์ด้วยทรัพยากรที่เหมาะสมซึ่งส่งต่อจากโฮสต์ (การชำระเงินของ SDK, เครือข่าย และทรัพยากรการแสดงผล/การสื่อสาร)
    docker run -it --ipc=host --net=host -e DISPLAY --name matter-container --mount source=$(pwd),target=/workspace,type=bind   --workdir="/workspace" $buildimage /bin/bash
    

มาทำความเข้าใจคำสั่ง Docker และตัวเลือกที่เราส่งไปยังคำสั่งกัน

  • xhost local:1000 อนุญาตให้ X Window System รับการเชื่อมต่อจากโฮสต์ในเครื่องบนพอร์ต 1000 ซึ่งจะช่วยให้ใช้กราฟิกอินเทอร์เฟซผู้ใช้ได้
  • docker run … image จะเรียกใช้รูปภาพที่ระบุ โดยดึงมาจากรีจีสทรี Docker หากจำเป็น
  • --ipc=host ช่วยให้ Docker แชร์เนมสเปซการสื่อสารระหว่างกระบวนการกับเครื่องโฮสต์ได้
  • --net=host อนุญาตให้ Docker ใช้สแต็กเครือข่ายของโฮสต์ภายในคอนเทนเนอร์ ซึ่งจำเป็นเพื่อให้ Docker ส่งต่อการรับส่งข้อมูล mDNS จากโฮสต์ไปยังคอนเทนเนอร์ และแชร์จอแสดงผล X11 ของโฮสต์ได้
  • -e DISPLAY จะส่งออก $DISPLAY ไปยังโฮสต์เพื่อให้เข้าถึงอินเทอร์เฟซกราฟิกของระบบได้ ซึ่งจำเป็นต้องใช้เพื่อเรียกใช้เครื่องมือ ZAP เมื่อแก้ไขคลัสเตอร์ Matter
  • -it จะเรียกใช้ Docker ด้วยเทอร์มินัลแบบอินเทอร์แอกทีฟ (tty) แทนที่จะเป็นกระบวนการเบื้องหลัง
  • --mount จะติดตั้ง SDK ที่เราเช็คเอาต์ก่อนหน้านี้ลงในคอนเทนเนอร์
  • --workdir จะตั้งค่าไดเรกทอรีการทำงานเมื่อเปิดใช้เป็นไดเรกทอรี SDK ที่เราติดตั้ง

คุณอาจเรียกใช้เซสชันเทอร์มินัลที่ 2 ก็ได้ (ไม่บังคับ)

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

หยุดและเริ่มคอนเทนเนอร์ Matter Docker

เมื่อใดก็ตามที่คุณเรียกใช้คำสั่ง docker run คุณจะสร้างคอนเทนเนอร์ใหม่ด้วยอิมเมจที่ระบุ เมื่อดำเนินการเช่นนี้ ข้อมูลเก่าที่บันทึกไว้ในอินสแตนซ์คอนเทนเนอร์ก่อนหน้าจะหายไป บางครั้งคุณอาจต้องการให้เป็นเช่นนี้ เนื่องจากจะช่วยให้คุณเริ่มต้นด้วยการติดตั้งใหม่ได้ แต่ในบางครั้ง คุณอาจต้องการบันทึกการกำหนดค่าสภาพแวดล้อมและงานของคุณไว้ระหว่างเซสชัน

ด้วยเหตุนี้ หลังจากสร้างคอนเทนเนอร์แล้ว คุณอาจหยุดคอนเทนเนอร์เพื่อป้องกันไม่ให้งานสูญหาย

user@host> docker stop matter-container

เมื่อพร้อมที่จะเรียกใช้อีกครั้ง ให้เริ่มคอนเทนเนอร์และเปิดหน้าต่างเทอร์มินัล

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

คุณเปิดเซสชันเทอร์มินัลเพิ่มเติมไปยังคอนเทนเนอร์ได้โดยใช้คำสั่งต่อไปนี้

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

หรือเริ่มเซสชันรูทโดยใช้คำสั่งต่อไปนี้

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

การตั้งค่า Matter เบื้องต้น

เริ่มต้น SDK

เริ่มต้น Matter SDK การดำเนินการนี้จะใช้เวลาหลายนาทีจึงจะเสร็จสมบูรณ์

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

ตอนนี้ระบบได้เริ่มต้น Matter SDK แล้ว หากต้องการเริ่มต้นสภาพแวดล้อมใหม่ในอนาคตอย่างรวดเร็ว ให้เรียกใช้คำสั่งต่อไปนี้

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

แชร์ไฟล์ระหว่างโฮสต์กับคอนเทนเนอร์

ก่อนหน้านี้ เราเข้าถึงไฟล์ในเครื่องโฮสต์จากภายในคอนเทนเนอร์โดยใช้การเชื่อมโยง นอกจากนี้ คุณยังเขียนไฟล์ไปยังไดเรกทอรีที่เชื่อมต่อจากภายในคอนเทนเนอร์เพื่อเข้าถึงจากโฮสต์ได้ด้วย

โดยทั่วไป ให้ใช้การเชื่อมโยงแบบ Bind โดยเรียกใช้คอนเทนเนอร์ด้วยอาร์กิวเมนต์เพิ่มเติม --mount source=$(pwd),target=/workspace,type=bind เพื่อต่อเชื่อมไดเรกทอรีการทำงานปัจจุบันลงในคอนเทนเนอร์ที่ /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

ต้องจัดการสิทธิ์ของผู้ใช้คอนเทนเนอร์ในไดเรกทอรีที่ติดตั้งในโฮสต์

รับรหัสกลุ่มของผู้ใช้คอนเทนเนอร์จากภายในคอนเทนเนอร์

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

เปิดเซสชันเทอร์มินัลอื่นในโฮสต์คอนเทนเนอร์ แล้วตั้งค่าไดเรกทอรีการทำงานเป็นไดเรกทอรีที่คอนเทนเนอร์ติดตั้ง

ตั้งค่ากลุ่มสำหรับไฟล์ในไดเรกทอรีที่ติดตั้งเป็นกลุ่มของผู้ใช้คอนเทนเนอร์แบบเรียกซ้ำ

user@host> sudo chgrp -R 1000 .

ให้สิทธิ์ที่ต้องการในไดเรกทอรีแก่กลุ่ม ตัวอย่างนี้ให้สิทธิ์อ่าน เขียน และเรียกใช้แก่กลุ่มของผู้ใช้คอนเทนเนอร์ในไฟล์ทั้งหมดในไดเรกทอรีที่ติดตั้ง

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

โปรดทราบว่าคำสั่งเหล่านี้ไม่มีผลต่อสิทธิ์ของไฟล์ใหม่ที่ผู้ใช้โฮสต์สร้างขึ้น อย่าลืมอัปเดตสิทธิ์ของไฟล์ใหม่ที่สร้างในโฮสต์ตามที่จำเป็น

คุณอาจเพิ่มผู้ใช้โฮสต์ลงในกลุ่มของผู้ใช้คอนเทนเนอร์เพื่อรับสิทธิ์ในไฟล์ที่สร้างโดยผู้ใช้คอนเทนเนอร์

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

3. Google Home Developer Console

Google Home Developer Console คือเว็บแอปพลิเคชันที่คุณใช้จัดการการผสานรวม Matter กับ Google Home

อุปกรณ์ Matter ที่ผ่านการรับรอง Matter จาก Connectivity Standards Alliance (Alliance) จะใช้งานได้ในระบบนิเวศของ Google Home อุปกรณ์ที่อยู่ระหว่างการพัฒนาและยังไม่ได้รับการรับรองจะสามารถเปิดใช้ในระบบนิเวศของ Google Home ได้ภายใต้เงื่อนไขบางประการ ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการจับคู่

สร้างโปรเจ็กต์นักพัฒนาแอป

เริ่มต้นโดยไปที่ Google Home Developer Console

  1. คลิกสร้างโปรเจ็กต์
  2. ป้อนชื่อโปรเจ็กต์ที่ไม่ซ้ำกัน แล้วคลิกสร้างโปรเจ็กต์ กล่องโต้ตอบสร้างโปรเจ็กต์ใหม่
  3. คลิก + เพิ่มการผสานรวม ซึ่งจะนำคุณไปยังหน้าจอแหล่งข้อมูล Matter ที่คุณสามารถดูเอกสารประกอบการพัฒนา Matter และอ่านเกี่ยวกับเครื่องมือบางอย่างได้
  4. เมื่อพร้อมที่จะดำเนินการต่อ ให้คลิกถัดไป: พัฒนา ซึ่งจะแสดงหน้าเช็กลิสต์ Matter
  5. คลิกถัดไป: ตั้งค่า
  6. ในหน้าตั้งค่า ให้ป้อนชื่อผลิตภัณฑ์
  7. คลิกเลือกประเภทอุปกรณ์ แล้วเลือกประเภทอุปกรณ์จากเมนูแบบเลื่อนลง (ในกรณีนี้คือ Light)
  8. ในรหัสผู้ให้บริการ (VID) ให้เลือกVID ทดสอบ แล้วเลือก 0xFFF1 จากเมนูแบบเลื่อนลงของ VID ทดสอบ ในรหัสผลิตภัณฑ์ (PID) ให้ป้อน 0x8000 แล้วคลิกบันทึกและดำเนินการต่อ จากนั้นคลิกบันทึกในหน้าถัดไป ใช้ค่า VID/PID ที่แน่นอนเหล่านี้ เนื่องจากขั้นตอนใน Codelab ในภายหลังจะขึ้นอยู่กับค่าเหล่านี้
    การตั้งค่าโปรเจ็กต์
  9. ตอนนี้คุณจะเห็นการผสานรวมในส่วนการผสานรวม Matter
  10. รีบูตฮับเพื่อให้แน่ใจว่าฮับจะได้รับการกำหนดค่าโปรเจ็กต์การผสานรวม Matter ล่าสุด หากต้องเปลี่ยน VID หรือ PID ในภายหลัง คุณจะต้องรีบูตหลังจากบันทึกโปรเจ็กต์เพื่อให้การเปลี่ยนแปลงมีผล ดูวิธีการรีบูตแบบทีละขั้นตอนได้ที่รีสตาร์ทอุปกรณ์ Google Nest หรือ Google Wifi

4. สร้างอุปกรณ์

ตัวอย่างทั้งหมดใน Matter จะอยู่ในโฟลเดอร์ examples ในที่เก็บข้อมูล GitHub มีตัวอย่างหลายรายการ แต่ใน Codelab นี้เราจะเน้นที่ Chef

Chef มีทั้ง

  • แอปตัวอย่างที่มีอินเทอร์เฟซเทอร์มินัล ซึ่งมีฟีเจอร์การแรปที่พบได้ในแอป examples/shell ด้วย
  • สคริปต์ที่ใช้หลักการ "การกำหนดค่าตามธรรมเนียม" เพื่อห่อหุ้มงานทั่วไปหลายอย่างที่จำเป็นสำหรับการพัฒนาอุปกรณ์ที่เปิดใช้ Matter

ไปที่โฟลเดอร์ตัวอย่าง Chef แล้วสร้างบิลด์ Matter แรกของคุณ

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

Chef มีตัวเลือกบางอย่างที่ดูได้โดยการเรียกใช้ chef.py -h ตัวเลือกที่เราใช้ที่นี่มีดังนี้

  • -d: กำหนดประเภทอุปกรณ์ที่จะใช้ ในกรณีนี้ เราจะสร้างแอปไฟที่มีการควบคุมเปิด/ปิดและระดับ
  • -z: เรียกใช้เครื่องมือ ZAP เพื่อสร้างไฟล์ต้นฉบับที่ใช้ประเภทอุปกรณ์ กล่าวคือ ZAP จะสร้างโค้ดโดยอัตโนมัติตามการเลือกไฟของคุณเพื่อรวมไว้ในการสร้างที่กำหนดไฟ (โมเดลข้อมูล) และวิธีที่ไฟโต้ตอบกับอุปกรณ์อื่นๆ (โมเดลการโต้ตอบ)
  • -b: บิลด์
  • -r: [ไม่บังคับ] เปิดใช้เซิร์ฟเวอร์ RPC ในอุปกรณ์ Matter เสมือนเพื่อให้คอมโพเนนต์อื่นๆ (เช่น GUI) สื่อสารกับอุปกรณ์เพื่อตั้งค่าและเรียกแอตทริบิวต์โมเดลข้อมูลได้
  • -t linux: แพลตฟอร์มเป้าหมาย แพลตฟอร์มที่รองรับคือ linux, nrfconnect และ esp32 คุณอาจเรียกใช้ ./chef.py -h เพื่อดูคำสั่งทั้งหมดที่ใช้ได้และแพลตฟอร์มเป้าหมายที่รองรับ linux ใช้สำหรับอุปกรณ์ Matter เสมือน

เรียกใช้อุปกรณ์

Matter ใช้พอร์ต TCP/UDP 5540 ดังนั้นหากคุณมีไฟร์วอลล์ที่ทำงานในคอมพิวเตอร์ ให้ปิดไฟร์วอลล์หรืออนุญาตการเชื่อมต่อ TCP/UDP ขาเข้าบนพอร์ต 5540

เรียกใช้อุปกรณ์เสมือนในคอนเทนเนอร์ด้วยคำสั่งต่อไปนี้

$ ./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]

เปิดอุปกรณ์ทิ้งไว้ ตอนนี้เราจะมาดูแอป Google Home เพื่อเตรียมอุปกรณ์ให้พร้อมใช้งานใน Google Home

หยุดอุปกรณ์

หากต้องการหยุดอุปกรณ์ คุณสามารถออกจากโปรแกรมได้โดยกด CTRL+C หากแอปไม่ปิด คุณอาจต้องใช้ CTRL+\ ด้วย

ระบบจะจัดเก็บข้อมูลเข้าสู่ระบบสำหรับอุปกรณ์เสมือนไว้ในไดเรกทอรี /tmp/ ในไฟล์ที่ขึ้นต้นด้วยคำนำหน้า chip

หากต้องการทำกระบวนการจัดสรรทั้งหมดซ้ำตั้งแต่ต้น คุณจะต้องลบไฟล์เหล่านั้นโดยเรียกใช้คำสั่งต่อไปนี้

$ rm /tmp/chip*

5. ตั้งค่าอุปกรณ์

หมายเหตุ: ขั้นตอนนี้จะสำเร็จก็ต่อเมื่อคุณตั้งค่าโปรเจ็กต์ใน Google Home Developer Console แล้ว

Nest Hub

คุณต้องมีฮับเพื่อเตรียมใช้งานอุปกรณ์ใน Fabric ของ Matter นี่คืออุปกรณ์ Google Nest เช่น Nest Hub (รุ่นที่ 2) ที่รองรับ Matter และจะทำหน้าที่เป็นทั้ง Border Router สำหรับอุปกรณ์ที่เปิดใช้ Thread และเป็นเส้นทางการดำเนินการในพื้นที่สำหรับการกำหนดเส้นทางเจตนาของสมาร์ทโฮม

โปรดดูรายการนี้เพื่อดูว่าฮับใดรองรับ Matter

โปรดตรวจสอบสิ่งต่อไปนี้ก่อนเริ่มกระบวนการคอมมิชชัน

  • ฮับจะจับคู่กับบัญชี Google เดียวกันกับที่คุณใช้ลงชื่อเข้าใช้ใน Google Home Console
  • ฮับอยู่ในเครือข่าย Wi-Fi เดียวกันกับคอมพิวเตอร์ที่คุณใช้เรียกใช้อุปกรณ์ Matter เสมือน
  • ฮับอยู่ในโครงสร้างเดียวกันกับที่คุณใช้ในแอป Google Home ("บ้าน" ในกราฟ Google Home แสดงถึงโครงสร้างของคุณ)

รับคิวอาร์โค้ด

กระบวนการจัดสรรต้องใช้ข้อมูลการเริ่มต้นใช้งาน Matter ที่ระบุผ่านคิวอาร์โค้ด ตรวจสอบเอาต์พุตคอนโซลของแอปพลิเคชัน Matter ซึ่งจะมีลิงก์สำหรับคิวอาร์โค้ดที่เกี่ยวข้องกับการจัดสรร

ดำเนินการค่าคอมมิชชัน

  1. เปิดแอป Google Home
  2. แตะ + ที่มุมซ้ายบน
  3. แตะตั้งค่าอุปกรณ์
  4. แตะอุปกรณ์ใหม่
  5. เลือกบ้าน แล้วแตะถัดไป
  6. แอป Google Home จะสแกนหาอุปกรณ์ หากได้รับข้อความ "พบอุปกรณ์ Matter..." ให้แตะ "ใช่" หรือแตะตั้งค่าอุปกรณ์อื่น แล้วเลือกอุปกรณ์ Matter จากรายการอุปกรณ์
  7. เล็งกล้องไปที่คิวอาร์โค้ดของอุปกรณ์หรือคิวอาร์โค้ดที่เว็บไซต์สร้างขึ้น
  8. ดำเนินการจับคู่ต่อตามที่ระบุไว้ในขั้นตอนของแอป Google Home

เมื่อทำตามขั้นตอนเหล่านี้เสร็จแล้ว อุปกรณ์เสมือน Matter ควรได้รับการจัดสรรเรียบร้อย และควรปรากฏเป็นไอคอนใหม่ในแอป Google Home

หลอดไฟที่จับคู่ในแอป Google Home

การแก้ปัญหา

การจัดสรรล้มเหลวโดยมีข้อความแสดงข้อผิดพลาด "ปัญหาการเชื่อมต่อ" หรือ "ติดต่อ Google ไม่ได้"

  • ตรวจสอบว่าคุณได้สร้างโปรเจ็กต์ที่มีชุดค่าผสม VID/PID ที่ถูกต้อง ใน Google Home Console และไม่มีโปรเจ็กต์อื่นๆ ที่ใช้ชุดค่าผสม VID/PID เดียวกัน

การจัดสรรไม่สำเร็จหลังจาก "สแกนอุปกรณ์" เป็นเวลานาน

6. ควบคุมอุปกรณ์

เมื่อตั้งค่าอุปกรณ์ที่เปิดใช้ Matter เรียบร้อยแล้วและอุปกรณ์ปรากฏในแอป Google Home เป็นหลอดไฟ คุณอาจทดสอบการควบคุมอุปกรณ์ด้วยวิธีต่างๆ ดังนี้

  • การใช้ Google Assistant
  • ใช้แอป Google Home

Google Assistant

ใช้ Google Assistant ในโทรศัพท์หรือฮับเพื่อสลับสถานะอุปกรณ์จากคำสั่งเสียง เช่น พูดว่า "Ok Google สลับไฟ"

ดูตัวอย่างคำสั่งเพิ่มเติมได้ที่ส่วนควบคุมอุปกรณ์สมาร์ทโฮมด้วยคำสั่งเสียงของควบคุมอุปกรณ์สมาร์ทโฮมที่เพิ่มลงในแอป Google Home

แอป Google Home

คุณอาจแตะป้ายกำกับเปิดและปิดข้างไอคอนหลอดไฟที่แสดงในแอป Google Home

ดูข้อมูลเพิ่มเติมได้ที่ส่วนควบคุมอุปกรณ์ด้วยแอป Google Home ของควบคุมอุปกรณ์สมาร์ทโฮมที่เพิ่มลงในแอป Google Home

7. ยินดีด้วย

คุณสร้างอุปกรณ์ Matter เครื่องแรกเรียบร้อยแล้ว ยอดเยี่ยม!

ในโค้ดแล็บนี้ คุณได้เรียนรู้วิธีการต่อไปนี้

  • ติดตั้งสภาพแวดล้อมในการพัฒนา Matter
  • สร้างและเรียกใช้อุปกรณ์เสมือน Matter
  • จัดสรรและควบคุมอุปกรณ์เสมือนจาก Google Home

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Matter ได้ที่แหล่งข้อมูลต่อไปนี้