مقدمة مكثفّة عن Bluetooth Low Energy (BLE)
إن بروتوكول البلوتوث هو بروتوكول لاسلكي واسع الانتشار ومستخدم بكثافة في سوق الهواتف المحمولة. شهد عام 2001 أول هاتف محمول مزوّد بالبلوتوث وهو Sony Ericsson T36، وقد تطور بروتوكول البلوتوث عبر السنوات ليواكب متطلبات السوق التكنولوجي، ففي النسخة 4.0 من البلوتوث تم الإعلان عن بروتوكول جديد يسمى Bluetooth Low Energy (BLE) والذي يستهدف أجهزة انترنت الأشياء IoT التي تعمل على بطاريات بسعات صغيرة جداً.
بدءاً من النسخة 4.0 في عام 2010 أصبح البلوتوث يتألف من 3 بروتوكولات: Classic Bluetooth و Bluetooth high speed و Bluetooth Low Energy (BLE) وقد سمح توصيف بلوتوث 4.0 أن يدعم الجهاز نمط واحد single-mode أو نمطين dual-mode، حيث يدعم النمط الواحد BLE بينما يدعم النمطين التشغيل إما كـ BLE أو classic Bluetooth protocol. تسمية أخرى تطلق على أجهزة النمطين وهي Bluetooth Smart Ready و أجهزة النمط الواحد بـ Bluetooth Smart.
تُستخدم في توصيف البلوتوث الكثير من المصطلحات التقنيّة، ولكن في هذه المقالة سيتم إبقاء الأمور بسيطة قدر الإمكان.
لماذا يسمى Bluetooth Stack ؟
ربما هذا هو المصطلح الأول الذي سيتم قراءته في معظم المراجع، حيث يتألف البلوتوث من مجموعة من الطبقات لبروتوكولات فرعية تشكل ككل البلوتوث، ولذلك تم تسميته بـ Bluetooth Stack. يمكن توصيف ذلك تماماً كطبقات الشبكات المعروفة بـ OSI model، حيث تكون مسؤولة كل طبقة عن مهام محّددة. في البلوتوث، طبقات مسؤولة عن الإشارات الراديوية وأخرى للتقسيم/التجميع fragmentation/defragmentation أو التشفير/فك التشفير encryption/decryption وأخرى مسؤولة عن تنظيم كيفية الوصول للمعلومات أو إذاعة broadcast معلومات الجهاز، ولذلك هذا مشابه جداً لنموذج OSI.
المصدر: كتاب Getting Started with Bluetooth Low Energy
المصدر: Tosi, J.; Taffoni, F.; Santacatterina, M.; Sannino, R.; Formica, D. Performance Evaluation of Bluetooth Low Energy: A Systematic Review. Sensors 2017, 17, 2898.
يجب معرفة البنية الأساسية العامّة، وذلك قبل إعطاء فكرة عن كل طبقة من طبقات البلوتوث:
- المتحكم Controller: يجمع طبقتي LE PHY و Link Layer والمسؤولة عن الاتصال اللاسلكي الفيزيائي وتبادل الإشارات وغير ذلك.
- المُضيف Host: يجمع الطبقات L2CAP و SMP و GAP و ATT و GATT و التي تنظم كيفية الوصول للمعطيات الحقيقة على الجهاز واكتشافه في الوسط المحيط وغير ذلك.
- الطبقة الوسيطة بين المضيف و المتحكم Host-Controller Interface (HCI): طبقة وسيطة واصلة بين المتحكم والمضيف ولها بروتوكول بتعليمات محددّة.
- التطبيق Application: الكود البرمجي الحقيقي لبرنامجك، على سبيل المثال البرنامج في الذاكرة فلاش الذي ينفذه المتحكم الصغري MCU.
المصدر: كتاب Getting Started with Bluetooth Low Energy
بالعودة إلى المصطلحات العمليّة وبناءً على هذه الأقسام الرئيسية الثلاثة فإن آيسيات الـ BLE يمكن أن تحوي:
- المتحكم Controller وواجهة HCI.
- المتحكم Controller والمُضيف Host مع بروتوكول مخصّص من الشركة المصنّعة وليس منظّمة البلوتوث.
- كل المكونات في نظام واحد System on Chip (SoC) ( وهو فعلياً متحكم صغري MCU مع ذاكرة فلاش لتخزين كود البرنامج والمتحكم والمضيف وواجهة الربط بينهما).
كمثال:
- إن شريحة CC256x من شركة TI هي مثال عن النوع الأول الذي يحوي المتحكم Controller وواجهة HCI فقط.
CC256x Internal Block Diagram – Datasheet
- إن شريحة ESP32 من شركة Espressif أو شريحة NRF5xxxx من شركة Nordic Semiconductor (مثال: NRF52832) هي أمثلة للنوع الثالث الذي يحوي على كل المكونات المطلوبة لتنفيذ تطبيق BLE على شريحة واحدة.
BLE Software Stack
إن BLE Software Stack هو أحد المصطلحات الأخرى التي ترد بكثرة، وهو البرنامج المسؤول عن إدارة وتنظيم عمل طبقات البلوتوث المختلفة الداخلية (أي لا يتضمن التطبيق الفعلي). تقدّم كل شركة نسختها الخاصة من BLE Software Stack لمنتجها، فمثلاً Softdevice هو المقدّم لشرائح NRF ونسخة من Bluedroid هي لشرائح ESP32 بينما Bluegiga هي لمنتجات SiliconLabs. تتيح بعض الشركات المصنّعة لشرائح الـSoC للمطورين استخدام الشريحة كشريحة BLE controller فقط، أي من دون بقية الطبقات.
ما يجب للمبتدئ معرفته من طبقات البلوتوث BLE؟
إن تفاصيل البلوتوث متشعّبة جداً بطريقة جعلت من مستند توصيف النسخة 4.2 عبارة عن مستند بطول حوالي 2700 صفحة!
لتجنب هذه المتاهة للمصطلحات الجديدة وللتركيز على فهم الـBLE يجب البقاء الآن في منحى النظر من الأعلى للأسفل، حيث يجب فهم ماهو الـ GAP و ATT و GATT وفي وقتٍ لاحق الـ SMP (مقالة أخرى)، إلى جانب ذلك إن فهماً عامّاً لكيفية عمل البلوتوث في (الاتصال connection، الإعلان advertising ، .. إلخ) هو أمرٌ أساسي أيضاً.
الإعلان Advertising (المعلن Advertiser والماسح Scanner)
إن جهاز الـBLE يقوم ببث broadcast بعض المعلومات وذلك لجعل أي جهاز قريب على علم بوجوده. إن الأجهزة التي تقوم بالبث تسمى advertisers والأجهزة التي تستقبل هذه الإعلانات تسمى scanners. إن حزم معطيات الإعلانات advertising packets يمكن استقبالها عموماً بواسطة كل الـscanners، مما يجعلها عموماً حزم غير متطلّبة للاقتران والاتصال connectionless packet، وهذا شبيه جداً لما تقوم به مثلاً نقاط الاتصال Access Points في الواي فاي حيث تقوم بالإعلان عن اسم الشبكة ونوع التشفير وبعض المعلومات الأخرى لكل الأجهزة المحيطة بشكل مفتوح عموماً.
إن طول Advertise packets data يمكن أن يصل لـ31 بايت مشكّلة كالتالي:
- البايت الأول: الطول (عدد البايتات) من غير هذا البايت.
- البايت الثاني: النوع AD type والذي يمكن أن بكون أحد الأنواع المحددة من البلوتوث.
- أخيراً، المعطيات AD data بطول حسب النوع.
- إن ما سبق هو بنية AD Structure ويمكن أن تحوي الحزمة الواحدة أكثر من بنية.
Bluetooth 4.2 Specification
أمثلة:
1- هذا جزء من كود لـESP32 من أجل تعريف advertising data:
static uint8_t raw_adv_data[] = { /* Len:2, Type:1 (flags), Data:6 */ 0x02, 0x01, 0x06, /* Len:2, Type:a (tx power), Data:eb*/ 0x02, 0x0a, 0xeb, /* Len:3, Type:3 (Complete List of 16-bit Service Class UUIDs), Data: FF 00 */ 0x03, 0x03, 0xFF, 0x00, /* Len:16, Type:9 (Complete Local Name) */ 0x0f, 0x09, 'E', 'S', 'P', '_', 'G', 'A', 'T', 'T', 'S', '_', 'D','E', 'M', 'O' };
2- وهذا مثال آخر لحزمة advertising مأخوذة من موقع شركة SiliconLabs :
هل هذا كل ما يحويه الـAD packet؟ لا، هناك ترويسة أيضاً تحوي على معلومات أخرى مهمّة عن نوع إمكانية الاتصال بهذا الجهاز connectability type.
مصدر الصورة من موقع Bluetooth SIG
إن الجدول التالي من كتاب Getting Started with Bluetooth Low Energy يبين الأنواع المختلفة لـ PDU types ولمعلومات أكثر عنها، يمكن مراجعة تدوينة على موقع البلوتوث بعنوان “Bluetooth Low Energy – It starts with Advertising”:
إن AD packet يمكن توظيفها لتنفيذ بروتوكول لا يحتاج اتصال connectionless protocol ومثاله بروتوكول iBeacon من آبل و Eddystone من غوغل، ومعنى أنه لا يحتاج للاتصال أي أن المستقبل لا يحتاج لإنشاء اتصال محدد مع المرسل وإنما يمكنه استقبال ما يرسله مباشرة.
بغض النظر عن المعاني المحدّدة لما ورد في الصورة أعلاه لحقول الـ Ibeacon packet كـAD packet إلا أنّه تم التنويه لهذا الموضوع كموضوع لقراءة مستقبلية للقارئ.
كيف يتم تخزين المعطيات الفعلية في جهاز BLE؟
حتى هذه المرحلة تم الحديث عن كيفية الإعلان advertise ومحتوى AD packets، ولكن ماذا لو أراد الجهاز إرسال قيمة البطارية عبر الـBLE أو ماذا لو أراد المستخدم التحكم بريليه عبر البلوتوث؟ كيف يتم تخزين البيانات وتبادلها؟ لنرى!
إن حجر البناء الأساسي يسمى Attribute Protocol (ATT) والذي يحدد الشكل العام لتخزين وتبادل معلومات الجهاز. بفهم مبسّط جداً، يمكن القول أن جهاز الـBLE يحوي جدول قاعدة معطيات بمدخلات لها شكل وتقسيم محدد كما يلي:
Bluetooth V 4.2 Specification
إن “Attribute Handle” (بطول 2 بايت) يمثل رقم سطر مميز لكل Attribute في الجدول، ويشكل “Attribute Type” (بطول 2 بايت أو طول 16 بايت) نوع هذا الـ Attribute ويسمى أيضاً UUID والذي يشير لماهية وطول ..إلخ الـAttribute value. أخيراً، يحدد “Attribute Permissions” صلاحيات القراءة/الكتابة لهذا الـAttribute. تعرّف البلوتوث مجموعة محجوزة مسبقاً لأرقام UUID لتشير لنوع محدد لتكون بذلك وحّدت الدلالة حتى وإن اختلف مصنعي الأجهزة وبرامجها. توجد هذه الأرقام على الموقع الرسمي.
إن الجهاز الذي يحوي قاعدة البيانات يسمى “server” والجهاز الذي يلج لهذه القاعدة “client”. إن الـServer يحوي عدد من الـattributes وهنا تأتي الـ“GATT Profile” لينظم هيكلية أعم باستخدام Attribute Protocol لاستكشاف وقراءة وكتابة … إلخ البيانات.
إن هيكليّة GATT المنطقيّة تتألف من: واحد أو أكثر من Service وكل Service لديها واحد أو أكثر من الـ Characteristic. تذكر: إن كل هذه البنى هي بالنهاية attributes من (Handler و UUID و value).
Bluetooth V 4.2 Specification
يظهر الجدول العملي التالي مثال لتلخيص ما مضى ذكره.
الصورة مأخوذة من فيديو على اليوتيوب من قناة Nordic Semiconductor
أول ملاحظة أن جميع المدخلات كما قلنا تتبع شكل الـ Attribute من (Handler و UUID و value)
- المدخلات أرقام 0x0001 و 0x0006 و 0x0007 و 0x000B هي للتصريح declare عن الخدمات الأساسيّة primary services المتوفرة وهي على التتالي 0x1800 UUID / GAP service و 0x1801 UUID / GATT service و 0x180F UUID / Battery service وأخيراً الـUUID بطول 16 بايت للتصريح عن خدمة مخصّصة غير معيارية وهذا الرقم يمكن اختياره من قبل المطوّر.
ملاحظة: إن أرقام الـUUID للخدمات يمكن معرفتها من موقع للبلوتوث.
- بعد كل تصريح عن خدمة، هناك تصريح عن characteristic وهي ذات النوع 0x2803 type وهي الأسطر 0x00002 و 0x0004 و 0x0008 و 0x000C. أما القيمة value فهي تتبع الشكل التالي:
Bluetooth V 4.2 Specification
لنأخذ سطر محدد ونقم بتحليله بناء على هذا الشكل
Attribute Handle: 0x00008 Attribute Type: 0x2803 Attribute Value: 0x12 0x00009 0x2A19
إن Characteristic Properties (0x12) سيجعل الصلاحيات عبارة عن إمكانية subscribe الإشتراك بالتنبيهات التي سترسل من الجهاز إلى المشترك Subscriber عند تغيّر القيمة (قيمة مستوى البطاريّة هنا) وأيضاً إمكانية إرسال طلب القراءة. يوضح هذا الجدول القيم التي يمكن أن يأخذها هذا الحقل.
Bluetooth V 4.2 Specification
إن Characteristic value attribute handel هو مؤشّر إلى رقم السطر الذي سيحوي القيمة الفعليّة (مستوى البطارية هنا)، وفي هذا السطر إن يشير للسطر 0x00009 والذي سيستخدم لقراءة/تخزين مستوى البطاريّة، وأخيراً إن Characteristic UUID هو رقم من بايتين ويمكن أن تكون قيمة مرجعيّة من البلوتوث نفسها أو رقم يحدده المستخدم عن تعريف Characteristics غير معياريّة وفي حالتنا هي تشير لـbattery level Characteristic.
الخاتمة
كما قيل سابقاً، إن بروتوكول البلوتوث يحوي العشرات من المصطلحات، ووحدها التجربة العمليّة تجعل هذه المصطلحات واضحة. هذه المقدّمة المكثفة ليست كاملة، ولكن من المفترض أن تعطي أرضية مناسبة لمن يريد برمجة الـBLE في ESP32 أو أي قارئ يريد استخدام شريحة من شركة أخرى. العديد من المصطلحات سيتم توضيحها أكثر وإعادة طرحها في الجزء اللاحق والذي سيكون تطبيق عملي على شريحة ESP32.
العديد من المراجع تم استخدامها لحصر هذه المعلومات ومنها:
- BLUETOOTH SPECIFICATION Version 4.2 Vol 0-4.
- Introduction to Bluetooth Smart – Nordic Semiconductor video tutorial via Youtube.
- Mohammed Afaneh’s series of BLE introduction via Youtube.
- Getting Started with Bluetooth Low Energy Book by Akiba, Carles Cufí, Kevin Townsend, and Robert Davidson.
- Inside Bluetooth Low Energy Second Edition by Naresh Guptaa.