בדיקת OTA ב-Espressif ESP32

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

הגדרת סביבת build

קודם כול, משכפלים את 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

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

במאגר התגים, מאתחלים את Matter SDK ואת ESP IDF:

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

בנייה והפעלה

המשימה הבאה היא ליצור את קובץ האימג' ולהפעיל את ערכת הפיתוח כדי לקבל את עדכון הקושחה 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 למזהה התהליך שהגדרתם בשילוב Matter ב-Google Home Developer Console.

מפעילים את הדגל OTA Requestor:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. הפעלת הדגל OTA Requestor‏ [*] Enable OTA Requestor

  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.

הרכבת המכשיר

עכשיו מריצים את הבנייה ומעדכנים את המכשיר:

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

מכיוון ש-Matter SDK מותקן ממארח הקונטיינר, תמונת ה-OTA זמינה במארח הקונטיינר.

מעלים את קובץ האימג' של ה-OTA אל Developer Console לפי ההוראות להעלאת OTA.

Commission to Google Home and observe 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 Requestor, להורדת קובץ האימג' של OTA ול-OTAImageProcessor.

אחרי שהתמונה מותקנת, בודקים שזמן ההידור של התמונה זהה לזמן ההידור של התמונה שהועלתה למסוף, ושזמן ההידור מאוחר יותר מזמן ההידור שדווח באתחול הראשון. הדוגמה הבאה ממחישה את תהליך ה-OTA: הפעלת grep עם התבנית הבאה במצב ביטוי רגולרי ב-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 שבו מוצג שדה גרסת התוכנה