בהוראות הבאות נעשה שימוש בדוגמה של אפליקציית התאורה מ-SDK של Matter, יחד עם לוח פיתוח M5Stack ESP32.
הגדרת סביבת build
קודם כול, צריך לשכפל את ה-SDK של Matter.
בדוגמה הזו, אנחנו בודקים את השמירה המינימלית הנתמכת של 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
בשלב הבא, בודקים את הגרסה שבה נעשה שימוש בתהליך העבודה ב-GitHub של ESP32 כדי לקבוע איזה קובץ אימג' של 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
בקונטיינר, מאתחלים את ה-SDK של Matter ואת ה-IDF של ESP:
cd /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh
פיתוח והעברה (flash)
המשימה הבאה היא ליצור את קובץ האימג' ולבצע פלאש של ערכת הפיתוח כדי לקבל את עדכון הקושחה Matter ב-OTA.
לשם כך, צריך ליצור קובץ אימג'.
קודם מגדירים את ה-build באמצעות הכלי menuconfig
מ-ESP IDF.
cd examples/lighting-app/esp32
idf.py menuconfig
בתפריט האינטראקטיבי, מגדירים את ההגדרות הבאות:
Component config --->
CHIP Device Layer --->
Device Identification Options --->
מגדירים את
Vendor ID
כ-VID שהוקצה על ידי Connectivity Standards Alliance (Alliance).מגדירים את
Product ID
לערך ה-PID שהגדרתם בשילוב Matter בקטע Google Home Developer Console.
מפעילים את הדגל OTA Requestor:
Component config -->
CHIP Core -->
System options --->
הפעלת הדגל
[*] Enable OTA Requestor
של מגיש הבקשה ל-OTAלוחצים על ESC פעמיים כדי לחזור לתפריט ברמה העליונה.
מפעילים את הדגל Matter ליצירת קובץ אימג' לעדכון OTA:
Component config -->
CHIP Device Layer --->
Matter OTA Image --->
[*] Generate OTA IMAGE
מגדירים את מספר הגרסה:
Application manager --->
בחירה באפשרות
[*] Get the project version from Kconfig
מגדירים את
Project version (NEW)
לערך1.0
מקישים על 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
בתפריט האינטראקטיבי, מעדכנים את הפרטים הבאים:
Application manager --->
- בחירה באפשרות
[*] Get the project version from Kconfig
- מגדירים את
Project version (NEW)
לערך2.0
- מקישים על 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
עם הדפוס הבא במצב 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
ובוחרים באפשרויות בתפריט האינטראקטיבי:
Component config -->
CHIP Device Layer --->
Device Identification Options
מגדירים את
Version String
להיותv1.0
.מגדירים את
Device Software Version Number
להיות1
.מקישים על 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). אחרי שמפעילים מכשיר, פועלים לפי השלבים הבאים:
- לוחצים לחיצה ארוכה על המשבצת של המכשיר במסך הראשי GHA
- מקישים על הסמל בפינה השמאלית העליונה.
- מקישים על מידע טכני.
- בודקים את השדה גרסת התוכנה