בדיקת OTA ב-Espressif ESP32

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

הגדרת סביבת ה-build

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

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

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

עצירה והפעלה של קונטיינר Docker של Matter

בכל פעם שמריצים פקודת 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 ואת 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 פעמיים כדי לחזור לתפריט הראשי.

מפעילים את הדגל ליצירת קובץ אימג' מ-OTA של Matter:

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

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 עם התבנית הבאה במצב ביטוי רגולרי ב-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 שבו מוצג השדה של גרסת התוכנה