วิธีการต่อไปนี้ใช้ตัวอย่าง แอปไฟส่องสว่าง จาก Matter SDK ร่วมกับบอร์ดพัฒนา M5Stack ESP32
การตั้งค่าสภาพแวดล้อมของบิลด์
ขั้นแรก ให้โคลน Matter SDK
ในตัวอย่างนี้ เราจะตรวจสอบคอมมิตที่รองรับขั้นต่ำสำหรับการเปิดตัว Matter เวอร์ชัน 5 ของ Google Home
mkdir otaprepcd otaprepgit clone https://github.com/project-chip/connectedhomeip.git
cd connectedhomeip
git fetch origin v1.0-branch
git checkout FETCH_HEAD
git submodule update --init --recursive
source ./scripts/activate.sh
จากนั้นเราจะตรวจสอบเวอร์ชันที่ใช้ในเวิร์กโฟลว์ ESP32 GitHub เพื่อกำหนดว่าอิมเมจ Docker ใดเหมาะกับบิลด์ของเรามากที่สุด
cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1image: connectedhomeip/chip-build-esp32:0.5.99เราเรียกใช้คอนเทนเนอร์จากอิมเมจ Docker โดยส่งแฟล็กเพื่อติดตั้ง Matter SDK ในคอนเทนเนอร์และให้สิทธิ์เข้าถึง อุปกรณ์ ESP32
docker run --name container_name -it --user $(id -u):$(id -g)--mount source=$(pwd),target=/workspace,type=bind --device=/dev/ttyUSB0 connectedhomeip/chip-build-esp32:0.5.99 /bin/bashหยุดและเริ่มคอนเทนเนอร์ Matter Docker
ทุกครั้งที่คุณเรียกใช้คำสั่ง docker run คุณจะสร้างคอนเทนเนอร์ใหม่ด้วยอิมเมจที่ระบุ เมื่อดำเนินการเช่นนี้ ข้อมูลเก่าที่บันทึกไว้ในอินสแตนซ์คอนเทนเนอร์ก่อนหน้าจะหายไป บางครั้งคุณก็ต้องการให้เป็นเช่นนั้น เนื่องจากจะช่วยให้คุณเริ่มต้นด้วยการติดตั้งใหม่ได้ แต่ในตัวอย่างนี้ คุณน่าจะต้องการบันทึกงานและการกำหนดค่าสภาพแวดล้อมระหว่างเซสชัน
user@host> docker stop container_name
เมื่อพร้อมที่จะเรียกใช้อีกครั้ง ให้เริ่มคอนเทนเนอร์และเปิดหน้าต่างเทอร์มินัลโดยทำดังนี้
user@host> docker start container_name
user@host> docker exec -it container_name /bin/bash
คุณสามารถเปิดเซสชันเทอร์มินัลเพิ่มเติมไปยังคอนเทนเนอร์ได้โดยใช้คำสั่งต่อไปนี้
user@host> docker exec -it container_name /bin/bash
หรือเริ่มเซสชันรูทโดยใช้คำสั่งต่อไปนี้
user@host> docker exec -u 0 -it container_name /bin/bash
เริ่มต้น SDK
ในคอนเทนเนอร์ เราจะเริ่มต้น Matter SDK และ ESP IDF โดยทำดังนี้
cd /workspacegit submodule update --init --recursivesource ./scripts/activate.shsource /opt/espressif/esp-idf/export.shสร้างและแฟลช
งานถัดไปคือการสร้างอิมเมจและแฟลชชุดพัฒนาเพื่อให้ได้รับ การอัปเดตเฟิร์มแวร์ OTA Matter
หากต้องการดำเนินการนี้ คุณต้องสร้างอิมเมจ
ขั้นแรก ให้กำหนดค่าบิลด์โดยใช้ยูทิลิตี menuconfig จาก ESP IDF
cd examples/lighting-app/esp32
idf.py menuconfigในเมนูแบบโต้ตอบ ให้กำหนดการตั้งค่าต่อไปนี้
Component config --->CHIP Device Layer --->Device Identification Options --->ตั้งค่า
Vendor IDเป็น VID ที่ Connectivity Standards Alliance (Alliance) กำหนดให้ตั้งค่า
Product IDเป็น PID ที่คุณตั้งค่าไว้ในการผสานรวม Matter ใน Google Home Developer Console
เปิดใช้แฟล็กผู้ขอ OTA โดยทำดังนี้
Component config -->CHIP Core -->System options --->เปิดใช้แฟล็กผู้ขอ OTA
[*] Enable OTA Requestorกด ESC 2 ครั้งเพื่อกลับไปที่เมนูระดับบนสุด
เปิดใช้แฟล็กการสร้างอิมเมจ Matter OTA โดยทำดังนี้
Component config -->CHIP Device Layer --->Matter OTA Image --->[*] Generate OTA IMAGE
ตั้งค่าหมายเลขเวอร์ชันโดยทำดังนี้
Application manager --->เลือก
[*] Get the project version from Kconfigตั้งค่า
Project version (NEW)เป็น1.0กด s เพื่อบันทึกการกำหนดค่า กด Enter 2 ครั้ง แล้วกด q เพื่อออกจาก
menuconfig
ตั้งค่าใบรับรองการทดสอบ
ทำตามขั้นตอนใน หัวข้อสร้างใบรับรองการทดสอบอุปกรณ์ Matter เพื่อสร้าง ใบรับรอง CD, DAC และ PAI
สร้างอุปกรณ์
ตอนนี้ให้เรียกใช้บิลด์และแฟลชอุปกรณ์โดยทำดังนี้
idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flashสร้างและอัปโหลดอิมเมจ OTA
ตอนนี้ให้เปลี่ยนการตั้งค่าบิลด์อีกครั้งเพื่อสร้างอิมเมจ OTA ใช้อิมเมจเดิม แต่เพิ่มหมายเลขเวอร์ชัน
เรียกใช้ menuconfig
idf.py menuconfigในเมนูแบบโต้ตอบ ให้อัปเดตรายการต่อไปนี้
Application manager --->- เลือก
[*] Get the project version from Kconfig - ตั้งค่า
Project version (NEW)เป็น2.0 - กด s เพื่อบันทึกการกำหนดค่า กด Enter 2 ครั้ง แล้วกด q เพื่อออกจาก
menuconfig
สร้างและดึงข้อมูลอิมเมจ ตัวอย่างนี้แสดงทั้งตำแหน่งของอิมเมจสำหรับ OTA และเอาต์พุตเมื่อแยกวิเคราะห์ด้วย ota_image_tool.py
cd build && /workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.binเอาต์พุตมีดังนี้
Magic: 1beef11e
Total Size: 1243360
Header Size: 64
Header TLV:
[0] Vendor Id: XXXXX (0x000)
[1] Product Id: XXXXX (0x000)
[2] Version: 2 (0x2)
[3] Version String: v2.0
[4] Payload Size: 1243280 (0x12f890)
[8] Digest Type: 1 (0x1)
[9] Digest: e367f4d71e2ccd554b9a399c864abbf2c039382ef1def1b986fb2f59a99923a8
เนื่องจาก Matter SDK ติดตั้งจากโฮสต์คอนเทนเนอร์ อิมเมจ OTA จึงพร้อมใช้งานในโฮสต์คอนเทนเนอร์
อัปโหลดอิมเมจ OTA ไปยัง Developer Console โดยทำตาม วิธีการอัปโหลด OTA
มอบหมายให้ Google Home และสังเกต OTA
ตรวจสอบว่าอุปกรณ์เชื่อมต่อกับเครื่อง Linux โฮสต์ด้วย USB ตัวอย่างต่อไปนี้แสดงการใช้ screen ของ GNU เพื่ออ่านบันทึกของอุปกรณ์
screen -L /dev/ttyUSB0 115200ซึ่งจะแสดงเอาต์พุตจากอุปกรณ์ไปยังเทอร์มินัลและเขียนเอาต์พุตเดียวกันลงในไฟล์บันทึกหน้าจอเริ่มต้นที่ชื่อ screenlog.0
คุณสามารถเปิดไฟล์ screenlog.0 ในโปรแกรมแก้ไขข้อความอื่นหรือแสดงในเชลล์อื่นด้วย cat, tail, more หรือ grep
กดปุ่มรีเซ็ตสีแดงที่ด้านข้างของอุปกรณ์เพื่อดูบันทึกจากการบูต
ในเอาต์พุตของอุปกรณ์ คุณควรเห็น VID และ PID ที่คุณตั้งค่าไว้ก่อนหน้านี้ รวมถึง URL ของรูปภาพคิวอาร์โค้ดที่จะใช้ในการมอบหมายอุปกรณ์
[0;32mI (2388) chip[DIS]: Advertise commission parameter vendorID=XXXXX productID=XXXX discriminator=3840/15 cm=1[0m
[0;32mI (1928) chip[SVR]: SetupQRCode: [MT:E59-000000000000000][0m
https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AE59-000000000000000
ตรวจสอบว่าฮับออนไลน์อยู่ในบ้าน
มอบหมายอุปกรณ์ด้วย Google Home app (GHA) โดยใช้คิวอาร์โค้ดจาก ลิงก์ที่ปรากฏในไฟล์บันทึก
ปล่อยให้อุปกรณ์ทำงานอย่างต่อเนื่องเป็นเวลาหลายนาทีหลังจากมอบหมาย
คุณควรเห็นเอาต์พุตบันทึกที่เกี่ยวข้องกับผู้ขอ OTA, การดาวน์โหลดอิมเมจ OTA และ OTAImageProcessor
หลังจากติดตั้งอิมเมจแล้ว ให้ตรวจสอบว่าเวลาคอมไพล์ของอิมเมจตรงกับเวลาคอมไพล์ของอิมเมจที่อัปโหลดไปยังคอนโซล และใหม่กว่าเวลาคอมไพล์ที่รายงานเมื่อบูตครั้งแรก การเรียกใช้ grep ด้วยรูปแบบต่อไปนี้ในโหมดนิพจน์ทั่วไปใน screenlog.0 จะแสดงกระบวนการ OTA
grep -E "(Compile time|OTA)" screenlog.0เอาต์พุตมีดังนี้
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 06:21:59
I (135558) chip[SWU]: OTA Requestor received AnnounceOTAProvider
I (540658) chip[SWU]: OTA image downloaded to offset 0x1a0000
I (541348) OTAImageProcessor: Applying, Boot partition set offset:0x1a0000
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 07:35:31
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 07:35:31
หลังจากเรียกใช้ครั้งแรก คุณสามารถทำตามขั้นตอนในส่วน
สร้างและอัปโหลดอิมเมจ OTA ซ้ำได้โดยไม่ต้องอัปโหลดอิมเมจใหม่
คราวนี้ให้ตั้งค่าเวอร์ชันกลับเป็น 1
เรียกใช้ menuconfig และในตัวเลือกเมนูแบบโต้ตอบ ให้ทำดังนี้
Component config -->CHIP Device Layer --->Device Identification Optionsตั้งค่า
Version Stringเป็นv1.0ตั้งค่า
Device Software Version Numberเป็น1กด s เพื่อบันทึกการกำหนดค่า แล้วกด q เพื่อออกจาก
menuconfig
นำอุปกรณ์ออกจากบ้านใน GHA
สร้างอิมเมจ หากยังไม่ได้สร้าง โดยทำดังนี้
idf.py buildแฟลชอิมเมจโดยทำดังนี้
idf.py -p /dev/ttyUSB0 erase_flashidf.py -p /dev/ttyUSB0 flashทำตามขั้นตอนในส่วนมอบหมายให้ Google Home และสังเกต OTA ซ้ำตามที่จำเป็น
ตรวจสอบการอัปเดตซอฟต์แวร์ OTA
คุณสามารถตรวจสอบเวอร์ชันซอฟต์แวร์ของอุปกรณ์ได้โดยใช้แอป Google Home (GHA) เมื่อมอบหมายอุปกรณ์แล้ว ให้ทำตามขั้นตอนต่อไปนี้
- กดการ์ดอุปกรณ์ค้างไว้ในหน้าจอหลักของ GHA
- แตะไอคอน ที่ด้านขวาบน
- แตะข้อมูลทางเทคนิค
- ตรวจสอบช่องเวอร์ชันซอฟต์แวร์