Advertising Data هي بيانات منظمة يرسلها جهاز BLE في حزم الإعلانات لتحديد هويته وخدماته. يحدد Bluetooth Core Specification 5.4 (2023) تنسيق AD Structure: كل عنصر يحتوي على طول (1 بايت) ونوع (1 بايت) وقيمة (حتى 29 بايت). يصف المواصفات أكثر من 30 نوع AD — من Flags و Local Name إلى Service UUID و Manufacturer Specific Data. التعبئة الصحيحة لـ advertising data ضرورية لتوافق الجهاز مع iOS وAndroid والمنصات الأخرى، كما تحدد سرعة الاكتشاف وكفاءة استهلاك الطاقة للإعلان.
النقاط الرئيسية
Advertising Data هي مجموعة منظمة من الحقول التي يرسلها جهاز BLE في حزم الإعلانات لتحديد هويته ووصف قدراته. يقوم الجهاز المركزي (Central)، بمسح الأثير، بقراءة هذه البيانات واتخاذ قرار: الاتصال بالجهاز، أو تجاهله، أو طلب معلومات إضافية عبر Scan Response.
يتم تنظيم البيانات وفق مبدأ TLV (Type-Length-Value): كل عنصر AD يتكون من ثلاثة حقول. Length (1 بايت) هو طول Value + Type (أي الطول الإجمالي للعنصر ناقص 1 بايت للطول). Type (1 بايت) هو معرف نوع البيانات من Bluetooth Assigned Numbers. Value (N بايت) هو المحتوى حسب النوع.
يمكن أن تحتوي حزمة الإعلانات القياسية على ما يصل إلى 31 بايت من بيانات AD. إذا لم يكن ذلك كافياً، يتم استخدام Scan Response (31 بايت أخرى) أو Extended Advertising (BLE 5.0، حتى 251 بايت). البايتات الأولى من حزمة الإعلانات محجوزة لرأس PDU وعنوان الجهاز — يبدأ حمولة AD من إزاحة.
كل عنصر AD في حزمة الإعلانات يبدأ بحقل Length (1 بايت). تشير قيمة Length إلى عدد البايتات التالية بعد Length — أي Type + Value. على سبيل المثال، عنصر بطول 3 يعني أنه بعد Length يوجد 1 بايت من Type و 2 بايت من Value. تنتهي الحزمة عندما يصل مجموع أطوال جميع العناصر إلى حجم بيانات الإعلان.
| الحقل | الحجم | الوصف |
|---|---|---|
| Length | 1 بايت | طول Type + Value (باستثناء Length) |
| Type (AD Type) | 1 بايت | معرف نوع البيانات من Bluetooth SIG |
| Value | 0–29 بايت | بيانات النوع المحدد |
يقوم محلل Central بقراءة تسلسل عناصر AD بدءاً من أول بايت بعد الرأس. إذا كان Length=0، يتم تجاهل العنصر وينتقل المحلل إلى البايت التالي. أنواع AD المكررة — عدة عناصر بنفس النوع في حزمة واحدة — مسموح بها، لكن قد يعالج Central الأول أو الأخير فقط حسب تنفيذ المكدس.
قاعدة مهمة: يجب ألا يتجاوز مجموع Length(+1) في الحزمة حجم بيانات الإعلان (31 بايت لـ advertising PDU). إذا كانت البيانات لا تتسع، يجب تحديد الأولويات — أي أنواع AD ضرورية للاكتشاف الأولي وأيها يمكن نقلها إلى Scan Response.
Flags (AD Type 0x01) هو عنصر إلزامي في حزمة الإعلانات لأي جهاز BLE. يشغل 3 بايتات: Length (0x02)، Type (0x01)، Value (1 بايت من الأعلام الثنائية). تحدد الأعلام أوضاع الاكتشاف وقدرات الجهاز. توصي Core Specification بتضمين Flags في كل حزمة إعلانات.
الأعلام الرئيسية: LE Limited Discoverable Mode (بت 0) — الجهاز قابل للاكتشاف لفترة محدودة، LE General Discoverable Mode (بت 1) — الجهاز قابل للاكتشاف دائماً، BR/EDR Not Supported (بت 2) — الجهاز يدعم LE فقط، Simultaneous LE and BR/EDR (بت 3) — يدعم كلا الوضعين. للأجهزة التي تعمل بـ BLE فقط، التركيبة الإلزامية هي LE General Discoverable + BR/EDR Not Supported.
قيمة Flags غير الصحيحة هي أحد الأسباب الشائعة لعدم اكتشاف الجهاز في iOS أو Android. على سبيل المثال، إذا لم يتم تعيين علم BR/EDR Not Supported، قد يحاول iOS الاتصال عبر Bluetooth الكلاسيكي بدلاً من BLE. تحقق من قيمة Flags عند تصحيح حزمة الإعلانات باستخدام محلل Bluetooth (nRF Connect, Wireshark).
Local Name (AD Type 0x08 أو 0x09) هو الاسم المعروض لجهاز BLE. النوع 0x08 (Shortened Local Name) — اسم مختصر، يُستخدم عندما لا يتسع الاسم الكامل في حزمة الإعلانات. النوع 0x09 (Complete Local Name) — الاسم الكامل للجهاز. الحد الأقصى لطول الاسم هو 248 بايت، لكن في حزمة الإعلانات القياسية يتوفر ما لا يزيد عن 28 بايت.
إذا تجاوز اسم الجهاز المساحة المتاحة في حزمة الإعلانات، يُوصى بوضع الاسم المختصر في advertising PDU (نوع 0x08)، والاسم الكامل في Scan Response (نوع 0x09). يعرض iOS الاسم من حزمة الإعلانات أثناء المسح، بينما يصبح الاسم الكامل متاحاً بعد الاتصال أو Scan Response.
عند اختيار اسم الجهاز، ضع في اعتبارك: الاسم الطويل جداً يشغل مساحة يمكن استخدامها لـ Service UUID أو بيانات مهمة أخرى. طول الاسم الموصى به هو 8–16 حرفاً. تجنب الأحرف غير القياسية والمسافات — قد تتعامل بعض مكدسات BLE معها بشكل غير صحيح.
Service UUID (AD Type 0x02–0x07) هو أحد أهم أنواع AD، حيث يسمح لـ Central بتحديد الخدمات التي يوفرها الجهاز دون الاتصال به. يحدد Bluetooth SIG عدة تنسيقات لإرسال UUID حسب الحجم: 0x02 (Incomplete 16-bit)، 0x03 (Complete 16-bit)، 0x04 (Incomplete 32-bit)، 0x05 (Complete 32-bit)، 0x06 (Incomplete 128-bit)، 0x07 (Complete 128-bit).
UUID 16 بت (2 بايت) — للخدمات القياسية من Bluetooth SIG، مثلاً 0x180F (Battery Service)، 0x180A (Device Information). UUID 128 بت (16 بايت) — للخدمات المخصصة التي يحددها المطور. UUID 16 بت يشغل فقط 4 بايتات في AD (Length + Type + 2 بايت UUID)، بينما UUID 128 بت يشغل 18 بايت. إذا كان يجب إرسال عدة UUID مخصصة في حزمة واحدة، فقد لا تتسع في 31 بايت.
يُوصى باستخدام النوع Incomplete (0x02/0x04/0x06) إذا لم يتم إرسال جميع UUID للجهاز، بل فقط الأكثر أهمية للتصفية. يتم إرسال القائمة الكاملة لـ UUID عبر Scan Response أو GATT Discovery بعد الاتصال. هذا يوفر مساحة في حزمة الإعلانات لأنواع AD الأخرى.
Manufacturer Specific Data (AD Type 0xFF) هو أكثر أنواع AD مرونة، مصمم لنقل البيانات المخصصة للشركة المصنعة. أول 2 بايت من Value هما Company Identifier Code المعين من Bluetooth SIG (مثلاً 0x004C لـ Apple، 0x0075 لـ Samsung). البايتات المتبقية هي بيانات عشوائية بتنسيق تحدده الشركة المصنعة.
تستخدم Apple Manufacturer Data لـ iBeacon: Company ID (0x004C)، نوع المنارة (0x0215)، UUID (16 بايت)، Major (2 بايت)، Minor (2 بايت)، TX Power (1 بايت). تستخدم Google تنسيقاً مشابهاً لـ Eddystone. غالباً ما يضع مصنعو أجهزة إنترنت الأشياء قراءات المستشعرات أو حالة الجهاز في Manufacturer Data.
// Parse Manufacturer Specific Data on Central
function parseManufacturerData(data) {
const view = new DataView(data.buffer);
// Company Identifier Code (first 2 bytes)
const companyId = view.getUint16(0, true);
// Check for Apple iBeacon
if (companyId === 0x004C) {
return parseIBeacon(view);
}
return null;
}
عند استخدام Manufacturer Data، من المهم مراعاة الحد الأقصى للحجم: 31 بايت لحزمة الإعلانات بأكملها مطروحاً منها أنواع AD الإلزامية. بالنسبة لـ Apple iBeacon، تشغل الحزمة بأكملها 30 بايت، تاركة مساحة فقط لـ Flags (3 بايت). بالنسبة لـ Eddystone — حتى 31 بايت. يمكن أن تتضمن التنسيقات المخصصة المدمجة درجة الحرارة أو الرطوبة أو الضغط في 4–8 بايت.
التعبئة الصحيحة لـ advertising data هي فن وضع أقصى قدر من المعلومات المفيدة في المساحة المحدودة البالغة 31 بايت. تعتمد الاستراتيجية على غرض الجهاز: المنارة تحتاج إلى معرف، مستشعر إنترنت الأشياء يحتاج إلى قراءات، متتبع اللياقة البدنية يحتاج إلى اسم و UUID للخدمات. المبدأ العام: كلما كان على Central اتخاذ قرار أسرع، كلما كانت البيانات更需要 تواجدها في advertising PDU.
الاستراتيجية الموصى بها: advertising PDU (أول 31 بايت) — Flags (3 بايت) + Service UUID واحد 16 بت (4 بايت) + اسم مختصر (حتى 12 حرفاً = 14 بايت) + Manufacturer Data (حتى 10 بايت). Scan Response (ثاني 31 بايت) — الاسم الكامل (المتبقي) + Service UUID إضافية + TX Power Level (3 بايت). هذا التوزيع يسمح لـ Central بتصفية الأجهزة بسرعة حسب UUID.
| الأولوية | نوع AD | الحجم | يوضع في |
|---|---|---|---|
| 1 (إلزامي) | Flags (0x01) | 3 بايت | Advertising PDU |
| 2 (تصفية) | Service UUID (0x02–0x03) | 4+ بايت | Advertising PDU |
| 3 (تعريف) | Local Name (0x08–0x09) | 2+ بايت | Advertising PDU (مختصر) |
| 4 (إضافي) | TX Power Level (0x0A) | 3 بايت | Scan Response |
| 5 (مخصص) | Manufacturer Data (0xFF) | 4+ بايت | Advertising PDU / Scan Response |
| 6 (بيانات كاملة) | UUID المتبقية | حسب الحجم | Scan Response |
تصحيح advertising data هو مرحلة إلزامية في تطوير أجهزة BLE. استخدم nRF Connect (Nordic Semiconductor) أو Wireshark مع محلل Bluetooth لعرض البيانات الخام للحزمة. تحقق من أن جميع أنواع AD لها Length صحيح، وأن مجموع الأطوال لا يتجاوز 31 بايت، وأن Flags مضبوطة بشكل صحيح لحالة الاستخدام الخاصة بك.
الأسئلة الشائعة
سيقوم مكدس Bluetooth Controller بتجاهل البيانات التي تتجاوز الحد أو لن يرسل الحزمة. تحقق من الطول الإجمالي لعناصر AD عند تجميع حزمة الإعلانات. إذا كانت البيانات لا تتسع، انقل جزءاً منها إلى Scan Response أو استخدم Extended Advertising (BLE 5.0) بحد 251 بايت.
نعم، عبر Manufacturer Specific Data (0xFF). قم بتغليف القراءات في 4–8 بايت: مثلاً درجة الحرارة (2 بايت بتنسيق fixed-point)، الرطوبة (2 بايت)، جهد البطارية (2 بايت). هذا النهج يسمح لـ Central بقراءة البيانات دون اتصال، مما يوفر الطاقة.
للخدمات المخصصة، استخدم UUID 128 بت (AD Type 0x06–0x07). إذا كان UUID لا يتسع في advertising PDU (16 بايت لكل UUID)، انقله إلى Scan Response أو استخدم التنسيق المختصر Incomplete (0x06) لتحديد أول UUID أو اثنين فقط.
Complete — في الحزمة يتم إدراج جميع UUID لخدمات الجهاز. Incomplete — جزء فقط من UUID (عادةً الأكثر أهمية). لا يمكن لـ Central الاعتماد على Incomplete كقائمة كاملة، لكنه يستخدمها للتصفية السريعة. القائمة الكاملة متاحة بعد GATT Discovery.
سبب شائع هو Flags (0x01) غير صحيح. تأكد من تعيين بت BR/EDR Not Supported. السبب الثاني هو عدم وجود Service UUID في حزمة الإعلانات (iOS يقوم بالتصفية حسب UUID). السبب الثالث هو أن الجهاز يعلن بشكل نادر جداً (iOS يتوقع فاصل زمني لا يزيد عن 1000 مللي ثانية).
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.