לקורס האינטראקטיבי ←

MQTT Bite › מקרה בוחן

🏭 מקרה בוחן מורחב

מתכננים IoT למפעל קטן עם MQTT

מפעל ״גליל פלסט״ מייצר מכסי פלסטיק עם ארבע מכונות. המטרה: לראות מהמשרד את מצב כל מכונה, לקבל התראות לטלפון, לשמור היסטוריה לדוחות ולשנות את מהירות קו האריזה מרחוק.

הפעילו את הסימולציה האינטראקטיבית ←

🏭 המכונות ומה הן מודדות

  • 🧪 מכונת הזרקה M1 (אולם הזרקה) — מייצרת מכסי פלסטיק. חום התבנית קריטי לאיכות. מדדים: טמפרטורת תבנית כל 2 שניות, מונה יחידות כל דקה, ומצב המכונה.
  • ⚙️ מכונת CNC M2 (אולם עיבוד) — מעבדת תבניות. רעידות חריגות מעידות על שחיקת כלי. מדדים: רעידות ציר כל שנייה, ומצב המכונה.
  • 📦 קו אריזה M3 (אזור אריזה) — אורז את המכסים לקרטונים. ניתן לשנות את מהירות הקו מהמשרד. מדדים: קרטונים שנארזו כל דקה, ומצב המכונה.
  • 💨 מדחס אוויר C1 (תשתיות) — מספק אוויר דחוס לכל המכונות. נפילת לחץ עוצרת את הייצור. מדדים: לחץ אוויר כל 5 שניות, ומצב המכונה.

🏗️ ארכיטקטורה

לכל מכונה שער (Gateway) שקורא את נתוני הבקר ומפרסם אותם ב-MQTT. ה-Broker (Mosquitto) יושב על שרת מקומי בתוך המפעל ומאזין ב-TLS על פורט 8883, כך שהייצור וההתראות ממשיכים לעבוד גם כשהאינטרנט נופל. הצרכנים (לוח בקרה, אפליקציית תחזוקה, מסד נתונים היסטורי ומנהל תשתיות) לא מכירים את המכונות — רק את הטופיקים.

🌳 עץ הטופיקים

מבנה אחיד: galil/plant1/<area>/<machine>/<data>, למשל galil/plant1/molding/m1/temperature. פקודות יושבות תחת cmd/ נפרד, למשל galil/plant1/packing/m3/cmd/speed, כדי שיהיה קל להגביל אותן בהרשאות.

👥 מי נרשם למה (Wildcards)

צרכןמסנניםמטרה
📊 לוח בקרה במשרדgalil/plant1/+/+/status
galil/plant1/+/+/alarm
מצב כל המכונות והתראות — בלי טלמטריה גולמית.
🔧 אפליקציית תחזוקהgalil/plant1/+/+/alarm
galil/plant1/machining/m2/vibration
רק התראות, ובנוסף רעידות ה-CNC לתחזוקה מונעת.
🗄️ מסד נתונים היסטוריgalil/plant1/#שומר הכול לניתוח ודוחות.
⚡ מנהל תשתיותgalil/plant1/utilities/#מעקב אחר המדחס ומערכות התשתית בלבד.

🛡️ QoS ו-Retained לכל סוג הודעה

סוגQoSRetainedלמה
🌡️ טלמטריה שוטפת0לאערך חדש מגיע בעוד שנייה-שתיים, כך שאיבוד מדידה בודדת לא מזיק. QoS 0 הוא הקל והמהיר. אין טעם לשמור (Retain) ערך שמתיישן מהר.
🟢 מצב מכונה1כןהמצב חייב להגיע (QoS 1), ולוח בקרה שנפתח עכשיו צריך לראות מיד את המצב האחרון — בדיוק התפקיד של Retained. זה גם הנושא שבו ה-LWT יפרסם "offline".
🚨 התראה1 (או 2)לאהתראה אסור לאבד, לכן לפחות QoS 1 (גם QoS 2 סביר). היא אירוע חד-פעמי, ולכן לא Retained — אחרת כל מנוי חדש יקבל התראה ישנה כאילו היא קורית עכשיו.
🔢 מונה ייצור1כןנשלח פעם בדקה ומשמש לדוחות, לכן כדאי שיגיע (QoS 1). כ-Retained, מסך חדש מציג מיד את הסכום האחרון בלי לחכות דקה.
🎛️ פקודה למכונה1 (או 2)לאפקודה חייבת להגיע (QoS 1 לפחות). לעולם לא Retained: אם הקו יתנתק ויתחבר מחדש, הוא יקבל שוב את הפקודה השמורה ויבצע אותה שוב — בלי שאיש ביקש.

ה-LWT של כל שער מוגדר על טופיק ה-status שלו עם התוכן offline, QoS 1 ו-Retained, כך שנפילה פתאומית של מכונה מופיעה בכל לוח בקרה — גם כזה שייפתח מאוחר יותר.

🔐 אבטחה

לקוחClientIDפרסוםהרשמה
🧪 שער מכונה M1plant1-m1-gwgalil/plant1/molding/m1/#—
📦 שער קו אריזה M3plant1-m3-gwgalil/plant1/packing/m3/#galil/plant1/packing/m3/cmd/#
📊 לוח בקרהplant1-dashboardgalil/plant1/packing/m3/cmd/#galil/plant1/#
🔧 אפליקציית תחזוקהplant1-maint-<שם>—galil/plant1/+/+/alarm

TLS על פורט 8883, שם משתמש וסיסמה לכל לקוח, ClientID ייחודי (כפילות גורמת ל-Broker לנתק את הלקוח הקודם בלולאה), ורק לוח הבקרה רשאי לפרסם פקודות. עצירת חירום נשארת כפתור פיזי מקומי — MQTT משמש לניטור ולשינויי הגדרות, לא לבטיחות.