שפת הנושאים (Topics) ו-Wildcards
מבנה עץ הטופיקים, סינון באמצעות פלוס וסולמית, וחוקי נושאי מערכת. נושא (Topic) ב-MQTT הוא מחרוזת UTF-8 היררכית המופרדת באמצעות לוכסנים ("/"), בדומה לנתיבי קבצים במערכת הפעלה. תכנון נכון של מבנה הנושאים הוא לב הארכיטקטורה של כל מערכת IoT.
פתחו את היחידה האינטראקטיבית עם הסימולטור ←🎥 סרטון ההדרכה
🖼️ היחידה באינפוגרפיקה

💡 מושגי מפתח
מבנה היררכי וחוקי יסוד
הנושא בנוי מרמות (Levels) מופרדות ב-"/". MQTT רגיש לאותיות גדולות/קטנות (Case-Sensitive), ולכן "Home/Temp" שונה לחלוטין מ-"home/temp". מומלץ להימנע מרווחים ומתווים שאינם ASCII.
✏️ דוגמה: מבנה מומלץ: factory/building-a/line-3/motor-1/vibration
ה-Wildcard החד-רמתי: "+"
הסימן "+" מייצג בדיוק רמה אחת בודדת בהיררכיית הנושא. ניתן להשתמש בו בכל מקום בעץ ואף מספר פעמים באותו מסנן.
✏️ דוגמה: המסנן "home/+/temperature" יתפוס את "home/kitchen/temperature" וגם את "home/bedroom/temperature", אך לא יתפוס את "home/kitchen/north/temperature".
ה-Wildcard הרב-רמתי: "#"
הסימן "#" מייצג אפס או יותר רמות עומק. חוק ברזל: "#" חייב להיות התו האחרון במסנן וברמה משלו!
✏️ דוגמה: המסנן "factory/line-1/#" יתפוס כל הודעה שמתחילה ב-"factory/line-1", כולל "factory/line-1/sensor", "factory/line-1/robot/arm/speed" ואפילו "factory/line-1".
נושאי מערכת: $SYS/
נושאים המתחילים בתו "$" שמורים לסטטיסטיקות פנימיות של הברוקר (כגון מספר הלקוחות המחוברים, עומס זיכרון, וקצב הודעות). חוק חשוב: הרשמה ל-"#" אינה תופסת נושאי $SYS!
✏️ דוגמה: $SYS/broker/clients/connected
📌 מה לקחת מהיחידה
- הטופיקים הם Case-Sensitive ומופרדים בלוכסן ("/") בלבד.
- + תופס רמה בודדת בכל מקום; # תופס את כל שאר הרמות וחייב להופיע בסוף.
- נושאי $SYS הם שמורים ואינם נתפסים על ידי # ברמת השורש.
❓ שאלות ותשובות
איזה מהמסננים הבאים תקין לפי תקן MQTT ויקלוט את "home/kitchen/temp"?
home/+/temp. הסימן "+" תופס בדיוק רמה אחת ("kitchen"), ולכן "home/+/temp" מתאים. לעומת זאת, "#" חייב להיות רק בסוף המחרוזת ולעולם לא באמצע.
האם הרשמה למסנן "#" תקלוט הודעות מנושא המערכת "$SYS/broker/uptime"?
לא, נושאים המתחילים ב-$ אינם נלכדים על ידי Wildcard ברמת השורש. תקן MQTT אוסר במפורש על שרשור נושאי $SYS לתוך הרשמת # של לקוחות רגילים, כדי למנוע הצפת מנויים בטלמטריה פנימית.
מה הבעיה בטופיק המתחיל בלוכסן: "/home/sensors/temp"?
הוא יוצר רמה ראשונה ריקה מיותרת (Empty Level) ומסבך שימוש ב-Wildcards. לוכסן מוביל מייצר רמה ריקה ראשונה (כלומר "" לפני ה-home). זהו אנטי-פטרן מוכר שמבזבז בתים ומקשה על כתיבת פילטרים מדויקים.
→ יחידה קודמת: מהפכת ה-MQTT וארכיטקטורת Pub/Sub · יחידה הבאה: רמות איכות השירות (QoS 0, 1, 2) ←