בדיקת OTA ב-Espressif ESP32

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

הגדרה של סביבת build

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

בדוגמה הזו אנחנו בודקים את ערך ההתחייבות המינימלי הנתמך לגרסה 5 של Google Home Matter:

$ 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 הכי מתאימה ל-build שלנו:

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

אנחנו מריצים קונטיינר מקובץ האימג' של Docker, מעבירים דגלים כדי לטעון את ה-SDK Matter בקונטיינר וכדי לספק גישה למכשיר ה-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

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

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

יצירה ו-Flash

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

כדי לעשות את זה, צריך ליצור תמונה.

קודם צריך להגדיר את ה-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':

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. הפעלת הסימון של 'מגיש הבקשה OTA' [*] 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.

גרסת המכשיר

עכשיו מריצים את ה-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

מאחר ש-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 של תמונת קוד ה-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

צריך לוודא שמרכז הנתונים נמצא אונליין בבית.

מציבים את Google Home app (GHA) במכשיר באמצעות קוד ה-QR מהקישור שמופיע בקובץ היומן.

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