ทดสอบ OTA ใน Espressif ESP32

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

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

ขั้นแรก ให้โคลน Matter SDK

ในตัวอย่างนี้ เราจะตรวจสอบคอมมิตที่รองรับขั้นต่ำสำหรับ Google Home's Matter Release 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

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

cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1
image: 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 /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh

สร้างและแฟลช

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

หากต้องการดำเนินการนี้ คุณต้องสร้างอิมเมจ

ขั้นแรก ให้กำหนดค่าบิลด์โดยใช้ยูทิลิตี 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

เปิดใช้แฟล็ก OTA Requestor โดยทำดังนี้

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. เปิดใช้แฟล็ก OTA Requestor [*] Enable OTA Requestor

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

เปิดใช้แฟล็กการสร้างอิมเมจ Matter OTA โดยทำดังนี้

  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 ในเครื่องมือแก้ไขข้อความอื่นหรือแสดงใน Shell อื่นด้วย 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 แสดงช่องเวอร์ชันซอฟต์แวร์