ทดสอบ OTA ใน Espressif ESP32

วิธีการต่อไปนี้ใช้ตัวอย่างแอปการจุดสว่างจาก Matter SDK พร้อมกับบอร์ดพัฒนา M5Stack ESP32

การตั้งค่าสภาพแวดล้อมของบิลด์

ก่อนอื่น ให้โคลน Matter SDK

ในตัวอย่างนี้ เราจะตรวจสอบคอมมิตขั้นต่ำที่รองรับสำหรับ Google Home Matterรุ่น 5

$ mkdir otaprep
$ cd otaprep
git 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

ต่อไป เราจะตรวจสอบเวอร์ชันที่ใช้ในเวิร์กโฟลว์ GitHub ของ ESP32 เพื่อดูว่าอิมเมจ Docker ใดเหมาะกับบิลด์ของเรามากที่สุด

$ cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1
            image: connectedhomeip/chip-build-esp32:0.5.99

เราเรียกใช้คอนเทนเนอร์จากอิมเมจ Docker โดยส่ง Flag เพื่อต่อเชื่อม 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 /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh

บิลด์และแฟลช

งานถัดไปคือการสร้างภาพและแฟลชชุดพัฒนาซอฟต์แวร์เพื่อรับการอัปเดตเฟิร์มแวร์ Matter OTA

โดยคุณต้องสร้างรูปภาพ

ก่อนอื่น ให้กำหนดค่าบิลด์โดยใช้ยูทิลิตี menuconfig จาก ESP IDF

cd examples/lighting-app/esp32
idf.py menuconfig

ในเมนูแบบอินเทอร์แอกทีฟ ให้กําหนดการตั้งค่าต่อไปนี้

  1. Component config --->

  2. CHIP Device Layer --->

  3. Device Identification Options --->

  4. ตั้งค่า Vendor ID เป็น VID ที่ Connectivity Standards Alliance (Alliance) กำหนด

  5. ตั้งค่า Product ID เป็น PID ที่คุณตั้งค่าไว้ในการผสานรวม Matter ใน Google Home Developer Console

เปิดใช้ Flag ผู้ขอ OTA

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. เปิดใช้ Flag ผู้ขอ OTA [*] Enable OTA Requestor

  5. กด ESC 2 ครั้งเพื่อกลับไปที่เมนูระดับบนสุด

เปิดใช้แฟล็กการสร้างรูปภาพ OTA Matter

  1. Component config -->

  2. CHIP Device Layer --->

  3. Matter OTA Image --->

  4. [*] Generate OTA IMAGE

ตั้งค่าหมายเลขเวอร์ชัน

  1. Application manager --->

  2. เลือก [*] Get the project version from Kconfig

  3. ตั้งค่า Project version (NEW) เป็น 1.0

  4. กด 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

ในเมนูแบบอินเทอร์แอกทีฟ ให้อัปเดตข้อมูลต่อไปนี้

  1. Application manager --->
  2. เลือก [*] Get the project version from Kconfig
  3. ตั้งค่า Project version (NEW) เป็น 2.0
  4. กด 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 ตัวอย่างต่อไปนี้แสดงการใช้ 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

ตรวจสอบว่าฮับในบ้านออนไลน์อยู่

ตรวจสอบอุปกรณ์ด้วย 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 แล้วเลือกตัวเลือกในเมนูแบบอินเทอร์แอกทีฟดังนี้

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. ตั้งค่า Version String เป็น v1.0

  5. ตั้งค่า Device Software Version Number เป็น 1

  6. กด s เพื่อบันทึกการกําหนดค่า แล้วกด q เพื่อออกจาก menuconfig

นำอุปกรณ์ออกจากบ้านใน GHA

สร้างอิมเมจ หากยังไม่ได้สร้าง

idf.py build

วิธีแสดงตัวอย่าง

idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

ทำตามขั้นตอนในค่าคอมมิชชันสำหรับ Google Home และสังเกต OTA ซ้ำตามที่จำเป็น

ตรวจสอบการอัปเดตซอฟต์แวร์ OTA

คุณสามารถตรวจสอบเวอร์ชันซอฟต์แวร์ของอุปกรณ์ได้โดยใช้แอป Google Home (GHA) เมื่อจัดเตรียมอุปกรณ์แล้ว ให้ทำตามขั้นตอนต่อไปนี้

  1. กดการ์ดอุปกรณ์บนหน้าจอหลักของ GHA ค้างไว้
  2. แตะไอคอน ที่ด้านขวาบน
  3. แตะข้อมูลทางเทคนิค
  4. ตรวจสอบช่องเวอร์ชันซอฟต์แวร์

หน้าจอแอป Google Home ที่แสดงช่องเวอร์ชันซอฟต์แวร์