إنترنت الأشياءلغة سي و متحكماتمقالات

كل ما يتعلق بـ ESP32 – الجزء الرابع 4

أساسيات Bluetooth Low Energy (BLE)

أجزاء سلسلة كل ما يتعلق بـESP32

متعلقات

 

إن بروتوكول Bluetooth Low Energy هو بروتوكول متعدد الطبقات multi-layer أو ما يدعى كمصطلح Bluetooth stack. إن خلفية جيدة بالمصطلحات المستخدمة في الـBLE هي متطلب أساسي قبل البدء بأي شيء عملي في طرفية البلوتوث في ESP32، وهذا تماماً السبب وراء كتابة مقال “مقدّمة مكثفة عن Bluetooth Low Energy“.

سيتم الشرح في هذا الجزء من سلسلة “كل ما يتعلّق بـESP32” أساسيات استخدام الـBLE. سوف نستخدم واحد من الأمثلة من الحزمة البرمجية الرسمية ESP32 SDK (ESP-IDF) كنقطة انطلاقة، وسوف نشير تكراراً لمحتوى تم شرحه في المقال “مقدّمة مكثفة عن Bluetooth Low Energy“، لذلك حاول الاطلاع عليه مسبقاً.

 

مثال مخدّم BLE GATT من الـESP-IDF

 

هذا المثال هو كتابة مخدّم server يحوي خدمات البلوتوث التي ستقوم الأجهزة client بالنفاذ إليها. سوف نبدأ بشرح الأجزاء الأهم من المثال الموجود في المسار التالي ESP-IDF-DIR\examples\bluetooth\gatt_server. سيعرّف هذا المثال اثنين من الـprofiles وسيقوم بنشر broadcast الإعلانات advertisements تحت اسم ESP_GATTS_DEMO. يحتوي كل profile على خدمة service واحدة وكل خدمة على characteristic واحد، وسوف نستخدم تطبيق الجوال NRF Connect للتفاعل مع الجهاز.

إن الـprofile حقيقة لا يعكس أي مدخل في جدول الـ attributes في الجهاز. بالواقع هو مجموعة معرّفة مسبقاً من الخدمات services. إن كلا الـprofile في هذا المثال  (Profile A & Profile B) يحويان على الخدمة نفسها و الـcharacteristic في الخدمة نفسه أيضاً، وإن التكرار الموجود له غرض تصميمي مذكور في التوثيق للمثال:

 

In this way, a single design, enabled by different Application Profiles, can behave differently when used by different smartphone apps, allowing the server to react differently according to the client app that is being used. In practice, each profile is seen by the client as an independent BLE service. It is up to the client to discriminate the services that it is interested in.

GATT Server Demo ESP32

 

التهيئة Initialization في الـ Main function

 

بالبدء من التابع main والجزء الخاص بالتهيئة

كما شاهدنا سابقاً في جزء سابق للاتصال باستخدام WiFi فإن التخزين غير المتلاشي يجب تهيئته حيث يتم تخزين بعض المتحولات غير قابلة للتلاشي في التقسيمة NVS partition.

ثم يبدأ الكود بتهيئة الـ Controller الجزء المهم من الـBluetooth stack باستخدام بارمترات افتراضية موجودة في  esp_bt.h. إن الـ Controller وكما تم شرحه في المقال السابق ينظّم ويدير كل ما يتعلق بالإشارات الراديوية، وبالإضافة إلى تهيئته يجب أيضاً تفعيل نمط الـBLE في الـ Controller.

يمكن للـ Controller أن يعمل في أكثر من نمط على اعتبار أن شريحة ESP32 هي من النوع الذي شرحناه سابقاً “Bluetooth Smart Ready”. هذا يعني أنه يمكن أن يعمل في أحد الأنماط التالية BLE mode أو Classic Bluetooth mode  أو dual-mode.

المهمّة الأخرى هي تفعيل الـBluetooth software stack وهو البرمجية الخلفيّة التي تقوم بعمليات داخليّة وتتحكم بالطبقات المختلفة للبروتوكول. إن ESP32 يستخدم نسخة معدلة من البرمجية Bluedroid.

