גש למסד הנתונים משפת התכנות PHP

גש למסד הנתונים משפת התכנות PHP

גש למסד הנתונים משפת התכנות PHP

תוכן עניינים

    שרת אינטרנט IoTHTTP POST IoT Web Serverמסד נתונים של MySQL. שרת אינטרנט IoTשרת אינטרנט IoT בשפת PHP

    במאמר אחרון זה בסדרה על שימוש בשרת אינטרנט לאחסון נתונים ממכשירים המחוברים לאינטרנט של הדברים, מסביר כיצד להקליט במסד נתונים MySQL המידע שצמתי IoT שולחים לשרת המבקשים בקשות HTTP POST. ייתכן שקוראי המאמר הזה, של הבלוג כולו, לא מכירים במיוחד את התכנות ב- שפת PHP אבל בוודאי כן עם התכנות של מיקרו-בקרים בשפות C o C + + לכן, למעט פרטים מסוימים, כמו לפני סימן הדולר ($) למשתנים, תוכל לעקוב אחר הדוגמאות ללא צורך בהסברים נוספים, שכן הן נעשו לפי סגנון תכנות נייטרלי מאוד, לא ספציפי ל PHP.

    אחסן מידע במסד הנתונים

    כפי שהוסבר במאמר על אחסון נתונים של IoT על ידי ביצוע בקשות HTTP POST לשרת אינטרנט, בסוף הכותרות, גוף בקשת ה-POST מכיל את הנתונים שנשלחים לשרת. הדרך הנפוצה ביותר לשלוח מידע זה לשרת היא בפורמט טקסט רגיל מכיוון שקל יותר לנתח אותו אפילו "ידנית". כאשר הנתונים הנשלחים לשרת מורכבים, בוודאי יהיה נוח לבנות אותם באמצעות, למשל, הפורמט XML o JSON. בשימוש הרגיל בשרת אינטרנט לניהול מידע ממכשירים המחוברים לאינטרנט של הדברים, לא מקובל להזדקק למבנה נתונים, ולכן נורמלי לשלוח אותם בטקסט רגיל בפורמט variable=valor.

    בבקשת HTTP POST של הדוגמה הבאה, המשאב (בדרך כלל דף אינטרנט) /iot/grabar_temperatura מתבקש משרת polaridad.es ונשלחים שלושה משתנים: ne, tp ו-cr, המכילים בהתאמה את הערכים" 12", "10.26 » ו-«2.18» חשוב גם לזכור שיש שורה ריקה להפרדה בין הכותרות לנתונים.

    המטרה הסופית של הקוד הבא PHP ישלח לשרת מסד הנתונים MySQL הסדר SQL:

    שאיתו תיווצר רשומה חדשה (INSERT)
    במאגר החימום (INTO calefacciones)
    הקצאה לשדות (numero_estancia,temperatura,corriente)
    הערכים התואמים לבקשת HTTP POST VALUES (12, 10.26, 2.18)

    החיבור למסד הנתונים נעשה עם הפונקציה mysqli_connect לפי הפורמט: mysqli_connect($servidor,$usuario,$clave,$base_datos) שמחזיר מצביע ל-connection-object ושמשתמש במשתנים שמגדירים גישה (כגון שם משתמש, סיסמה...) ושקודם לכן הוקצו לשימושים היפותטיים עתידיים בסקריפט.

    כדי לזהות אם החיבור הצליח, נעשה שימוש בפונקציה mysqli_connect_errno() מה שמחזיר את מספר השגיאה שאולי התרחשה או אפס (false) אם החיבור נוצר כהלכה. כדי להודיע ​​על שגיאות, האפליקציה שמבצעת את בקשת ה-HTTP מגיבה בערך אפס, במקרה זה התוכנית המופעלת ב- µC של צומת ה-IoT.

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

    כפי שניתן לראות, ב שפת PHP סמל התקופה (.) משמש לשרשור הטקסטים היוצרים את הסדר SQL או האופרטור נקודה וסימן שוויון (.=) כדי להוסיף טקסט מימין לזה שכבר מאחסן משתנה והמרכאה הבודדת (‘) משמשת גם כדי להקיף קבועי טקסט, לא רק תווים. למרות שבמקרה זה ניתן להשתמש גם במירכאות כפולות («), ב שפת PHP משמשים לעיבוד התוכן, למשל, כולל משתנים בתוך הטקסט בפורמט $texto="Me llamo $nombre"; כחלופה לפורמט $texto='Me llamo '.$nombre; גם מאפשר לך לכלול מרכאות מסוג אחד באחר מבלי שתצטרך להשתמש בסימני בריחה בכל פעם שמתחלפים זוגיים בתוך יחידים או יחידים בתוך זוגיות, כמו במשימה $texto='esto no hay que "escaparlo" en PHP';.

    כדי לבצע את השאילתה לשרת MySQL נעשה שימוש בפונקציה mysqli_query עם הפורמט mysqli_query($conexion,$consulta_sql) שלוקח כפרמטרים את חיבור האובייקט למסד הנתונים ואת הטקסט עם ההזמנה SQL שהולחן.

    הפונקציה mysqli_query($conexion,$consulta_sql) מחזיר אובייקט סמן שניתן להשתמש בו כדי לעבור את הנתונים המוחזרים אם רלוונטי או, כמו בדוגמה למעלה, כדי לקבל מידע על הפעולה, במיוחד כדי לדעת את האינדקס שהוקצה לרשומה החדשה שהפעולה יצרה בטבלה " מחממים" עם הפונקציה mysqli_insert_id($conexion)

    הערך המוחזר על ידי mysqli_query($conexion,$consulta_sql) יכול להעריך ל-false בפעולה בוליאנית כדי לקבוע שהתרחשה שגיאה. בדוגמה הקודמת הוא משמש כדי להחזיר, כמו במקרה של שגיאת החיבור, אפס לאפליקציה שמבצעת את בקשת ה-POST. בדרך זו, התוכנית תחזיר מספר גדול מאפס המייצג את האינדקס של הרשומה החדשה אם הפעולה נכונה או אפס אם הפעולה מייצרת שגיאה.

    כדי לשחרר את המשאבים שהוקצו לחיבור מסד הנתונים, הוא "נסגר" באמצעות הפונקציה mysqli_close($conexion)

    קרא מידע ממסד הנתונים

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

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

    בדוגמה למעלה, כדי לבצע שאילתה במסד הנתונים נעשה שימוש בפקודה SQL SELECT לפי הפורמט הבסיסי SELECT campos FROM tabla WHERE condición ORDER BY campo DESC עם המוזרות היחידה של הוספת הפונקציות לשדה התאריך DAY, MONTH, YEAR y TIME על מנת לקבל את היום, מספר החודש, השנה והשעה בנפרד. התנאי המוטל הוא שהטמפרטורה גבוהה מ-40.0 והיא מסודרת באמצעות שדה התאריך מהגבוה (הנוכחי ביותר) לנמוך (הישן ביותר) המציין זאת עם הסעיף DESC

    ללולאה בין הערכים המוחזרים על ידי השאילתה מלולאה for עם ממד ידוע נעשה שימוש בפונקציה mysqli_num_rows($resultado) המציין את מספר הרשומות שנמצאו. עם הפונקציה mysqli_data_seek($resultado,$numero_resultado) ניתן להזיז את סמן התוצאות למיקום מסוים המובע על ידי מונה הלולאה for, $numero_resultado, בדוגמה.

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

    לאחר שעברו כל הערכים, המשאבים שהוקצו לתוצאת השאילתה משתחררים SQL עם פונקציה mysqli_free_result($resultado)

    עיבוד מידע ממסד הנתונים. השוו ערכים.

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

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

    בדוגמה הקודמת, הפונקציה hexdec משמשת כדי לקבל מספר עשרוני מטקסט המייצג מספר הקסדצימלי והוא זה שנשלח על ידי מכשיר ה-IoT. היתרון הנוסף בשימוש בפונקציה זו הוא הימנעות, כפי שהוסבר קודם, מתקפה על ידי הוספת קוד SQL זדוני לנתונים של בקשת ה-POST.

    לפרסם תגובה

    אולי פספסת