Esp8266 ופרוטוקול האינטרנט mqtt

בלוג adafruit-mqtt-esp8266

Esp8266 הוא לוח פיתוח קטן בעל חיבור Wifi מובנה שנותן לנו לשלוח ולקבל נתונים דרך האינטרנט. MQTT הוא פרוטוקול אינטרנט מהיר וקל משקל שפותח במיוחד לאינטרנט של הדברים.

פרוטוקול MQTT

לפרוטוקול זה יש כמה יתרונות וכמה חסרונות לעומת הפרוטוקול הנפוץ שכולנו מכירים – HTTP. בואו נעשה ביניהם השוואה :

HTTP:

  • ותיק אמין ונמצא בכל מקום. הפרוטוקול של האינטרנט
  • פשוט מאוד להפעלה
  • עובד על ארכיטקטורה של בקשה/תגובה – request/response
  • הוא אמין בעיקר בזכות המידע העודף שנשלח בבקשה ובתגובה, אבל זה גם הופך אותו ליותר כבד כי יותר מידע נשלח
  • מתאים לתקשורת בין נקודה לנקודה
  • הוא פרוטוקול כללי ולא תמיד מתאים למקרים ספציפיים כמו למשל לאינטרנט של הדברים. הוא פותח לפני 25 שנה כשעוד לא היה מושג כזה
  • לא בהכרח מתאים למקרים בהם יש תקשורת תכופה וקלת משקל(מעט בייטים) כמו במקרה של חיישנים ותקשורת בין מכונות(M2M)

MQTT:

  • פרוטוקול חדש יחסית ויותר נדיר
  • יותר קשה להתקין אותו בפעם הראשונה, יותר מסובך להפעלה
  • מתאים לתקשורת בין הרבה נקודות שמתקשרות אחת עם השנייה דרך מתווך(broker) במיוחד יחס של אחד לרבים
  • מהיר וקל משקל, פחות בייטים נשלחים
  • המכשירים לא יודעים אחד על השני
  • הלקוח מתחיל תקשורת והיא נשארת פתוחה בצורה רציפה
  • אידיאלי לאינטרנט של הדברים ולתקשורת בין מכונות במיוחד כשיש הרבה מהם

בדרך כלל מתאים להשתמש ב MQTT כשהמשאבים שלנו מוגבלים או כשהארכיטקטורה היא שונה מהרגיל לדוגמה:

  • המכשירים נמצאים בשטח לדוגמה מופעלים סולארית
  • כשהם עובדים על בטריה
  • כשהחיבור לאינטרנט אינו אמין
  • כשצריך תקשורת מהירה בין הרבה מכשירים
  • כשאנחנו משלמים על נפח גלישה לדוגמה תקשורת סלולרית
  • כשהארכיטקטורה היא של תקשורת יחס בין אחד לרבים

מאפיינים

דפוס העבודה בMQTT הוא של publish/subscribe. כל מכשיר יכול לפרסם מידע בנושא מסוים לכל שאר המכשירים שעשו מנוי לנושא זה,  ולהפך, הוא יכול לעשות מנוי לנושא מסוים. כל המידע הזה עובר דרך המתווך שמקושר לכל המכשירים, וזוהי כל העבודה שלו.

blog-publish-subscribe

 

בואו נניח לדוגמה שאנחנו בונים מערכת של בית חכם  – אנחנו רוצים שחיישנים מסוימים בחדר יפעילו התקנים שנמצאים בחדרים שונים. החיישנים מפרסמים מידע בנושא מסוים לדוגמה כמות אור, בעוד מכשירים אחרים עושים מנוי לנושא זה. אפשר ליצור כמה נושאים ותתי נושאים שרוצים כך למשל אפשר ליצור נושא  – בית/מטבח/כמות אור וגם בית/מטבח/חיישן גז .המכשירים שיעשו מנוי לנושאים אלה יוכלו לקבל מידע על חיישן הגז במטבח על ידי מנוי בית/מטבח/חיישן גז. אם רוצים לכלול את שניהם אפשר לרשום במנוי בית/מטבח/+ . זה ייתן מידע על כל החיישנים במטבח. עוד אפשרות היא לקבל את כל תתי הנושאים בבית ע"י בית/# . זה יכול לתת לנו את כל המידע מכל החיישנים בכל החדרים.

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

מתווך(broker)

המתווך הוא המוח של המערכת והוא זה ששולח מידע לכל המכשירים לפי המנוי שעשו. ישנם כל מיני מתווכים שאפשר להשתמש בהם כמו למשל cloudmqtt או hivemq . אין לי נסיון איתם אז אני לא יכול להגיב על הביצועים שלהם. ישנו מתווך בקוד פתוח שנקרא מוסקיטו שאפשר להתקין על כל שרת אינטרנט כולל הרספברי פיי והניסיון שלי איתו הוא מוצלח. ההתקנה שלו יכולה קצת להסתבך אבל אחרי שהוא מותקן הוא פשוט עובד ומתחיל להקשיב בפורט 1883.

מכל המתווכים הקיימים בחרתי דווקא בזה של adafruit שנמצא בגרסת בטא כי הממשק שלו נראה מצוין.

adafruit.io

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

בפרויקט שנבצע נשלח באמצעות Esp8266 נתונים של חיישן אור כל כמה שניות וגם נקבל אליו פקודה להדליק נורה וכל זה בפרוטוקול MQTT. נתחיל דווקא בבניית ממשק המשתמש, והגדרות ערוצי השידור(feeds). לחצו על your feeds ולאחר מכן  create feed. ניצור שני נושאים שאחד מהם הוא photocell והשני הוא onoff.

 

