בדיקת OTA ב-Espressif ESP32

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

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

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

פיתוח ופלאש

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

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 עם התבנית הבאה במצב ביטוי רגולרי ב-screenlog.0 יכול להדגים את תהליך ה-OTA:

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