วิธีการต่อไปนี้ใช้ตัวอย่างแอปแสงสว่างจาก Matter SDK ร่วมกับบอร์ดพัฒนา M5Stack ESP32
การตั้งค่าสภาพแวดล้อมของบิลด์
ก่อนอื่น ให้โคลน SDK ของ Matter
ในตัวอย่างนี้ เราจะตรวจสอบคอมมิตขั้นต่ำที่รองรับสำหรับรุ่น 5 ของ Matter ของ 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 Workflow เพื่อพิจารณาว่าอิมเมจ 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สร้างและแฟลช
งานถัดไปคือการสร้างอิมเมจและแฟลชชุดพัฒนาเพื่อรับการอัปเดตเฟิร์มแวร์ Matter OTA
ซึ่งทำได้โดยการสร้างรูปภาพ
ก่อนอื่นให้กำหนดค่าบิลด์โดยใช้ยูทิลิตี 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 Requestor โดยทำดังนี้
Component config -->CHIP Core -->System options --->เปิดใช้แฟล็ก OTA Requestor
[*] Enable OTA Requestorกด ESC 2 ครั้งเพื่อกลับไปที่เมนูระดับบนสุด
เปิดใช้แฟล็กการสร้างอิมเมจ OTA ของ Matter ดังนี้
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
เนื่องจาก SDK ของ Matter ติดตั้งมาจากโฮสต์คอนเทนเนอร์ของคุณ อิมเมจ OTA จึงพร้อมใช้งานในโฮสต์คอนเทนเนอร์
อัปโหลดอิมเมจ OTA ไปยัง Developer Console โดยทำตามวิธีการอัปโหลด OTA
คอมมิชชันไปยัง Google Home และสังเกตการณ์ OTA
ตรวจสอบว่าอุปกรณ์เชื่อมต่อกับเครื่อง Linux โฮสต์ด้วย USB แล้ว ตัวอย่างต่อไปนี้แสดงการใช้ GNU screen เพื่ออ่านบันทึกของอุปกรณ์
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
ตรวจสอบว่า Hub ออนไลน์อยู่ในบ้าน
คอมมิชชันอุปกรณ์ด้วย Google Home app (GHA) โดยใช้คิวอาร์โค้ดจากลิงก์ที่ปรากฏในไฟล์บันทึก
ปล่อยให้อุปกรณ์ทำงานโดยไม่ถูกรบกวนเป็นเวลาหลายนาทีหลังจากเริ่มใช้งาน
คุณควรสังเกตเอาต์พุตบันทึกที่เกี่ยวข้องกับ OTA Requestor, การดาวน์โหลดอิมเมจ 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 buildFlash it:
idf.py -p /dev/ttyUSB0 erase_flashidf.py -p /dev/ttyUSB0 flashทำขั้นตอนในหัวข้อคอมมิชชันไปยัง Google Home และสังเกต OTA ซ้ำตามต้องการ
ตรวจสอบการอัปเดตซอฟต์แวร์ OTA
คุณตรวจสอบเวอร์ชันซอฟต์แวร์ของอุปกรณ์ได้โดยใช้แอป Google Home (GHA) เมื่อคอมมิชชันอุปกรณ์แล้ว ให้ทำตามขั้นตอนต่อไปนี้
- กดการ์ดอุปกรณ์ค้างไว้ในหน้าจอหลักของ GHA
- แตะไอคอน ที่ด้านขวาบน
- แตะข้อมูลทางเทคนิค
- ตรวจสอบช่องเวอร์ชันของซอฟต์แวร์