# אחסן נתוני מיקום ![סקיצה של סקירה כללית של השיעור](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.he.jpg) > סקיצה מאת [ניטיה נאראסימהן](https://github.com/nitya). לחצו על התמונה לגרסה גדולה יותר. ## חידון לפני השיעור [חידון לפני השיעור](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## מבוא בשיעור הקודם למדתם כיצד להשתמש בחיישן GPS כדי ללכוד נתוני מיקום. כדי להשתמש בנתונים אלו לצורך הצגת מיקום של משאית עמוסת מזון ומסלולה, יש לשלוח אותם לשירות IoT בענן ולאחסן אותם במקום כלשהו. בשיעור זה תלמדו על הדרכים השונות לאחסן נתוני IoT, ותלמדו כיצד לאחסן נתונים משירות ה-IoT שלכם באמצעות קוד ללא שרת. בשיעור זה נעסוק ב: * [נתונים מובנים ולא מובנים](../../../../../3-transport/lessons/2-store-location-data) * [שליחת נתוני GPS ל-IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [נתיבי עיבוד חמים, פושרים וקרים](../../../../../3-transport/lessons/2-store-location-data) * [טיפול באירועי GPS באמצעות קוד ללא שרת](../../../../../3-transport/lessons/2-store-location-data) * [חשבונות אחסון של Azure](../../../../../3-transport/lessons/2-store-location-data) * [חיבור הקוד ללא שרת לאחסון](../../../../../3-transport/lessons/2-store-location-data) ## נתונים מובנים ולא מובנים מערכות מחשב מתמודדות עם נתונים, ונתונים אלו מגיעים במגוון צורות וגדלים. הם יכולים לנוע ממספרים בודדים, לכמויות גדולות של טקסט, לסרטונים ותמונות, ועד לנתוני IoT. נתונים בדרך כלל מתחלקים לשתי קטגוריות - *נתונים מובנים* ו*נתונים לא מובנים*. * **נתונים מובנים** הם נתונים עם מבנה מוגדר היטב ונוקשה שאינו משתנה, ובדרך כלל ממופים לטבלאות נתונים עם קשרים. דוגמה אחת היא פרטי אדם הכוללים את שמו, תאריך לידתו וכתובתו. * **נתונים לא מובנים** הם נתונים ללא מבנה מוגדר היטב, כולל נתונים שיכולים לשנות מבנה לעיתים קרובות. דוגמה אחת היא מסמכים כמו מסמכים כתובים או גיליונות אלקטרוניים. ✅ בצעו מחקר: האם אתם יכולים לחשוב על דוגמאות נוספות לנתונים מובנים ולא מובנים? > 💁 ישנם גם נתונים חצי-מובנים שהם מובנים אך אינם מתאימים לטבלאות נתונים קבועות. נתוני IoT נחשבים בדרך כלל לנתונים לא מובנים. דמיינו שאתם מוסיפים מכשירי IoT לצי רכבים של חווה מסחרית גדולה. ייתכן שתרצו להשתמש במכשירים שונים עבור סוגי רכבים שונים. לדוגמה: * עבור רכבי חווה כמו טרקטורים, תרצו נתוני GPS כדי לוודא שהם עובדים בשדות הנכונים. * עבור משאיות משלוחים המובילות מזון למחסנים, תרצו נתוני GPS וכן נתוני מהירות ותאוצה כדי לוודא שהנהג נוהג בבטחה, ונתוני זיהוי נהג והתחלה/עצירה כדי לוודא עמידה בחוקי עבודה מקומיים. * עבור משאיות קירור, תרצו גם נתוני טמפרטורה כדי לוודא שהמזון לא מתחמם או מתקרר יתר על המידה ונפגם במהלך ההובלה. נתונים אלו יכולים להשתנות כל הזמן. לדוגמה, אם מכשיר ה-IoT נמצא בתא הנהג של משאית, הנתונים שהוא שולח עשויים להשתנות כאשר הקרון משתנה, לדוגמה, שליחת נתוני טמפרטורה רק כאשר משתמשים בקרון קירור. ✅ אילו נתוני IoT נוספים ניתן ללכוד? חשבו על סוגי המטענים שמשאיות יכולות לשאת, כמו גם נתוני תחזוקה. נתונים אלו משתנים מרכב לרכב, אך כולם נשלחים לאותו שירות IoT לצורך עיבוד. שירות ה-IoT צריך להיות מסוגל לעבד נתונים לא מובנים אלו, לאחסן אותם בצורה שמאפשרת חיפוש או ניתוח, אך גם להתמודד עם מבנים שונים של נתונים אלו. ### אחסון SQL לעומת NoSQL בסיסי נתונים הם שירותים שמאפשרים לאחסן ולשאול נתונים. בסיסי נתונים מתחלקים לשני סוגים - SQL ו-NoSQL. #### בסיסי נתונים SQL בסיסי הנתונים הראשונים היו מערכות ניהול בסיסי נתונים יחסיים (RDBMS), או בסיסי נתונים יחסיים. הם ידועים גם כבסיסי נתונים SQL על שם שפת השאילתות המבנית (SQL) המשמשת לאינטראקציה איתם להוספה, הסרה, עדכון או שאילת נתונים. בסיסי נתונים אלו מורכבים מסכימה - סט מוגדר היטב של טבלאות נתונים, בדומה לגיליון אלקטרוני. כל טבלה מכילה עמודות עם שמות. כאשר מוסיפים נתונים, מוסיפים שורה לטבלה, ומכניסים ערכים לכל אחת מהעמודות. זה שומר על מבנה נוקשה מאוד - למרות שניתן להשאיר עמודות ריקות, אם רוצים להוסיף עמודה חדשה יש לעשות זאת בבסיס הנתונים, ולמלא ערכים עבור השורות הקיימות. בסיסי נתונים אלו הם יחסיים - כלומר טבלה אחת יכולה להיות בקשר עם טבלה אחרת. ![בסיס נתונים יחסי עם מזהה טבלת המשתמשים המקושר לעמודת מזהה המשתמש בטבלת הרכישות, ומזהה טבלת המוצרים המקושר לעמודת מזהה המוצר בטבלת הרכישות](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.he.png) לדוגמה, אם תאחסנו פרטים אישיים של משתמשים בטבלה, יהיה לכם מזהה ייחודי פנימי לכל משתמש המשמש בשורה בטבלה שמכילה את שם המשתמש וכתובתו. אם תרצו לאחסן פרטים נוספים על אותו משתמש, כמו הרכישות שלו, בטבלה אחרת, תהיה עמודה אחת בטבלה החדשה עבור מזהה המשתמש. כאשר תחפשו משתמש, תוכלו להשתמש במזהה שלו כדי לקבל את פרטיו האישיים מטבלה אחת, ואת הרכישות שלו מטבלה אחרת. בסיסי נתונים SQL אידיאליים לאחסון נתונים מובנים, וכאשר רוצים להבטיח שהנתונים תואמים לסכימה שלכם. ✅ אם לא השתמשתם ב-SQL בעבר, הקדישו רגע לקרוא עליו בעמוד [SQL בוויקיפדיה](https://wikipedia.org/wiki/SQL). כמה בסיסי נתונים SQL ידועים הם Microsoft SQL Server, MySQL, ו-PostgreSQL. ✅ בצעו מחקר: קראו על כמה מבסיסי נתונים SQL אלו ועל היכולות שלהם. #### בסיסי נתונים NoSQL בסיסי נתונים NoSQL נקראים כך מכיוון שאין להם את המבנה הנוקשה של בסיסי נתונים SQL. הם ידועים גם כבסיסי נתונים מסמכים מכיוון שהם יכולים לאחסן נתונים לא מובנים כמו מסמכים. > 💁 למרות שמם, חלק מבסיסי נתונים NoSQL מאפשרים להשתמש ב-SQL כדי לשאול את הנתונים. ![מסמכים בתיקיות בבסיס נתונים NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.he.png) בסיסי נתונים NoSQL אינם כוללים סכימה מוגדרת מראש שמגבילה כיצד הנתונים מאוחסנים, במקום זאת ניתן להכניס כל נתון לא מובנה, בדרך כלל באמצעות מסמכי JSON. מסמכים אלו יכולים להיות מאורגנים בתיקיות, בדומה לקבצים במחשב שלכם. כל מסמך יכול לכלול שדות שונים ממסמכים אחרים - לדוגמה, אם תאחסנו נתוני IoT מרכבי החווה שלכם, חלקם עשויים לכלול שדות עבור נתוני תאוצה ומהירות, אחרים עשויים לכלול שדות עבור הטמפרטורה בקרון. אם תוסיפו סוג משאית חדש, כמו אחת עם מאזניים מובנים למעקב אחר משקל התוצרת, מכשיר ה-IoT שלכם יוכל להוסיף שדה חדש זה והוא יוכל להישמר ללא שינויים בבסיס הנתונים. כמה בסיסי נתונים NoSQL ידועים כוללים את Azure CosmosDB, MongoDB, ו-CouchDB. ✅ בצעו מחקר: קראו על כמה מבסיסי נתונים NoSQL אלו ועל היכולות שלהם. בשיעור זה, תשתמשו באחסון NoSQL לאחסון נתוני IoT. ## שליחת נתוני GPS ל-IoT Hub בשיעור הקודם לכדתם נתוני GPS מחיישן GPS המחובר למכשיר ה-IoT שלכם. כדי לאחסן נתוני IoT אלו בענן, עליכם לשלוח אותם לשירות IoT. שוב, תשתמשו ב-Azure IoT Hub, אותו שירות IoT בענן שבו השתמשתם בפרויקט הקודם. ![שליחת טלמטריית GPS ממכשיר IoT ל-IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.he.png) ### משימה - שליחת נתוני GPS ל-IoT Hub 1. צרו IoT Hub חדש באמצעות המדרגה החינמית. > ⚠️ תוכלו לעיין ב[הוראות ליצירת IoT Hub מפרויקט 2, שיעור 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) אם תצטרכו. זכרו ליצור קבוצת משאבים חדשה. קראו לקבוצת המשאבים החדשה `gps-sensor`, ול-IoT Hub החדש שם ייחודי המבוסס על `gps-sensor`, כמו `gps-sensor-`. > 💁 אם עדיין יש לכם את ה-IoT Hub מהפרויקט הקודם, תוכלו להשתמש בו מחדש. זכרו להשתמש בשם ה-IoT Hub הזה ובקבוצת המשאבים שבה הוא נמצא כאשר תיצרו שירותים אחרים. 1. הוסיפו מכשיר חדש ל-IoT Hub. קראו למכשיר זה `gps-sensor`. קחו את מחרוזת החיבור של המכשיר. 1. עדכנו את קוד המכשיר שלכם כדי לשלוח את נתוני ה-GPS ל-IoT Hub החדש באמצעות מחרוזת החיבור של המכשיר מהשלב הקודם. > ⚠️ תוכלו לעיין ב[הוראות לחיבור המכשיר שלכם ל-IoT מפרויקט 2, שיעור 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) אם תצטרכו. 1. כאשר אתם שולחים את נתוני ה-GPS, עשו זאת בפורמט JSON הבא: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. שלחו נתוני GPS כל דקה כדי לא להשתמש במכסת ההודעות היומית שלכם. אם אתם משתמשים ב-Wio Terminal, זכרו להוסיף את כל הספריות הנדרשות ולהגדיר את הזמן באמצעות שרת NTP. הקוד שלכם יצטרך גם לוודא שהוא קרא את כל הנתונים מהפורט הסדרתי לפני שליחת מיקום ה-GPS, תוך שימוש בקוד הקיים מהשיעור הקודם. השתמשו בקוד הבא כדי לבנות את מסמך ה-JSON: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` אם אתם משתמשים במכשיר IoT וירטואלי, זכרו להתקין את כל הספריות הנדרשות באמצעות סביבה וירטואלית. עבור גם Raspberry Pi וגם מכשיר IoT וירטואלי, השתמשו בקוד הקיים מהשיעור הקודם כדי לקבל את ערכי קו הרוחב והאורך, ואז שלחו אותם בפורמט JSON הנכון עם הקוד הבא: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 תוכלו למצוא קוד זה בתיקיות [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) או [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). הריצו את קוד המכשיר שלכם וודאו שהודעות זורמות ל-IoT Hub באמצעות פקודת CLI `az iot hub monitor-events`. ## נתיבי עיבוד חמים, פושרים וקרים נתונים שזורמים ממכשיר IoT לענן אינם תמיד מעובדים בזמן אמת. חלק מהנתונים דורשים עיבוד בזמן אמת, נתונים אחרים יכולים להיות מעובדים זמן קצר לאחר מכן, ואחרים יכולים להיות מעובדים הרבה יותר מאוחר. הזרימה של נתונים לשירותים שונים שמעבדים אותם בזמנים שונים מכונה נתיבי עיבוד חמים, פושרים וקרים. ### נתיב חם הנתיב החם מתייחס לנתונים שצריך לעבד בזמן אמת או קרוב לזמן אמת. תשתמשו בנתוני נתיב חם עבור התראות, כמו קבלת התראה שמשאית מתקרבת למחסן, או שהטמפרטורה במשאית קירור גבוהה מדי. כדי להשתמש בנתוני נתיב חם, הקוד שלכם יגיב לאירועים ברגע שהם מתקבלים על ידי שירותי הענן שלכם. ### נתיב פושר הנתיב הפושר מתייחס לנתונים שיכולים להיות מעובדים זמן קצר לאחר קבלתם, לדוגמה לצורך דוחות או ניתוחים קצרי טווח. תשתמשו בנתוני נתיב פושר לדוחות יומיים על קילומטראז' רכבים, תוך שימוש בנתונים שנאספו ביום הקודם. נתוני נתיב פושר מאוחסנים ברגע שהם מתקבלים על ידי שירות הענן בתוך סוג כלשהו של אחסון שניתן לגשת אליו במהירות. ### נתיב קר הנתיב הקר מתייחס לנתונים היסטוריים, אחסון נתונים לטווח הארוך לצורך עיבוד בכל זמן שיידרש. לדוגמה, תוכלו להשתמש בנתיב הקר כדי לקבל דוחות קילומטראז' שנתיים לרכבים, או להריץ ניתוחים על מסלולים כדי למצוא את המסלול האופטימלי ביותר להפחתת עלויות דלק. נתוני נתיב קר מאוחסנים במחסני נתונים - בסיסי נתונים שתוכננו לאחסון כמויות גדולות של נתונים שלא ישתנו וניתן לשאול אותם במהירות ובקלות. בדרך כלל תהיה לכם משימה קבועה באפליקציית הענן שלכם שתפעל בזמן קבוע כל יום, שבוע או חודש כדי להעביר נתונים מאחסון נתיב פושר למחסן הנתונים. ✅ חשבו על הנתונים שאספתם עד כה בשיעורים אלו. האם הם נתוני נתיב חם, פושר או קר? ## טיפול באירועי GPS באמצעות קוד ללא שרת ברגע שנתונים זורמים ל-IoT Hub, תוכלו לכתוב קוד ללא שרת שיקשיב לאירועים שמתפרסמים לנקודת הקצה התואמת ל-Event Hub. זהו הנתיב הפושר - נתונים אלו יאוחסנו וישמשו בשיעור הבא לצורך דיווח על המסלול. ![שליחת טלמטריית GPS ממכשיר IoT ל-IoT Hub, ואז ל-Azure Functions דרך טריגר Event Hub](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.he.png) ### משימה - טיפול באירועי GPS באמצעות קוד ללא שרת 1. צרו אפליקציית Azure Functions באמצעות CLI של Azure Functions. השתמשו ב-runtime של Python, וצרו אותה בתיקייה בשם `gps-trigger`, והשתמשו באותו שם עבור שם פרויקט ה-Functions App. ודאו שאתם יוצרים סביבה וירטואלית לשימוש. > ⚠️ ניתן לעיין [בהוראות ליצירת פרויקט Azure Functions מפרויקט 2, שיעור 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) במידת הצורך. 1. הוסף טריגר אירוע IoT Hub שמשתמש בנקודת הקצה התואמת של Event Hub ב-IoT Hub. > ⚠️ ניתן לעיין [בהוראות ליצירת טריגר אירוע IoT Hub מפרויקט 2, שיעור 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) במידת הצורך. 1. הגדר את מחרוזת החיבור של נקודת הקצה התואמת של Event Hub בקובץ `local.settings.json`, והשתמש במפתח עבור ערך זה בקובץ `function.json`. 1. השתמש באפליקציית Azurite כאמולטור אחסון מקומי. 1. הרץ את אפליקציית הפונקציות שלך כדי לוודא שהיא מקבלת אירועים מהמכשיר GPS שלך. ודא שהמכשיר IoT שלך פועל ושולח נתוני GPS. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## חשבונות אחסון של Azure ![לוגו אחסון Azure](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.he.png) חשבונות אחסון של Azure הם שירות אחסון רב-תכליתי שיכול לאחסן נתונים במגוון דרכים שונות. ניתן לאחסן נתונים כבלובים, בתורים, בטבלאות או כקבצים, והכול בו-זמנית. ### אחסון בלובים המילה *Blob* מתייחסת לאובייקטים בינאריים גדולים, אך הפכה למונח עבור כל נתון לא מובנה. ניתן לאחסן כל נתון באחסון בלובים, החל ממסמכי JSON המכילים נתוני IoT ועד לקבצי תמונות וסרטים. אחסון בלובים כולל את המושג *מכולות*, דליים עם שמות שבהם ניתן לאחסן נתונים, בדומה לטבלאות במסד נתונים רלציוני. מכולות אלו יכולות להכיל תיקיות אחת או יותר לאחסון בלובים, וכל תיקייה יכולה להכיל תיקיות נוספות, בדומה לאופן שבו קבצים מאוחסנים בכונן הקשיח של המחשב שלך. תשתמש באחסון בלובים בשיעור זה כדי לאחסן נתוני IoT. ✅ בצע מחקר: קרא על [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### אחסון טבלאות אחסון טבלאות מאפשר לך לאחסן נתונים חצי-מובנים. אחסון טבלאות הוא למעשה מסד נתונים NoSQL, ולכן אינו דורש הגדרה מראש של טבלאות, אך הוא מיועד לאחסון נתונים באחת או יותר טבלאות, עם מפתחות ייחודיים להגדרת כל שורה. ✅ בצע מחקר: קרא על [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### אחסון תורים אחסון תורים מאפשר לך לאחסן הודעות בגודל של עד 64KB בתור. ניתן להוסיף הודעות לקצה האחורי של התור ולקרוא אותן מהקצה הקדמי. תורים מאחסנים הודעות ללא הגבלת זמן כל עוד יש מקום אחסון פנוי, כך שניתן לאחסן הודעות לטווח ארוך ואז לקרוא אותן בעת הצורך. לדוגמה, אם תרצה להריץ משימה חודשית לעיבוד נתוני GPS, תוכל להוסיף אותה לתור מדי יום במשך חודש, ואז בסוף החודש לעבד את כל ההודעות מהתור. ✅ בצע מחקר: קרא על [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) ### אחסון קבצים אחסון קבצים הוא אחסון של קבצים בענן, וכל אפליקציה או מכשיר יכולים להתחבר באמצעות פרוטוקולים סטנדרטיים בתעשייה. ניתן לכתוב קבצים לאחסון קבצים ואז למפות אותו ככונן במחשב האישי או ב-Mac שלך. ✅ בצע מחקר: קרא על [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## חיבור הקוד חסר השרת שלך לאחסון אפליקציית הפונקציות שלך צריכה כעת להתחבר לאחסון בלובים כדי לאחסן את ההודעות מ-IoT Hub. ישנן שתי דרכים לעשות זאת: * בתוך קוד הפונקציה, התחבר לאחסון בלובים באמצעות SDK של Python לאחסון בלובים וכתוב את הנתונים כבלובים. * השתמש בקישור פונקציה פלט כדי לקשר את ערך ההחזרה של הפונקציה לאחסון בלובים ולשמור את הבלוב באופן אוטומטי. בשיעור זה, תשתמש ב-SDK של Python כדי לראות כיצד לעבוד עם אחסון בלובים. ![שליחת טלמטריית GPS ממכשיר IoT ל-IoT Hub, ואז ל-Azure Functions דרך טריגר Event Hub, ואז שמירתה באחסון בלובים](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.he.png) הנתונים יישמרו כבלוב JSON בפורמט הבא: ```json { "device_id": , "timestamp" :