تتمثل الخطوة التالية بتسجيل الـprofiles التي تحدثنا عنها وتوابع callback الخاصة بمعالجة الأحداث المختلفة للـGATT و GAP.

أكثر طبقتين ذات أهميّة لمعظم مطوري الـBLE هما: GAP وهي المسؤولة بشكل أساسي عن البث و الإعلان ، وطبقة GATT وهي المسؤولة عن تخزين وتبادل المعطيات الحقيقيّة من خلال مجموعة من الخدمات services والتي تحوي Characteristics والتي تحوي المعطيات المطلوبة.

قد تحصل الكثير من الأحداث على مستوى الـ GAP وGATT، وبالتالي تختلف الاستجابة تبعاً لنوع الحدث، ولهذا السبب يستخدم المطورون تابع تخديم لأحداث GAP و آخر GATT. يقوم BLE software stack لاحقاً باستدعاء هذه التوابع مع تمرير بعض الوسطاء parameters والمعلومات الخاصة بالحدث ليتم استخدامها في التابع call-back.

والأمر الآخر هو تسجيل كلا الـprofiles.

وأخيراً، نقوم بتحديد قيمة الـ Maximum Transmission Unit (MTU)  بـ 500 بايت. لكن ماذا يعني MTU ؟ إنه يقوم بتحديد حجم Attribute PDU (وليس الـATT في الـ ATT Table) . لمعرفة المزيد يمكن قراءة المقال الخاص بـMTU  من موقع Punchthrough. يقوم الـ Client و الـServer بتبادل حجم الـMTU عند إنشاء الاتصال. ملاحظة: إن ATT أطول من حجم MTU لا يمكن إرسالها.

 

البدء بـ Broadcasting/Advertisement

 

إن أول شيء يجب القيام لبدء بث الإعلانات هو تفعيل GAP advertisements بأن تحوي باكيتات من النوع القابل للاتصال وتحت اسم جهاز معين. لمعرفة المزيد من أنواع باكيتات الإعلانات يرجى قراءة الفقرة “الإعلان Advertising (المعلن Advertiser والماسح Scanner)” من المقال الأخير.

بالعودة إلى الكود، عندما نقوم بتسجيل الـprofile فإن حدث سيتم تفعيله وهو ESP_GATTS_REG_EVT، وبالمناسبة إن الأحداث المعرّفة في ESP-IDF يمكن أن تكون واحدة من التالي:

لنأخذ نظرة عن كثب أكثر عن gatts_event_handler :

ما يقوم هذا التابع وبشكل أساسي هو تفقد نوع الحدث، فإذا كان هو ESP_GATTS_REG_EVT فإن أول شيء يقوم به هو تسجيل interface number لكل profile. إن التوثيق الرسمي لهذا المشروع يقول أن:

“ GATT interface type in a different application on GATT client uses different gatt_if values.”

والأمر الآخر هو استدعاء تابع التخديم call-back function لكل profile وهما: gatts_profile_a_event_handler و gatts_profile_b_event_handler .

حيث تم سابقاً إسناد توابع تخديم لكل profile أثناء التصريح عن المصفوفة gl_profile_tab

والآن جزء من تابع تخديم gatts_profile_a_event_handler سوف يقوم بتحديد محتوى باكيت الإعلانات وتحديد أيضاً اسم الجهاز عبر التوابع esp_ble_gap_config_adv_data(&adv_data)  و esp_ble_gap_set_device_name(TEST_DEVICE_NAME) وبعد ذلك سيبدأ الحدث ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT داخل التابع esp_ble_gap_start_advertising ليقوم ببدء بث الإعلانات فعلياً باستخدام التابع esp_ble_gap_start_advertising وذلك عند الحدث ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT .

