- מינוחים הקשורים ל- BLE (Bluetooth Low Energy)
- הכנת החומרה
- תכנות ESP32 לחיווי רמת הסוללה באמצעות שירות GATT
- בודק את שירות GATT שלך ב- ESP32 BLE
אוזניות אלחוטיות, להקות כושר, רמקולי בלוטות ', אוזניות בתוך האוזן, טלפונים ניידים, מחשבים ניידים… יש כל כך הרבה התקני בלוטות' סביבנו ורוב המכשירים הללו מופעלים באמצעות סוללה. האם תהית אי פעם שכאשר אתה מחבר מכשיר Bluetooth לטלפון הנייד שלך כיצד הוא מבין באופן אוטומטי שההתקן המחובר הוא מחשב או מכשיר שמע או טלפון נייד? במכשירים מסוימים הטלפון שלנו עשוי אפילו להציג באופן אוטומטי את אחוז הסוללה של ההתקן המחובר בשורת ההודעות. איך כל זה קורה לבד? צריך להיות פרוטוקול משותף כלשהו בין הטלפון למכשיר ה- Bluetooth נכון!
הישאר סקרן, תקבל תשובות לשאלות אלה כאשר אנו מנסים להבין את Bluetooth Low Energy (בקיצור BLE), עם מודול ESP32 הפופולרי. בניגוד ל- Bluetooth הקלאסי ב- ESP32, ה- BLE פועל רק כאשר תקשורת מופעלת ונשארת במצב שינה אחרת, הדבר הופך אותה לבחירה הנכונה ליישומים המופעלים על ידי סוללה. BLE יכול גם ליצור רשתות רשת ולשמש כמשואות. בדרך כלל מודולי BLE עובדים כשרת או כלקוח, כאן נשתמש ב- ESP32 BLE כשרת.
כאן חילקנו את ה- Bluetooth ה- ESP32 השלם לשלושה מקטעים כדי להקל על ההבנה.
1. בלוטות 'סדרתי ב- ESP32 מחליף נורית מהטלפון הנייד
2 . שרת BLE לשליחת נתונים ברמת הסוללה לטלפון נייד באמצעות שירות GATT
3. לקוח BLE לסרוק אחר מכשירי BLE ולשמש כמגדלור.
כבר סקרנו את המאמר הראשון; במאמר זה נלמד כיצד לגרום ל- ESP32 BLE לעבוד כשרת ולהשתמש בשירות GATT כדי לשלוח מידע על רמת הסוללה. לצורך בדיקה אנו נשלח ערכים מקודדים מ- ESP32 כאחוזי סוללה לטלפון הנייד שלנו באמצעות שירות BLE GATT, בדרך זו הנייד שלנו יניח כי ESP32 הוא מכשיר Bluetooth המופעל על ידי סוללה שמנסה לשלוח לאחוזי הסוללה שלו. לפני שנפרט לפרטים נקלוט כמה מינוחים הקשורים ל- Bluetooth Low Energy.
מינוחים הקשורים ל- BLE (Bluetooth Low Energy)
שרת BLE: כאמור קודם ניתן לתכנת את ה- BLE לעבוד כשרת או כלקוח. כשעובדים כשרת ה- BLE יכול לספק רק נתונים שהוא לא יכול ליצור חיבור. דוגמה תהיה להקת כושר. שרת יכול לשלוח מידע רק אם הלקוח מבקש זאת.
לרוב ה- BLE של ה- ESP32 משמש בשרת. לכל שרת יהיה שירות אחד או יותר בתוכו ובדומה לכך לכל שירות יהיה מאפיין אחד או יותר המשויכים אליו. מאפיין יכול להכיל אפס, אחד או יותר מתאר אחד. לכל שירות, מאפיין או מתאר יהיה מזהה ייחודי מוגדר מראש שנקרא UUID.
לקוח BLE: הלקוח יכול לסרוק חיבור ולהאזין להתקני Bluetooth אחרים. דוגמה לכך תהיה הטלפון הנייד שלך. שים לב שרוב התקני החומרה של BLE יכולים לעבוד כשרת וכלקוח, זו התוכנה שקובעת את תפקיד המכשיר.
התקן היקפי / מכשיר מרכזי: ברשת BLE יכול להיות מכשיר מרכזי אחד בלבד, אך יכול להיות שיש בו כמה התקני היקף שנדרש. המכשיר המרכזי יכול להתחבר לכל ההתקנים ההיקפיים בו זמנית, אך המכשיר ההיקפי יכול להתחבר רק למכשיר המרכזי, בדרך זו אין שני התקנים היקפיים שיכולים לחלוק נתונים זה עם זה. הדוגמה הטובה ביותר למכשיר המרכזי תהיה הטלפונים החכמים שלנו ולמכשירים היקפיים יהיו האוזניות Bluetooth או להקות הכושר.
פרסום BLE: פרסום BLE הוא המונח החנון להורות למכשיר ה- Bluetooth להיות גלוי לכולם כדי שיוכל להתאים וליצור חיבור. זה יכול להיחשב כתקשורת חד כיוונית. כאן השרת ממשיך לפרסם נתונים שמצפה ששרת יקבל אותם. BLE משואה הוא סוג של BLE.
UUID (מזהה ייחודי אוניברסלי): כל מכשיר Bluetooth מסוג BLE מקבל מספר מזהה אוניברסלי ייחודי כאשר הוא מתוכנת על ידי המתכנת. אתה יכול לחשוב על מזהה זה כרצף מספרים המייצג את הפונקציונליות / תפקיד של מכשיר ה- BLE. שוב ישנם שני סוגים של UUID. האחד הוא UUID השירות והשני הוא UUID אופייני.
שירות GATT: GATT מייצג פרופיל תכונות כלליות; זה מגדיר כמה דרכים סטנדרטיות בהן שני התקני BLE צריכים תמיד לתקשר. פרוטוקול תכונה (ATT) זה מוגדר מראש והוא נפוץ עבור כל מכשירי ה- BLE כך שכך כל שני התקני BLE יכולים לזהות זה את זה. אז GATT הייתה התשובה לשאלה הקודמת שלנו.
הטכניקה שבה שני מכשירי BLE צריכים לשלוח נתונים הלוך ושוב מוגדרת על ידי המושג שנקרא שירותים ומאפיינים.
שירות BLE / מאפיין BLE: ה- UUID של השירות אומר לנו איזה סוג שירות מכשיר ה- BLE מתכוון לבצע וה- UUID האופייני מספר מהם הפרמטרים או הפונקציות שיבוצעו על ידי אותו שירות. כך שלכל שירות יהיה מאפיין אחד או יותר. בסדר! מאיפה המתכנת משיג את ה- UUID הזה? כל UUID מוגדר כבר על ידי ה- GATT (פרופיל תכונות כלליות) תוכלו לבקר באתר האינטרנט שלהם ולבחור את ה- UUID כנדרש לפרויקט. אני יודע שזה קפץ קצת מעל לראשנו; בואו ננסה להבין את זה עם דוגמא.
נניח שהתקן BLE של נגן שמע. בתחילה כאשר אתה מצמיד אותו לטלפון שלך, הטלפון שלך מזהה אותו כמכשיר שמע ומציג גם את רמת הסוללה בשורת המצב. לכן, כדי שזה יקרה, נגן האודיו צריך לומר איכשהו לטלפון שלך שהוא מוכן לחלוק את רמת הסוללה ואת אחוז הטעינה שיש לו בסוללה. זה נעשה על ידי שימוש ב- UUID, יש UUID ספציפי המספר כי קוביות ה- BLE עומדות לספק פרטים על רמת הסוללה. ה- UUID הזה שמספר את סוג השירות נקרא Service UUID, ושוב יכולים להיות כל כך הרבה פרמטרים שצריכים מוחלפים להשלמת שירות כמו שערך הסוללה הוא על פרמטר כזה, לכל פרמטר יהיה UUID משלו ואלה נקראים UUID אופייני.הפונקציה הנפוצה המבוצעת על ידי מאפיין היא קריאה, כתיבה, הודעה וציין.
מתאר BLE: המתאר הוא מאפיין אופציונלי הקיים בתוך המאפיין. מתאר מציין בדרך כלל כיצד לגשת למאפיין.
משואת BLE: משואת Bluetooth דומה יותר למתג קירבה המבצע פעולה כלשהי שהוגדרה מראש כאשר המשתמש נכנס לטווח (קרבה). הוא מפרסם את זהותו כל הזמן ומכאן הוא מוכן להתאמה תמיד.
BLE2902: אני עדיין סקפטי לגבי הדבר הזה, אבל אתה יכול לחשוב על זה כעל תוכנה בצד הלקוח שמודיעה לשרת להפעיל או לכבות את ההודעה, זה יעזור לנו לחסוך בחשמל
מקווה שקיבלתם רעיון גס, הטוב הוא שאנחנו לא צריכים לדעת הרבה מכיוון שכל עבודת היד כבר נעשתה עבורנו בספריות.
הכנת החומרה
הפרויקט אינו דורש הגדרת חומרה, אך וודא שהוספת פרטי לוח ESP32 ב- Arduino IDE שלך וניסית מינימום תוכנית להבהב לדוגמא כדי לבדוק אם הכל עובד כצפוי. אתה סקפטי כיצד לעשות זאת, אתה יכול לעקוב אחר ההדרכה להתחלת העבודה עם ESP32 עם Arduino כדי לעשות את אותו הדבר.
גם כדי לבדוק את שירותי ה- BLE נשתמש ביישום אנדרואיד nRF בנייד שלנו שניתן להוריד ישירות מ- PlayStore. זה זמין גם בחנות Itunes עבור משתמשי Iphone. אם אתם מתכננים לעבוד עם BLE זמן רב, יישום זה באמת יועיל למטרות איתור באגים.
תכנות ESP32 לחיווי רמת הסוללה באמצעות שירות GATT
בשלב זה אני מניח שיש לך מושג הוגן על איזה שירות GATT וכיצד הוא מיושם באמצעות מודלים של שירות ומאפיינים. עכשיו, בואו נצלול לתוכנית כדי ללמוד כיצד היא מיושמת ב- ESP32 באמצעות Arduino IDE. לפני שנמשיך אני רוצה להשתמש במרחב הזה כדי להודות לאנדראס ספייס על הסרטון שלו BLE שהבהיר את הדברים הרבה בצדי.
אנו מתחילים את התוכנית בייבוא הספריות הנדרשות לשרטוט שלנו. יש הרבה דברים להגדיר כדי להשתמש בפונקציונליות ה- BLE של ה- ESP32 בתקווה, אם כי תודה לניל קולבן שכבר עשה את העבודה הקשה עבורנו וסיפק את הספריות. אם אתה רוצה להבין את הפונקציונליות של הספריות, אתה יכול לעיין בתיעוד שלו בעמוד github.
#לִכלוֹל
בשלב הבא עלינו להגדיר את פונקציית השיחה החוזרת לשרת עבור מכשיר ה- Bluetooth שלנו. לפני כן אפשר להבין מהי פונקציית התקשרות חוזרת ב- BLE.
מהי פונקציית התקשרות חוזרת ב- BLE?
כאשר BLE פועל כשרת חשוב להגדיר פונקציית החזרת שרת. ישנם סוגים רבים של שיחות חוזרות הקשורות ל- BLE, אך במילים פשוטות אתה מחשיב את אלה כאישור המתבצע כדי לוודא שהפעולה הושלמה. נעשה שימוש בשיחת החזרת שרת כדי להבטיח שהחיבור בין לקוח לשרת נוצר בהצלחה.
אנו משתמשים בשורות הקוד הבאות לביצוע החזרת שרת.
bool _BLEClientConnected = false; class MyServerCallbacks : BLEServerCallbacks ציבורי { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; בטל onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
בתוך פונקציית הגדרת הריק , אנו יוזמים תקשורת טורית ב 115200 לצורך איתור באגים ואז אתחול את מכשיר ה- Bluetooth באמצעות פונקציית InitBLE .
הגדרת חלל () { Serial.begin (115200); Serial.println ("מחוון רמת הסוללה - BLE"); InitBLE (); }
InitBLE הוא המקום שבו כל הקסם קורה. עלינו ליצור שרת Bluetooth ולהשתמש בשירות רמת הסוללה כאן. אך לפני כן עלינו להגדיר את ה- UUID לשירות, מאפיין ומתאר לקריאת רמת הסוללה. ניתן להשיג את כל ה- UUID מאתר שירות ה- Bluetooth GATT. במקרה שלנו אנו מנסים להשתמש בשירות הסוללה ו- UUID עבורו מוגדר כ- 0X180F כמוצג להלן.
בשלב הבא עלינו לדעת את המאפיין הקשור לשירות זה. כדי לדעת שפשוט לחץ על שירות הסוללה ותועבר לדף מאפייני השירות, שם מוזכר שרמת הסוללה היא שם המאפיינים והיא לוקחת ערך בין 0 ל 100. שים לב שנוכל לבצע רק שניים פעולות בעלות מאפיין זה, האחת היא לקרוא שחובה לעשות והשנייה היא להודיע שהיא אופציונלית. לכן עלינו לשלוח את ערך הסוללה ללקוח (טלפון) שהוא חובה ובמידת הצורך נוכל להודיע לטלפון על אופציונלי.
אבל רגע, עדיין לא מצאנו את ערך ה- UUID עבור רמת הסוללה האופיינית. לשם כך היכנס לדף מאפיין הסוללה וחפש את שם רמת הסוללה תמצא את ה- UUID שלו כ- 0X2A19, תמונת המצב שלו מוצגת למטה.
עכשיו שיש לנו את כל הערכים, הבה נניח את התוכנית כפי שמוצג להלן. השם BatterySerivce , BatteryLevelCharacteristic ו- BatteryLevelDescriptor הם משתנים המוגדרים על ידי המשתמש להתייחס לשירות, המאפיין והתיאור בו אנו משתמשים בתוכנית. הערך עבור המתאר 0X2901 משמש כאשר גודל הערך הוא 8 סיביות, ניתן למצוא מידע נוסף בדף תיאור המתאר.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLEC Characteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECcharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
חזרה לפונקציה initBLE . ראשית עלינו להפעיל את שרת ה- BLE ולגרום לו לפרסם בשם. השורות הבאות משמשות כדי להפעיל את BLE כשרה. השם שנתתי לשרת BLe שלי הוא "BLE Battery", אך אתה יכול לבחור בעצמך.
BLEDevice:: init ("סוללת BLE"); // צור את שרת ה- BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (MyServerCallbacks חדשים ());
בשלב הבא עלינו להתחיל בשירות GATT מכיוון שכבר הגדרנו את ה- UUID נוכל פשוט להתחיל את השירות באמצעות השורה למטה.
// צור את שירות ה- BLE BLEService * pBattery = pServer-> createService (BatteryService);
לאחר תחילת השירות אנו יכולים לקשר את המתאר למאפיינים ולקבוע את הערכים. שירות BLE2902 נוסף כאן גם כמוצג להלן.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("אחוז 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (חדש BLE2902 ());
לבסוף הכל מוגדר, כעת כל שנותר הוא לבקש מ- ESP32 לפרסם כדי שהתקנים אחרים כמו הטלפון שלנו יוכלו לגלות אותו ולהתחבר אליו, וכאשר הם מחוברים ללקוח עליו ליזום את שירות הסוללה שניתן לעשות זאת למרות השורות הבאות.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> התחל (); // התחל לפרסם את pServer-> getAdvertising () -> start ();
זהו עד כה כל כך טוב, השלב האחרון הוא לספר למתאר מה הערך של הסוללה באחוזים שיש לשלוח ללקוח (טלפון). ערך זה יכול להיות בין 0-100 כפי שקראנו קודם לכן, כדי לשמור על דברים פשוטים, יש לי פשוט קידוד קשה את ערך הסוללה להיות 57 ואז להגדיל אותו כל 5 שניות ולהתחיל מ 0 ברגע שהוא מגיע ל 100. הקוד שצריך המוצג להלן. שים לב שהערך הנשלח הוא בפורמט unit8_t.
uint8_t level = 57; loop loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); עיכוב (5000); רמה ++; Serial.println (int (level)); אם (int (level) == 100) level = 0; }
בודק את שירות GATT שלך ב- ESP32 BLE
הקוד המלא שהוסבר לעיל ניתן בסוף הדף. העלה את הקוד ללוח ESP32 שלך. לאחר העלאת הטלפון שלך אמור לגלות איתו מכשיר Bluetooth בשם "סוללת BLE".
לאחר מכן התקן את יישום אנדרואיד nRF ופתח אותו והתחבר למכשיר ה- BLE סוללה BLE. הרחב את הקטע שירות סוללות ותמצא את המסך הבא.
כפי שאתה יכול לראות היישום זיהה באופן אוטומטי כי ה- BLE מספק שירות סוללות ויש לו את המאפיינים של רמת הסוללה בגלל ה- UUID בו השתמשנו בתוכנית. אתה יכול גם לראות שערך הסוללה הנוכחי שהוא 67% ממתין למשך 5 שניות ותוכל גם להבחין שהוא הולך וגובר.
הדבר המגניב בשימוש ב- BLE הוא שכעת כל יישום שעובד עם BLE יחשוב ש- ESP32 שלך הוא מכשיר BLE שמודיע על רמת הסוללה. כדי לנסות זאת השתמשתי ביישום שנקרא BatON והיישום זיהה את ה- ESP32 כמכשיר Bluetooth המופעל על ידי סוללה ומסרתי את אחוז ההודעה בטלפון שלי כך
מגניב!! ימין? הראיתי גם את העבודה המלאה בסרטון למטה. עכשיו, לאחר שלמדת כיצד להשתמש בשירותי סוללות BLE עם ESP32, תוכל לנסות גם שירותי GATT אחרים שמעניינים מאוד כמו דופק, HID, דופק וכו '. תיהני….