בדיקת OTA ב-Espressif ESP32

בהוראות הבאות נעשה שימוש בדוגמה של אפליקציית התאורה מ-SDK של Matter, יחד עם לוח פיתוח M5Stack ESP32.

הגדרת סביבת build

קודם כול, צריך לשכפל את ה-SDK של Matter.

בדוגמה הזו, אנחנו בודקים את השמירה המינימלית הנתמכת של 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, מעבירים דגלים כדי לטעון את 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

לחלופין, אפשר להתחיל סשן root באמצעות:

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

אתחול ה-SDK

בקונטיינר, מאתחלים את ה-SDK של Matter ואת ה-IDF של ESP:

cd /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh

פיתוח והעברה (flash)

המשימה הבאה היא ליצור את קובץ האימג' ולבצע פלאש של ערכת הפיתוח כדי לקבל את עדכון הקושחה Matter ב-OTA.

לשם כך, צריך ליצור קובץ אימג'.

קודם מגדירים את ה-build באמצעות הכלי 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. הפעלת הדגל [*] Enable OTA Requestor של מגיש הבקשה ל-OTA

  5. לוחצים על ESC פעמיים כדי לחזור לתפריט ברמה העליונה.

מפעילים את הדגל 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 פעמיים ואז על q כדי לצאת מ-menuconfig.

הגדרת אישורי בדיקה

פועלים לפי השלבים המפורטים במאמר יצירת אישורי בדיקה של מכשירי Matter כדי ליצור אישורי CD,‏ DAC ו-PAI.

פיתוח המכשיר

עכשיו מריצים את ה-build ומבצעים איפוס (flash) של המכשיר:

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

יצירת קובץ האימג' לעדכון OTA והעלאה שלו

עכשיו משנים שוב את הגדרות ה-build כדי ליצור קובץ אימג' לעדכון OTA. משתמשים באותה תמונה, אבל עם מספר גרסה מוגדל.

מריצים את menuconfig.

idf.py menuconfig

בתפריט האינטראקטיבי, מעדכנים את הפרטים הבאים:

  1. Application manager --->
  2. בחירה באפשרות [*] Get the project version from Kconfig
  3. מגדירים את Project version (NEW) לערך 2.0
  4. מקישים על s כדי לשמור את ההגדרות, מקישים על Enter פעמיים ואז מקישים על 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 לתמונת קוד ה-QR שבה תשתמשו כדי להפעיל את המכשיר.

[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) באמצעות קוד ה-QR מהקישור שמופיע בקובץ היומן.

אחרי ההפעלה, צריך לאפשר למכשיר לפעול ללא הפרעה במשך כמה דקות. צריך לבדוק את הפלט של היומן שקשור לבקשות OTA, להורדת קובץ אימג' ב-OTA ול-OTAImageProcessor.

אחרי התקנת התמונה, שימו לב שזמן הידור התמונה תואם לזה של התמונה שהועלו למסוף, והוא מאוחר יותר מזמן הידור התמונה שדווח בזמן האתחול הראשון. כדי להמחיש את תהליך ה-OTA, אפשר להריץ את grep עם הדפוס הבא במצב regex ב-screenlog.0:

$ 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 שבו מוצג השדה של גרסת התוכנה