blog-create-feed

 

עכשיו ניצור ממשק משתמש…לחצו על Your Dashboard>create dashboard . תנו לו שם וזה יכניס אתכם לממשק.

 

 

blog-create-dashboard

 

בצד ימין של הממשק ישנם כפתורים לעיצוב הממשק, לחצו על + והוסיפו כפתור לשינוי מצב ובחרו בשבילו את ערוץ onoff. עכשיו צרו שעון מחוונים(guage) וקשרו אותו לערוץ photocell. תנו לו ערכים שבין 0-1023 .  שימו לב לריבועים שרצים למעלה, זה אומר שהממשק כבר פועל ומחכה לנתונים.

 

blog-create-photocell

 

 

דבר אחרון שנעשה בממשק זה לקחת את קוד המשתמש ע"י לחיצה על המפתח הצהוב, העתיקו את הקוד.

כך הממשק הסופי אמור להראות:

 

 

blog-esp8266-dashboard

 

 

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

 

node-mcu-pins
פין 4 בתוכנה הוא פין 2 בלוח.

 

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

בהעדפות ישנה אפשרות לייבא ספריות על ידי הכנסת כתובת. הכניסו את הכתובת של החבילה ואחרי זה התקינו אותה ע"י ניהול ספריות שנמצאת בכלים:

 

blog-additional-url

 

את הספריה של adfruit אפשר להוריד על ידי סקיצה > הוסף ספריה > ניהול ספריות ושם לחפש אותה לפי השם.

אחרי שהורדתם פתחו מחדש את סביבת הפיתוח ופתחו את הדוגמה של adafruit mqtt_esp8266. בחרו גם בלוח nodemcu 0.9 או בלוח שאתם משתמשים בו.

 

blog-mqtt-esp8266

 

הכניסו את שם הרשת הביתית, את הססמה, וגם את שם המשתמש והססמה מ adafruit. קודם כל תעלו את הסקיצה ופתחו תקשורת טורית(קצב השידור הוא 115200) לראות בכלל אם יש חיבוריות, כי הרבה דברים יכולים לא להצליח בדרך.  אם יש חיבוריות מצבכם טוב.

כתיבת הקוד

 

 

עכשיו נתחיל לשפצר את הקוד, הוסיפו את שתי השורות לsetup:

pinMode(2, OUTPUT); // led pin
pinMode(A0, INPUT); // light sensor pin

 

אחרי השורה Serial.println((char *)onoffbutton.lastread); הוסיפו את הקוד:

if ( onoffbutton.lastread[1] == 78){ // check for ON
  digitalWrite(2, HIGH);
  }
if ( onoffbutton.lastread[1] == 70){ // check for OFF
  digitalWrite(2, LOW);
}

 

 

הקוד הזה קורא את האות השנייה בערך שקיבלנו: ON או OFF. אם האות השניה היא N הערך שלה ב ascii הוא 78 ואם היא F הערך שלה הוא 70. יש עוד אפשרות לקרוא את הערך המלא כמחרוזת אבל קצת הסתבכתי עם זה.

אחרי שסיימנו עם הכפתור נשנה את הקוד של חיישן האור.

לפני השורה הזו  Serial.print(x);  נכניס שורה שמשנה את x לערך החיישן האנלוגי:

x = analogRead(A0);

 

עכשיו הכל אמור לעבוד, אבל אתם יודעים איך דברים בדרך כלל מסתבכים. כמו שאומר המשפט "כל מה שיכול להסתבך, הולך להסתבך!!".

שיפור זמן תגובה: הקוד מחכה 5000 מילישניות בין פקודה לפקודה לכן התגובה שלו איטית, אפשר בכיף להוריד ל 500 מילישניות בשביל תגובה מהירה, אבל השרתים שלהם מתחילים לסרב לבקשות אם שולחים אותם מהר מכך.

הנה הקוד המלא.

 

עוד אפשרויות

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

 

 

סיכום

התוכנה והממשק הגרפי של Adafruit הם מרשימים מאוד וכבר עכשיו בגרסת הבטא טובים לפחות כמו thingspeak שעובדת על אותו רעיון.

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

MQTT הוא פרוטוקול מעניין מאוד והתרשמתי במיוחד מהמהירות הכמעט מיידית שלו. אחרי שמתרגלים לרעיון הזה של publish/subscribe הוא הופך להיות יותר הגיוני ככל שמשתמשים בו. אם בונים פרויקט כמו בית חכם אז MQTT וגם הממשק של Adafruit יכולים להיות אידאליים, במיוחד אם משתמשים בלוחות שעובדים על בטריה. גם אם משתמשים בתקשורת סלולרית ו/או באנרגיה סולרית הפרוטוקול יכול להיות מצוין.

כמעט בשביל כל שימוש אחר HTTP עדיין ממשיך להיות בראש ללא מתחרים. הפרוטוקול הזה כל כך אמין וטוב שלא היה אף פעם צורך לשנות או לשדרג אותו (למעט פעם אחת ששודרג ל HTTP 1.1) .

 

כתיבת תגובה

האימייל לא יוצג באתר.

קבלו אימייל כשהמוצר חוזר למלאי השאירו אימייל וקבלו הודעה אוטומטית כשהמוצר חוזר למלאי.
אימייל