חיבור Ethernet TCP עם Arduino

חיבור Ethernet TCP עם Arduino

חיבור Ethernet TCP עם Arduino

מנקודת מבט של תוכנה, יצירת חיבור Ethernet עם Arduino זה פשוט מאוד. כדי לעשות זאת, השתמש ב- ספריית Ethernet. ספרייה זו מיועדת עבור א מגן Ethernet שמבוססת על המשולב W5100, אך ישנם לוחות או מודולים שונים אחרים ו/או המשתמשים בלוחות משולבים אחרים, כגון ENC28J60. כדי לפשט את השימוש בו ולהגביר את התאימות, ספריות אחרות משתמשות (כמעט) באותו API כי ספריית Ethernet, תצטרך רק להחליף את הספרייה החלופית במקורית או לכלול אותה (כאשר השם שונה) במקומה גם אם נעשה שימוש באותן פונקציות (או דומות מאוד) בקוד. במקרה שלי, אני משתמש ב- ספריית UIPEthernet de נורברט טרושס בעקבות אותו תהליך שאני הולך לתאר בטקסט הזה.

מודול ENC28J60 לשימוש עם ספריית UIPEthernet

1. הגדר את חיבור האתרנט

בין אם אתה מתכוון לאמץ את התפקיד של לקוח כמו שרת, קודם כל יש להגדיר את הקשר עם הפונקציה התחל () שניתן להעביר כפרמטר רק את כתובת MAC ומחכה לשרת DHCP ברשת הקצה א כתובת IP ושאר התצורה או שאפשר גם לציין (אופציונלי) פרמטרים נוספים עד להגדרת התצורה המלאה:

  1. DIRECTION MAC (שכבר הוזכר)
  2. כתובת IP של המגן או המודול
  3. כתובת ה- IP של השרת DNS (שרת אחד בלבד)
  4. כתובת ה-IP של ה כְּנִיסָה
  5. מסכת רשת

רצוי לציין את כל הפרמטרים, אלא אם הניכוי שלהם הוא הרגיל, כדי למנוע שהתצורה לא נכונה (למשל שהשער אינו הכתובת הראשונה של הרשת).

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

La כתובת MAC הוא מוגדר עבור ספרייה זו כמערך של 6 בתים. כתובת ה-MAC היא (אמורה להיות) מזהה ייחודי שבו הבייטים הראשונים מציינים את היצרן והדגם והאחרונים מציינים את המכשיר הספציפי. המשולב ENC28J60 אינו כולל כתובת MAC אלא אם כן תבחר לרכוש גם א כתובת MAC משולבת מ-Microchip (או בלוק שלם כן של כתובות ל IEEE אם ריצת המכשירים גדולה מספיק כדי שזה יהיה כדאי). כאשר אין לך כתובת MAC, אתה יכול להמציא אחת, ולדאוג שהיא לא תתנגש עם אחרים ברשת שבה נמצא המכשיר.

אם התצורה נעשית עם שרת DHCP במקום "ביד", הפונקציה localIP() כדאי לעיין בכתובת שהשרת הקצה למודול. כדי לחדש את הכתובת שהוקצתה (אם פג הזמן המתאים), ספריית Ethernet מספק את הפונקציה לְתַחְזֵק() אשר גם יודיע על ידי החזרת קוד התואם למצב החידוש:

  1. הניתוח לא השפיע
  2. שגיאה בחידוש כתובת ה-IP
    לא ניתן היה להאריך את השימוש בכתובת ה-IP שהוקצתה באותו שרת
  3. כתובת ה-IP חודשה בהצלחה
  4. חיבור מחדש של כתובת IP נכשל
    לא ניתן היה להרחיב את השימוש בכתובת ה-IP שהוקצתה באף שרת
  5. כתובת ה-IP הוקצתה מחדש בהצלחה

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

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

2. התחל את החיבור במצב לקוח או שרת

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

החיבור כלקוח הוא זה שמגיש בקשות למערכת השרתים שמחכה להן ועונה להן בהתאם. כדי ליזום חיבור כלקוח, השתמש EthernetClient() מהו הקונסטרוקטור של המחלקה לקוח מקור כל פעולות ה-Ethernet כלקוח.

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

3. ליצור קשר כלקוח

כאמור, ברגע שנוצר החיבור, הלקוח הוא זה שנוטל את היוזמה לבצע את השאילתות. השרת ימתין ליוזמה זו ויגיב בהתאם. לכן, הלקוח הוא שמתחבר לשרת, לשם כך אנו משתמשים להתחבר () מציין את השרת כפרמטרים (כתובת ה-IP או ה כתובת האתר) פורטו במי שמקשיב.

בהתבסס על תוצאת הפעולה, הפונקציה תחזיר את הערכים

  1. (הַצלָחָה) החיבור נוצר בהצלחה
  2. ביסוס הקשר
  3. (נגמר הזמן) הזמן הקצוב חלף מבלי שנוצר חיבור
  4. (INVALID_SERVER) השרת לא נמצא או שהוא אינו מגיב כהלכה
  5. (קצוץ) החיבור הופסק לפני שנוצר במלואו
  6. (INVALID_RESPONSE) תגובת השרת שגויה

לפני שמתחילים לבצע שאילתות, יש צורך לוודא שהחיבור פועל עם הפונקציה מְחוּבָּר() שיחזור נָכוֹן אם זה כבר זמין או שקר אחרת.

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

4. שלח נתונים

כמו שיעורים ידועים יותר, כגון סדרתי, ועם שימוש דומה, השיעורים לקוח y שרת יש את הפונקציות

  • לכתוב(עוּבדָה) o לכתוב(מאגר, אורך)

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

  • הדפסה(מאגר מידע)

    שולח כלקוח או שרת (בהתאם למחלקה ממנה נעשה שימוש) את המידע המתאים ל"נתונים" כטקסט. אם המידע אינו מבוטא כטקסט (לדוגמה, זהו מספר שלם) ניתן להשתמש בפרמטר האופציונלי "base" לבחירת ההמרה, שיכול להיות אחד מהקבועים BIN, OCT, DEC או HEX המציינים, בהתאמה. בסיסים התואמים לבינארי (בסיס 2), אוקטלי (בסיס 8), עשרוני (בסיס 10) והקסדצימלי (בסיס 16)

  • println(מאגר מידע)

    הפעולה זהה לקודמתה למעט שליחת, לאחר המידע המצוין במפורש על ידי פרמטר "נתונים", החזרת עגלה (קוד 13 שניתן לייצג כ-\r) וסוף שורה (קוד 10, שיכול להיות מיוצג על ידי \n) קודים אלה מופנים לעתים קרובות, בהתאמה, על ידי ראשי התיבות CR (Carriage Return) ו LF (הזנת קו)

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

5. קבלת נתונים

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


  • זמין ()

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

  • לקרוא()

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

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

6. סיים את החיבור

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

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

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

דוגמה לשאילתת HTTP GET

כדי להבהיר טוב יותר את כל האמור לעיל, דוגמה מלאה יותר של בקשות כלולה להלן. TCP באמצעות בקשות GET באמצעות פרוטוקול HTTP. בדוגמה, הערכים המתקבלים על ידי חיישנים אנלוגיים המחוברים ללוח Arduino נשלחים לשרת אינטרנט המאחסן אותם במסד נתונים.

לפרסם תגובה

אולי פספסת