הודעות שמורות (Retained) וצוואה אחרונה (LWT)
סנכרון מצב מיידי למנויים חדשים, וזיהוי ניתוקים פתאומיים בעזרת Keep-Alive. בעולם של מיליוני מכשירים שמתחברים ומתנתקים, עולות שתי בעיות קריטיות: כיצד מכשיר חדש שמתחבר מקבל מיד את המצב הנוכחי של המערכת, וכיצד יודעים שמכשיר מרוחק התנתק בגלל תקלה ולא בכוונה.
פתחו את היחידה האינטראקטיבית עם הסימולטור ←🎥 סרטון ההדרכה
🖼️ היחידה באינפוגרפיקה

💡 מושגי מפתח
Retained Messages (הודעות שמורות)
כאשר Publisher שולח הודעה עם דגל Retain=true, הברוקר שומר את ההודעה האחרונה בנושא זה בזיכרון. בכל פעם שמנוי חדש נרשם לנושא, הברוקר שולח לו מיד את ההודעה השמורה!
✏️ דוגמה: מנורה חכמה שולחת לטופיק "light/status" את הערך "ON" עם Retain=true. טלפון שנפתח כעת ומאזין לטופיק מקבל מיד את המצב הנוכחי מבלי להמתין לעדכון הבא.
כיצד מוחקים Retained Message?
כדי למחוק הודעה שמורה מברוקר, יש לשלוח הודעת PUBLISH לאותו נושא עם Payload ריק (Zero-byte payload) ודגל Retain=true. הברוקר ימחק את ההודעה השמורה מזיכרונו.
✏️ דוגמה: mosquitto_pub -t "home/status" -n -r (הפרמטר -n מציין null/empty והפרמטר -r מציין retain).
Last Will and Testament (LWT - צוואה אחרונה)
בעת שליחת פאקטת CONNECT, הלקוח מפקיד בידי ה-Broker "צוואה" – נושא, תוכן, QoS ודגל Retain. אם החיבור מתנתק באופן בלתי תקין (Unclean Disconnect, כגון הפסקת חשמל או ניתוק אינטרנט), ה-Broker משדר אוטומטית את הצוואה לכל המנויים!
✏️ דוגמה: חיישן מפקיד צוואה בטופיק "sensor/status" עם הערך "OFFLINE". בעת התחברות תקינה הוא מפרסם "ONLINE" עם Retain.
Keep-Alive ו-PINGREQ / PINGRESP
הלקוח מגדיר ערך Keep-Alive (בשניות). אם אין תעבורת הודעות רגילה, הלקוח שולח פאקטת PINGREQ והשרת משיב ב-PINGRESP. אם עובר 1.5 פעמים זמן ה-Keep-Alive ללא אות חיים – הברוקר סוגר את החיבור ומפעיל את ה-LWT.
✏️ דוגמה: Keep-Alive של 60 שניות: אם תוך 90 שניות אין שום פאקטה – החיבור מוכרז כמת.
📌 מה לקחת מהיחידה
- Retained Message מאפשרת לספק לכל מנוי חדש את הסטטוס העדכני של המערכת מיד בהרשמה.
- מחיקת הודעה שמורה מתבצעת על ידי פרסום תוכן ריק עם retain=true.
- LWT מפוקד בעת ה-CONNECT ומפורסם על ידי הברוקר רק בעת ניתוק פתאומי ולא נקי.
❓ שאלות ותשובות
מתי מופעלת הודעת ה-LWT (Last Will and Testament) על ידי הברוקר?
רק כאשר הלקוח מתנתק באופן בלתי צפוי ללא שליחת DISCONNECT (Unclean Disconnect). אם לקוח שולח פאקטת DISCONNECT מסודרת, הברוקר זורק את ה-LWT כי הניתוק היה מתוכנן. ה-LWT מופעל אך ורק אם החיבור קרס במפתיע (נפילת TCP, פסק זמן של Keep-Alive).
כיצד מסירים (מנקים) Retained Message שנשמרה בברוקר?
מפרסמים לאותו נושא הודעה בעלת תוכן ריק (Empty Payload) עם Retain=true. לפי תקן MQTT, שליחת הודעת PUBLISH לאותו טופיק עם אורך תוכן 0 (Empty) ודגל Retain=true מורה לברוקר למחוק את הערך השמור.
כמה הודעות Retained שומר ה-Broker עבור כל נושא בודד?
הודעה אחת אחרונה בלבד. הברוקר שומר אך ורק את ההודעה האחרונה ביותר שפורסמה באותו נושא עם דגל Retain.
→ יחידה קודמת: רמות איכות השירות (QoS 0, 1, 2) · יחידה הבאה: אבטחה, ניהול סשנים ו-Best Practices ←