سيقوم الكود أيضاً بتعريف وإنشاء خدمة service داخل كل profile باستخدام esp_ble_gatts_create_service. إن هذا التابع يأخذ 3 وسطاء وأحدهم هو عدد المدخلات number of handlers/ATT التي نحتاجها في جدول الوسطاء ATT  على اعتبار أن كل خدمة يمكن أن تحوي عدد مختلف من الـcharacteristic. إن الخدمة بشكلها الأبسط يمكن أن تحوي characteristic واحدة وكل characteristic ستحوي على تعريف characteristic declaration وعلى مؤشّر على مكان تواجد القيمة الحقيقة Characteristic value attribute handle وعلى القيمة ذاتها. لذلك العدد الأساسي هو 4:

  • Service declaration
  • Characteristic declaration
  • Characteristic value attribute handle.
  • القيمة بحد ذاتها

لمزيد من المعلومات يرجى مراجعة الفقرة “كيف يتم تخزين المعطيات الفعلية في جهاز BLE؟” في مقالنا السابق وأيضاً إجابة من أحد مطوري شركة Espressif عن سؤال متعلق.

 

إنشاء اتصال وإرسال طلبات قراءة/كتابة

 

كما قلنا سابقاً، فإننا بحاجة إلى بث باكيتات إعلانية من النوع القابل للاتصال، لكي تسمح للـ Central أن يطلب الاتصال من الـ Peripheral ويمكننا من الكود رؤية نوع الباكيتات وهي قابلة للاتصال.

لنستذكر أنواع الباكيتات بناءً على جدول من المقال السابق.

 

“Getting Started with Bluetooth Low Energy” Book

 

عندما يقوم الـCentral (مثلاً الموبايل) بطلب الاتصال وتحديداً بخدمة من profile A، فإن بارمترات الاتصال يتم تحديثها وسيصبح مثلاً الوقت قبل فصل الاتصال غير النشط إلى 4 ثواني. انظر على هذه الحالة داخل كود التابع gatts_profile_a_event_handler:

يمكننا بعد الاتصال القراءة أو الكتابة أو الاشتراك بالتنبيهات طالما أنها كلها مسموحة في كل من A و B:

لنلقِ نظرة عن طلبات القراءة ماذا ستعيد … سوف تعيد رد يحوي قيمة محددة من 4 بايتات موصوفة في الكود:

 

وأخيراً، تطبيق المثال بشكل عملي

 

لقد استخدمت تطبيق أندرويد يسمى NRF Connect لاستكشاف الخدمات على الجهاز والاتصال به وإرسال طلبات قراءة وكتابة.

 

NRF Connect App ESP GATTS Demo ADV

بث الإعلانات تحت اسم “ESP_GATTS_DEMO”

 

NRF Connect App ESP GATTS Demo Services

الخدمات المتاحة

 

NRF Connect App ESP GATTS Demo Read/writing request

تجريب إرسال طلبات قراءة وكتابة

 

الخاتمة

 

يجب للقارئ المطلع على المقال السابق “مقدّمة مكثفة عن Bluetooth Low Energy” وعلى هذا الجزء من السلسلة الذي شرح أهم أجزاء المثال “gatt_server” من ESP-IDF SDK أن تتشكل لديه الآن فكرة أساسية جداً عن مفهوم الـBLE وعن كيفيّة تصميم تطبيق بسيط بدءاً من مثال جاهز كالمطروح في هذا المقال.

على الرغم أن التوثيق الرسمي للمشروع على Github هو توثيق شامل إلى حدٍّ كبير إلا أنه كان من الأفضل إعادة صياغته على أسلوب أنسب للقادمين الجدد في هذا المجال.

في المقال القادم سنعمل على إنشاء خدمة للتحكم بليد موصول على الدارة بالاعتماد على كود المثال المستخدم هنا ولكن مع إعادة كتابة وترتيب الكثير من الأجزاء.

أجزاء سلسلة كل ما يتعلق بـESP32

متعلقات

Yahya Tawil

مهندس نظم مضمّنة مهتم بالعتاد مفتوح المصدر وولد في نفس العام الذي ولد فيه نظام تشغيل لينكس. يحيى هو مدير التحرير في عتاديات ويؤمن بأهمية المحتوى المكتوب المجاني والنوعي والعملي. خبرته في مجال النظم المضمّنة تتركز في كتابة البرامج المضمنة وتصميم الدارات المطبوعة والنظرية وإنشاء المحتوى.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.