בדיקת OTA ב-Espressif ESP32

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

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

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

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

מאחר שערכת ה-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

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

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

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

לאחר התקנת התמונה, חשוב לוודא שזמן ההידור של התמונה תואם לזה שהועלה למסוף, והוא מאוחר יותר זמן הידור שדווח באתחול הראשון. מתבצעת הפעלה של grep עם בדפוס הבא במצב ביטוי רגולרי (regex) ב-screenlog.0 אפשר לראות את ה-OTA process:

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