בהוראות הבאות נעשה שימוש בדוגמה של אפליקציית התאורה מ-Matter SDK, יחד עם לוח פיתוח M5Stack ESP32.
הגדרת סביבת build
קודם כול, משכפלים את Matter SDK.
בדוגמה הזו, אנחנו בודקים את הגרסה המינימלית הנתמכת של 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
לאחר מכן, אנחנו בודקים את הגרסה שבה נעשה שימוש בתהליך העבודה של ESP32 GitHub כדי לקבוע איזה קובץ אימג' של 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
במאגר התגים, מאתחלים את Matter SDK ואת 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
בתפריט האינטראקטיבי, מגדירים את ההגדרות הבאות:
Component config --->
CHIP Device Layer --->
Device Identification Options --->
מגדירים את
Vendor ID
ל-VID שהוקצה לכם ב-Connectivity Standards Alliance (Alliance).מגדירים את
Product ID
למזהה התהליך שהגדרתם בשילוב Matter ב-Google Home Developer Console.
מפעילים את הדגל OTA Requestor:
Component config -->
CHIP Core -->
System options --->
הפעלת הדגל OTA Requestor
[*] Enable OTA Requestor
לוחצים פעמיים על 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.
הרכבת המכשיר
עכשיו מריצים את הבנייה ומעדכנים את המכשיר:
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
מכיוון ש-Matter SDK מותקן ממארח הקונטיינר, תמונת ה-OTA זמינה במארח הקונטיינר.
מעלים את קובץ האימג' של ה-OTA אל Developer Console לפי ההוראות להעלאת OTA.
Commission to Google Home and observe 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 Requestor, להורדת קובץ האימג' של 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
, ובאפשרויות האינטראקטיביות בתפריט:
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.
- מקישים על הסמל בפינה השמאלית העליונה.
- מקישים על מידע טכני.
- בודקים את השדה גרסת התוכנה.