- المصطلحات المتعلقة ببلوتوث منخفض الطاقة
- تحضير الجهاز
- برمجة ESP32 لبيان مستوى البطارية باستخدام خدمة الجات
- اختبار خدمة الجات الخاصة بك على ESP32 BLE
سماعات الرأس اللاسلكية ، ونطاقات اللياقة البدنية ، ومكبرات الصوت التي تعمل بتقنية البلوتوث ، وسماعات الأذن الداخلية ، والهواتف المحمولة ، وأجهزة الكمبيوتر المحمولة… هناك العديد من أجهزة Bluetooth من حولنا ومعظم هذه الأجهزة تعمل بالبطاريات. هل تساءلت يومًا أنه عندما تقوم بتوصيل جهاز Bluetooth بهاتفك المحمول ، كيف يفهم تلقائيًا أن الجهاز المتصل هو جهاز كمبيوتر أو جهاز صوتي أو هاتف محمول؟ بالنسبة لبعض الأجهزة ، قد يعرض الهاتف تلقائيًا النسبة المئوية للبطارية للجهاز المتصل على شريط الإشعارات. كيف يحدث كل هذا بمفردهم؟ يجب أن يكون هناك بروتوكول مشترك مشترك بين الهاتف وجهاز البلوتوث بشكل صحيح!
ابق فضوليًا ، ستحصل على إجابات لهذه الأسئلة بينما نحاول فهم Bluetooth Low Energy (BLE باختصار) ، باستخدام وحدة ESP32 الشائعة. على عكس البلوتوث الكلاسيكي في ESP32 ، يعمل BLE فقط عندما يتم تنشيط الاتصال ويبقى في وضع السكون بخلاف ذلك ، وهذا يجعله الاختيار الصحيح للتطبيقات التي تعمل بالبطاريات. يمكن لـ BLE أيضًا تكوين شبكات متشابكة والعمل كإشارات. عادة تعمل وحدات BLE إما كخادم أو كعميل ، هنا سوف نستخدم ESP32 BLE كخادم.
هنا قمنا بتقسيم ESP32 Bluetooth الكامل إلى ثلاثة أقسام لسهولة الفهم.
1. المسلسل بلوتوث على ESP32 تبديل LED من الهاتف المحمول
2 . خادم BLE لإرسال بيانات مستوى البطارية إلى الهاتف المحمول باستخدام خدمة GATT
3. عميل BLE للبحث عن أجهزة BLE والعمل كمنارة.
لقد قمنا بالفعل بتغطية المقال الأول ؛ في هذه المقالة سوف نتعلم كيفية جعل ESP32 BLE يعمل كخادم واستخدام خدمة GATT لإرسال معلومات مستوى البطارية. لغرض الاختبار ، سنرسل قيمًا مشفرة من ESP32 كنسبة مئوية للبطارية إلى هاتفنا المحمول من خلال خدمة BLE GATT ، وبهذه الطريقة سيفترض هاتفنا المحمول أن ESP32 عبارة عن جهاز يعمل بالبطارية يعمل بالبلوتوث ويحاول الإرسال إلى نسبة البطارية. قبل الخوض في التفاصيل ، سنستوعب بعض المصطلحات المتعلقة بـ Bluetooth Low Energy.
المصطلحات المتعلقة ببلوتوث منخفض الطاقة
خادم BLE: كما قيل سابقًا ، يمكن برمجة BLE للعمل إما كخادم أو كعميل. عند العمل كخادم ، يمكن لـ BLE توفير البيانات فقط ولا يمكنها بدء الاتصال. سيكون المثال عبارة عن فرقة لياقة. يمكن للخادم إرسال المعلومات فقط إذا طلب العميل ذلك.
الأكثر شيوعًا هو استخدام BLE الخاص بـ ESP32 كخادم. سيكون لكل خادم خدمة واحدة أو أكثر بداخله وبالمثل سيكون لكل خدمة واحدة أو أكثر من الخصائص المرتبطة بها. قد تحتوي الخاصية على صفر أو واحد أو أكثر من واصف بداخلها. سيكون لكل خدمة أو خاصية أو واصف معرف فريد خاص به محدد مسبقًا يسمى UUID.
عميل BLE: يمكن للعميل فحص الاتصال والاستماع إلى أجهزة Bluetooth الأخرى. على سبيل المثال سيكون هاتفك المحمول. لاحظ أن معظم أجهزة BLE يمكن أن تعمل كخادم وكعميل ، فإن البرنامج هو الذي يقرر دور الجهاز.
الجهاز المحيطي / الجهاز المركزي: في شبكة BLE يمكن أن يكون هناك جهاز مركزي واحد فقط ، ولكن يمكن أن يحتوي على العديد من الأجهزة الطرفية كما هو مطلوب يمكن للجهاز المركزي الاتصال بجميع الأجهزة الطرفية في نفس الوقت ، ولكن يمكن للجهاز المحيطي الاتصال فقط بالجهاز المركزي ، وبهذه الطريقة لا يمكن لأي جهاز طرفي مشاركة البيانات بين بعضهما البعض. أفضل مثال على الجهاز المركزي سيكون هواتفنا الذكية وبالنسبة للأجهزة الطرفية ستكون سماعة Bluetooth أو عصابات اللياقة البدنية.
إعلان BLE: إعلان BLE هو مصطلح غريب الأطوار لإرشاد جهاز Bluetooth ليكون مرئيًا للجميع حتى يتمكن من الاقتران وإنشاء اتصال. ويمكن اعتباره وسيلة اتصال أحادية الاتجاه. هنا يحتفظ الخادم ببيانات الإعلان متوقعًا أن يستلمها الخادم. BLE Beacon هي نوع من BLE.
UUID (المعرف الفريد العالمي): يتم منح كل جهاز يعمل بتقنية Bluetooth BLE رقم تعريف فريد عالمي عند برمجته بواسطة المبرمج. يمكنك التفكير في هذا المعرف على أنه سلسلة من الأرقام التي تمثل وظيفة / دور جهاز BLE. مرة أخرى هناك نوعان من UUID. أحدهما هو UUID للخدمة والآخر هو UUID المميز.
خدمة الجات: GATT تعني ملف تعريف السمات العامة ؛ يحدد هذا بعض الطرق القياسية التي يجب أن يتواصل بها جهازي BLE دائمًا. بروتوكول السمة (ATT) هذا محدد مسبقًا وهو شائع لجميع أجهزة BLE ، وبهذه الطريقة يمكن لأي جهازي BLE التعرف على بعضهما البعض. لذا كان الجات هو الجواب على سؤالنا السابق.
يتم تعريف التقنية التي يستخدمها جهازي BLE لإرسال البيانات من وإلى المطار من خلال المفهوم المسمى الخدمات والخصائص.
خاصية BLE Service / BLE: يخبرنا UUID للخدمة عن نوع الخدمة التي سيقدمها جهاز BLE ويخبرنا المميز UUID ما هي المعلمات أو الوظائف التي ستنفذها تلك الخدمة. لذلك سيكون لكل خدمة خاصية واحدة أو أكثر تحتها. حسنا! من أين يحصل المبرمج على UUID؟ يتم تعريف كل UUID بالفعل بواسطة GATT (ملف تعريف السمات العامة) ، يمكنك زيارة موقع الويب الخاص بهم وتحديد UUID كما هو مطلوب للمشروع. أعلم أنه ارتد قليلاً فوق رؤوسنا ؛ دعونا نحاول فهمها بمثال.
لنفترض جهاز BLE لمشغل الصوت. في البداية ، عند إقرانه بهاتفك ، يتعرف عليه هاتفك كجهاز صوت ويعرض أيضًا مستوى البطارية على شريط الحالة. لذلك ، لكي يحدث هذا ، يجب على مشغل الصوت أن يخبر هاتفك بطريقة ما أنه على استعداد لمشاركة مستوى البطارية ونسبة الشحن الموجودة به. يتم ذلك باستخدام UUID ، وهناك UUID محدد يخبرنا أن نرد BLE سيوفر تفاصيل حول مستوى البطارية هذا UUID الذي يخبر نوع الخدمة يسمى Service UUID ، مرة أخرى يمكن أن يكون هناك العديد من المعلمات التي يجب أن يتم استبدالها لإكمال خدمة مثل قيمة البطارية على هذه المعلمة ، سيكون لكل معلمة UUID الخاص بها وتسمى هذه الخاصية UUID.الوظيفة المشتركة التي تؤديها الخاصية هي القراءة والكتابة والإخطار والإشارة.
واصف BLE: الواصف هو سمة اختيارية موجودة داخل الخاصية. يحدد الواصف عادةً كيفية الوصول إلى الخاصية.
BLE Beacon: يشبه جهاز Bluetooth Beacon مفتاح القرب الذي يقوم ببعض الإجراءات المحددة مسبقًا عندما يدخل المستخدم في نطاق (قرب قريب). تعلن عن هويتها طوال الوقت وبالتالي فهي جاهزة للازدواج دائمًا.
BLE2902: ما زلت متشككًا في هذا الشيء ، ولكن يمكنك التفكير فيه على أنه جزء من برنامج على جانب العميل يُعلم الخادم بتشغيل الإشعار أو إيقاف تشغيله ، وهذا سيساعدنا في توفير الطاقة
آمل أن تكون قد حصلت على فكرة تقريبية ، والشيء الجيد هو أننا لا نحتاج إلى معرفة الكثير لأن جميع الأعمال اليدوية قد تم بالفعل من خلال المكتبات
تحضير الجهاز
لا يتطلب المشروع أي إعداد للأجهزة ، ولكن تأكد من أنك قد أضفت تفاصيل لوحة ESP32 على Arduino IDE الخاص بك وقمت بتجربة الحد الأدنى من برنامج وميض العينة للتحقق مما إذا كان كل شيء يعمل كما هو متوقع. إذا كنت متشككًا في كيفية القيام بذلك ، يمكنك اتباع البرنامج التعليمي Getting started with ESP32 with Arduino لفعل الشيء نفسه.
أيضًا لاختبار خدمات BLE ، سنستخدم تطبيق nRF android على هاتفنا المحمول والذي يمكن تنزيله مباشرةً من PlayStore. يتوفر أيضًا في متجر iTunes لمستخدمي iPhone إذا كنت تخطط للعمل مع BLE لفترة طويلة ، فسيكون هذا التطبيق مفيدًا حقًا لأغراض تصحيح الأخطاء.
برمجة ESP32 لبيان مستوى البطارية باستخدام خدمة الجات
بحلول هذا الوقت أفترض أن لديك فكرة عادلة عن خدمة الجات وكيف يتم تنفيذها باستخدام نماذج الخدمة والمميزات. الآن ، دعونا نتعمق في البرنامج لمعرفة كيفية تنفيذه في ESP32 باستخدام Arduino IDE. قبل أن نواصل ، أود استخدام هذه المساحة لأشكر Andreas Spiess على مقطع الفيديو BLE الذي أوضح الأمور كثيرًا من جانبي.
نبدأ البرنامج عن طريق استيراد المكتبات المطلوبة إلى مخططنا. هناك الكثير من الأشياء التي يجب تهيئتها من أجل استخدام وظيفة BLE الخاصة بـ ESP32 ونأمل على الرغم من ذلك بفضل نيل كولبان الذي قام بالفعل بالعمل الشاق لنا وقدم المكتبات. إذا كنت ترغب في فهم وظائف المكتبات ، يمكنك الرجوع إلى وثائقه على صفحة جيثب.
#تضمن
بعد ذلك ، يتعين علينا تحديد وظيفة إعادة الاتصال بالخادم لجهاز Bluetooth الخاص بنا. قبل ذلك دعنا نفهم ما هي وظيفة رد الاتصال في BLE.
ما هي وظيفة رد الاتصال في BLE؟
عندما يعمل BLE كخادم ، من المهم تحديد وظيفة رد اتصال الخادم. هناك العديد من أنواع عمليات الاسترجاعات المرتبطة بـ BLE ، ولكن لتبسيط الأمر ، يمكنك اعتبارها بمثابة إقرار يتم تنفيذه للتأكد من اكتمال الإجراء. يتم استخدام رد اتصال الخادم للتأكد من إنشاء الاتصال بين العميل والخادم بنجاح.
نستخدم سطور التعليمات البرمجية التالية لإجراء استدعاء للخادم.
bool _BLEClientConnected = خطأ ؛ class MyServerCallbacks : العامة BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true؛ } ؛ void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false ؛ } }؛
داخل وظيفة الإعداد الفارغ ، بدأنا الاتصال التسلسلي على 115200 لتصحيح الأخطاء ثم نهيئ جهاز Bluetooth من خلال وظيفة InitBLE .
إعداد باطل () { Serial.begin (115200) ؛ Serial.println ("مؤشر مستوى البطارية - BLE") ؛ InitBLE () ، }
إن initBLE هو المكان الذي يحدث فيه كل السحر. يتعين علينا إنشاء خادم Bluetooth واستخدام خدمة مستوى البطارية هنا. ولكن قبل ذلك يتعين علينا تحديد UUID للخدمة والخصائص والواصف لقراءة مستوى البطارية. يمكن الحصول على جميع UUID من موقع خدمة Bluetooth GATT. بالنسبة لحالتنا ، نحاول استخدام خدمة البطارية والمعرف الفريد العمومي (UUID) لأنه يتم تعريفه على أنه 0X180F كما هو موضح أدناه.
بعد ذلك ، نحتاج إلى معرفة الخاصية المرتبطة بهذه الخدمة. لمعرفة ذلك ، انقر ببساطة على Battery Service وسيتم نقلك إلى صفحة خصائص الخدمة ، حيث يُذكر أن مستوى البطارية هو اسم الخصائص ويأخذ القيمة من 0 إلى 100. لاحظ أيضًا أنه يمكننا إجراء عمليتين فقط الإجراءات بهذه الخاصية ، أحدهما هو القراءة وهو إلزامي للقيام به والآخر هو الإخطار وهو اختياري. لذلك يتعين علينا إرسال قيمة البطارية إلى العميل (الهاتف) وهو أمر إلزامي وإذا لزم الأمر يمكننا إخطار الهاتف بشأن أيهما اختياري.
لكن انتظر ما زلنا لم نجد قيمة UUID لمستوى البطارية المميز. للقيام بذلك ، ادخل إلى صفحة خصائص البطارية وابحث عن اسم مستوى البطارية ، ستجد UUID الخاص به على أنه 0X2A19 ، وتظهر لقطة منه أدناه.
الآن بعد أن أصبح لدينا جميع القيم ، دعنا نضع البرنامج كما هو موضح أدناه. اسم BatterySerivce ، BatteryLevelCharacteristic و BatteryLevelDescriptor هم يحددها المستخدم المتغيرات للإشارة إلى الخدمة، مميزة واصف التي نستخدمها في البرنامج. يتم استخدام قيمة واصف 0X2901 عندما يكون حجم القيمة 8 بت ، يمكن العثور على مزيد من المعلومات في صفحة وصف واصف.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUID ((uint16_t) 0x2A19) ، BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY) ؛ BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901)) ؛
العودة إلى وظيفة initBLE . يتعين علينا أولاً بدء تشغيل خادم BLE وجعله يعلن باسم. و يتم استخدام الأسطر التالية لبدء بليه كخادم. الاسم الذي أعطيته لخادم BLe الخاص بي هو "BLE Battery" ، ولكن يمكنك اختيار اسمك الخاص.
BLEDevice:: init ("BLE Battery") ؛ // إنشاء خادم 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 (new BLE2902 ()) ؛
أخيرًا ، تم تعيين كل شيء ، والآن كل ما تبقى هو مطالبة ESP32 بالإعلان حتى تتمكن الأجهزة الأخرى مثل هاتفنا من اكتشافه والاتصال به ، وعند الاتصال بعميل ، يجب بدء خدمة البطارية التي يمكن القيام بها من خلال الأسطر التالية.
pServer-> getAdvertising () -> addServiceUID (BatteryService) ؛ pBattery-> بدء () ؛ // بدء الإعلان عن pServer-> getAdvertising () -> start () ؛
هذا جيد حتى الآن ، فإن الخطوة الأخيرة هي إخبار الواصف بقيمة البطارية بالنسبة المئوية التي يجب إرسالها إلى العميل (الهاتف). يمكن أن تتراوح هذه القيمة من 0 إلى 100 كما قرأنا سابقًا ، لإبقاء الأمور بسيطة ، لقد قمت بترميز قيمة البطارية لتكون 57 ثم زيادتها كل 5 ثوانٍ والبدء من 0 بمجرد أن تصل إلى 100. الرمز المطلوب القيام به هذا هو مبين أدناه. لاحظ أن القيمة التي يتم إرسالها بتنسيق unit8_t.
مستوى uint8_t = 57 ؛ حلقة فارغة () { BatteryLevelCharacteristic.setValue (& level، 1)؛ BatteryLevelCharacteristic.notify () ، تأخير (5000) ؛ المستوى ++ ؛ Serial.println (int (المستوى)) ؛ إذا (int (المستوى) == 100) المستوى = 0 ؛ }
اختبار خدمة الجات الخاصة بك على ESP32 BLE
و تعطى رمز كاملة موضح أعلاه في نهاية الصفحة. قم بتحميل الكود على لوحة ESP32 الخاصة بك. بمجرد تحميل هاتفك ، يجب أن يكتشف جهاز Bluetooth يسمى "BLE Battery" يقترن به.
ثم قم بتثبيت تطبيق nRF android وافتحه واتصل بجهاز BLE Battery BLE. قم بتوسيع قسم خدمة البطارية وستجد الشاشة التالية.
كما ترى ، حدد التطبيق تلقائيًا أن BLE يوفر خدمة البطارية وله خصائص مستوى البطارية بسبب UUID الذي استخدمناه في البرنامج. يمكنك أيضًا أن ترى أن قيمة البطارية الحالية التي تبلغ 67٪ تنتظر لمدة 5 ثوانٍ ويمكنك أيضًا ملاحظة أنها تزداد.
الشيء الرائع في استخدام BLE هو أن أي تطبيق يعمل مع BLE سيعتقد الآن أن ESP32 هو جهاز BLE يقوم بإعلام مستوى البطارية. لتجربته ، استخدمت تطبيقًا يسمى BatON وحدد التطبيق ESP32 كجهاز Bluetooth يعمل بالبطارية وأعطى إشعار النسبة المئوية على هاتفي مثل هذا
رائع!! حق؟ لقد أظهرت أيضًا العمل الكامل في الفيديو أدناه. الآن ، بعد أن تعلمت كيفية استخدام خدمات BLE Battery مع ESP32 ، يمكنك تجربة خدمات GATT الأخرى أيضًا والتي تعتبر مثيرة جدًا للاهتمام مثل معدل النبض ، HID ، معدل ضربات القلب وما إلى ذلك.. استمتع…