MTU في BLE: ما هو، حجم الحزمة والتفاوض

المؤلف: IT Sectr نُشر: 2026-07-15 وقت القراءة: 10 دق

MTU (Maximum Transmission Unit) هو الحجم الأقصى للبيانات المفيدة في حزمة BLE واحدة يمكن نقلها بين الأجهزة في معاملة GATT واحدة. في BLE Classic (4.x)، يكون MTU ثابتًا عند 23 بايت، وهو كافٍ لقراءات أجهزة الاستشعار الصغيرة، لكنه غير كافٍ لنقل الملفات أو التحديثات عبر الهواء (OTA). قدمت Bluetooth Core Specification 4.2 (2014) إجراء طلب حجم MTU (MTU Size Request)، مما يسمح بالتفاوض على MTU أكبر — حتى 247 بايت (BLE 5.0 — حتى 251 بايت). يعد التكوين الصحيح لـ MTU أحد العوامل الرئيسية لأداء تطبيقات BLE التي تنقل كميات كبيرة من البيانات.

النقاط الرئيسية

  • MTU — الحجم الأقصى للبيانات في حزمة BLE واحدة، من 23 بايت (BLE 4.x) إلى 251 بايت (BLE 5.0).
  • يتم التفاوض على MTU عبر MTU Size Request/Response بعد إنشاء اتصال GATT.
  • يزيد MTU الكبير (247 بايت) سرعة نقل البيانات بمقدار 5–10 مرات مقارنة بـ 23 بايت القياسية.
  • يطلب Android تلقائيًا MTU بحجم 517 بايت مع BLE 5.0، ويطلب iOS 512 بايت عبر requestMTU.
  • في تحديثات البرامج الثابتة OTA، يقلل MTU الكبير وقت النقل من دقائق إلى ثوانٍ.

ما هو MTU في BLE؟

Maximum Transmission Unit (MTU) في سياق BLE هو الحجم الأقصى لوحدة بيانات بروتوكول التطبيق (APDU) التي يمكن للجهاز قبولها في طلب GATT واحد. يتم تعريف MTU على مستوى ATT (بروتوكول السمات) ويتضمن رأس ATT (1 بايت) + البيانات المفيدة. افتراضيًا، تدعم جميع أجهزة BLE MTU بحجم 23 بايت (23 = 1 بايت رأس ATT + 22 بايت بيانات).

MTU ليس حدًا ماديًا لقناة الراديو، بل هو اتفاق بين الأجهزة على مستوى GATT. يمكن أن يكون حجم حزمة BLE المادي في طبقة الارتباط (Link Layer) أكبر (حتى 27 بايت في BLE 4.0، وحتى 257 بايت في BLE 5.0 مع Data Length Extension)، لكن طبقة GATT تحد من كمية البيانات المنقولة لكل معاملة. Data Length Extension (DLE) هي آلية منفصلة في طبقة الارتباط تزيد الحزمة المادية إلى 251 بايت ويجب التفاوض عليها بشكل مستقل.

الفرق بين MTU و DLE: ATT MTU — كمية البيانات المنقولة لكل طلب GATT، DLE — كمية البيانات التي تسعها حزمة طبقة ارتباط واحدة. لتحقيق أقصى سرعة، يجب التفاوض على كلا المعاملين. بدون DLE، حتى مع MTU بحجم 247 بايت، ستتجزأ البيانات إلى عدة حزم طبقة ارتباط بحجم 27 بايت، مما يقلل الإنتاجية.

التفاوض على MTU: الإجراء والبروتوكول

MTU Size Request — إجراء يبدأه الجهاز المركزي (Central) بعد إنشاء اتصال GATT. يرسل المركزي طلب MTU Request يحدد سعة MTU الخاصة به (أقصى حجم يمكنه قبوله). يستجيب الطرف المحيطي (Peripheral) باستجابة MTU Response بقيمته الخاصة. MTU الناتج هو القيمة الأصغر من القيمتين. إذا عرض المركزي MTU بحجم 512 وكان الطرف المحيطي يدعم 128 فقط، سيستخدم الاتصال MTU بحجم 128.

swift
import CoreBluetooth

// طلب أقصى MTU في iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// يتفاوض iOS على MTU تلقائيًا عند الاتصال
            // MTU = 512 لأجهزة BLE 5.0
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("MTU المتفاوض عليه: " +
          String(mtu))
}

توقيت التفاوض: يجب إرسال طلب MTU Request بعد اكتشاف الخدمات (discoverServices)، ولكن قبل بدء نقل البيانات النشط. في iOS Core Bluetooth، يتم التفاوض على MTU تلقائيًا عند الاتصال — لا يحتاج المطور إلى إرسال MTU Request يدويًا. في Android، يجب استدعاء requestMTU صراحة. بمجرد التفاوض، يظل MTU ثابتًا لهذا الاتصال — لا يمكن إعادة التفاوض بدون قطع الاتصال وإعادة الاتصال.

قيود ATT: لماذا لا يمكن أن يتجاوز MTU 251 بايت

ATT (Attribute Protocol) — البروتوكول الذي يُبنى عليه GATT. يبلغ الحد الأقصى لحجم حزمة ATT 257 بايت (ATT_MTU-1). من هذه، 1 بايت هو Opcode (نوع العملية)، 1 بايت هو Handle، وحتى 255 بايت هي Value. وبالتالي، فإن أقصى MTU مسموح به حسب مواصفات ATT هو 257 بايت (لكن في الممارسة العملية يُستخدم حتى 251 بايت، لأن بعض حقول الحمل الإضافي لا تزال مطلوبة).

لإرسال بيانات أكبر من MTU، يُستخدم التجزئة (fragmentation) على مستوى التطبيق. يقوم المطور بتقسيم البيانات يدويًا إلى أجزاء بحجم ≤ MTU وإرسالها بالتسلسل. يتم إرسال كل جزء كطلب GATT Write Request منفصل. يقوم الطرف المستقبل بتجميع الأجزاء في مخزن مؤقت واحد. لا يوجد دعم مدمج للتجزئة في GATT — هذه مسؤولية المطور.

إصدار BLEأقصى MTUأقصى DLEحد ATT MTU
BLE 4.0 / 4.123 بايت27 بايتATT ثابت
BLE 4.2247 بايت251 بايت257 بايت
BLE 5.0251 بايت251 بايت257 بايت
Android + iOS512 / 517251 بايتيتجاوز ATT

حقيقة مثيرة للاهتمام: يطلب iOS و Android MTU بحجم 512 و 517 بايت على التوالي، لكن هذه القيمة تتجاوز حد ATT. في الممارسة العملية، تقوم حزمة BLE بتجزئة هذه البيانات تلقائيًا، وإرسالها كطلبات GATT متسلسلة متعددة بحجم أقصى 251 بايت لكل منها. بالنسبة للمطور، الفرق شفاف — تعمل writeValue مع أي حجم يصل إلى 512 بايت في iOS.

تأثير MTU على الأداء

يؤثر حجم MTU بشكل مباشر على إنتاجية اتصال BLE. مع MTU بحجم 23 بايت، يبلغ أقصى معدل نقل مفيد حوالي 7–10 كيلوبايت/ثانية في الظروف المثالية. زيادة MTU إلى 247 بايت ترفع السرعة إلى 60–90 كيلوبايت/ثانية (مع DLE وفاصل اتصال مثالي). هذا مهم بشكل خاص للتطبيقات التي تنقل الصور أو مقاطع الصوت أو السجلات.

يعتمد أداء نقل BLE على ثلاثة عوامل: MTU (كمية البيانات لكل طلب ATT)، فاصل الاتصال (عدد مرات حدوث أحداث التبادل)، و DLE (كمية البيانات لكل حزمة طبقة ارتباط). التكوين الأمثل لأقصى سرعة: MTU = 247، DLE = 251، فاصل الاتصال = 7.5 مللي ثانية (القيمة الدنيا).

وفقًا لـ Bluetooth SIG White Paper (2023)، زيادة MTU من 23 إلى 247 بايت مع فاصل اتصال 30 مللي ثانية تزيد الإنتاجية من 8 كيلوبايت/ثانية إلى 42 كيلوبايت/ثانية — زيادة بمقدار 5 مرات. مع فاصل اتصال 7.5 مللي ثانية، تصل الإنتاجية إلى 88 كيلوبايت/ثانية. للتطبيقات التي لا تتطلب سرعة عالية (أجهزة استشعار درجة الحرارة، منارات BLE)، يظل MTU القياسي 23 بايت كافيًا.

تهيئة MTU في iOS و Android

iOS Core Bluetooth يتفاوض تلقائيًا على MTU عند الاتصال بجهاز طرفي (Peripheral). يمكن للمطور الاستعلام عن MTU الحالي عبر maximumWriteValueLength، لكن لا يمكنه تعيينه يدويًا. يستخدم iOS MTU حتى 512 بايت لأجهزة BLE 5.0 وحتى 247 لـ BLE 4.2. لكتابة كميات كبيرة من البيانات، استخدم writeType: .withResponse للتسليم المضمون.

kotlin
// طلب MTU في Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// طلب MTU 517 بايت
bluetoothGatt.requestMtu(517)

// معالجة النتيجة في رد النداء
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android يوفر BluetoothGatt.requestMtu(int)، الذي يسمح بطلب أي MTU حتى 517 بايت. يتم تحديد MTU الفعلي بواسطة الجهاز الطرفي — إذا كان يدعم 23 بايت فقط، سيعيد Android MTU بحجم 23. لتحديد MTU الحالي، استخدم gatt.requestMtu(0) — هذا يعيد القيمة الحالية دون محاولة تغييرها. Android 12+ يدعم التفاوض التلقائي على MTU عند الاتصال عبر TRANSPORT_LE.

الأطر عبر المنصات (Flutter, React Native) توفر عادةً واجهة برمجة تطبيقات لـ requestMTU. في مكتبة FlutterBlue Plus، يتم تعيين MTU كمعامل اتصال. في RxAndroidBle — عبر طريقة requestMtu. يُوصى دائمًا بالتفاوض على أقصى MTU فورًا بعد اكتشاف الخدمات، قبل بدء نقل البيانات، لتجنب التجزئة على مستوى التطبيق.

MTU والتحديثات عبر الهواء (OTA)

تحديثات البرامج الثابتة عبر الهواء (OTA) — السيناريو الأكثر تطلبًا لـ MTU في BLE. الحجم النموذجي للبرامج الثابتة لجهاز IoT هو 100–500 كيلوبايت. مع MTU بحجم 23 بايت وفاصل اتصال 30 مللي ثانية، يستغرق نقل 100 كيلوبايت حوالي 2–3 دقائق. مع MTU 247 بايت و DLE 251 بايت — 20–40 ثانية. ومع MTU 512 بايت (iOS) — 10–15 ثانية.

تتضمن عملية التحديث عبر الهواء عادةً: تجزئة البرامج الثابتة إلى حزم بحجم ≤ MTU، الإرسال التسلسلي عبر Notify/Write، التحقق من المجموع الاختباري على كل حزمة، وتأكيد الاستلام. إذا فقدت حزمة، يطلب الجهاز إعادة الإرسال. تعتمد موثوقية OTA بشكل حاسم على الاختيار الصحيح لـ MTU وفاصل الاتصال.

توصيات لـ OTA: تفاوض على أقصى MTU (247–512 بايت)، اضبط فاصل الاتصال على 7.5–15 مللي ثانية (إذا كان الجهاز يدعم ذلك)، استخدم DLE (Data Length Extension) لزيادة الحزمة المادية إلى 251 بايت. للأجهزة ذات ذاكرة المخزن المؤقت المحدودة (مثل وحدات BLE القائمة على nRF52)، تحقق من أقصى MTU في مواصفات الشريحة.

الأسئلة الشائعة

ماذا يحدث إذا لم يتم التفاوض على MTU؟

سيستخدم الاتصال MTU الافتراضي — 23 بايت. لمعظم سيناريوهات IoT (نقل قراءات أجهزة الاستشعار) هذا كافٍ. لنقل كميات كبيرة من البيانات، ستكون السرعة أقل بمقدار 5–10 مرات مقارنة بـ MTU مفاوض عليه بحجم 247 بايت.

هل يمكن تغيير MTU بعد بدء نقل البيانات؟

لا، يتم التفاوض على MTU مرة واحدة بعد الاتصال ولا يمكن تغييره بدون قطع الاتصال وإعادة الاتصال. لذلك، يُوصى بالتفاوض على MTU فورًا بعد اكتشاف الخدمات، قبل بدء نقل البيانات النشط.

لماذا يطلب Android MTU بحجم 517 بايت بينما يطلب iOS 512 فقط؟

هذه هي الحدود القصوى التجريبية المحددة تاريخيًا لكل حزمة برامج. لا يزال MTU ATT الفعلي محدودًا بـ 257 بايت حسب المواصفات. تقوم حزم البرامج تلقائيًا بتجزئة البيانات الأكبر من 251 بايت إلى حزم متعددة، لذا فإن الفرق بين 512 و 517 غير مهم.

كيف يرتبط MTU بـ Data Length Extension (DLE)؟

MTU — حجم طلب GATT على مستوى ATT. DLE — حجم الحزمة المادية في طبقة الارتباط. بدون DLE، يتم تجزئة كل طلب GATT (حتى 247 بايت) إلى حزم بحجم 27 بايت. مع DLE، يتم إرساله كحزمة واحدة. لتحقيق أقصى سرعة، يلزم التفاوض على كلا المعاملين.

ما MTU الذي يجب اختياره لجهاز تتبع اللياقة البدنية؟

لجهاز تتبع اللياقة البدنية الذي ينقل قراءات معدل ضربات القلب والخطوات، فإن MTU القياسي 23 بايت كافٍ. إذا كنت بحاجة إلى نقل سجل التمارين (بحجم 10–50 كيلوبايت)، فتفاوض على MTU بحجم 247 بايت لتسريع مزامنة البيانات عند الاتصال بالهاتف الذكي.

الخلاصة

  • MTU — الحجم الأقصى للبيانات في طلب GATT واحد: من 23 بايت (افتراضي) إلى 251 بايت (BLE 5.0).
  • يتم التفاوض على MTU عبر MTU Size Request/Response، يبدأها الجهاز المركزي بعد الاتصال.
  • بروتوكول ATT يحد MTU بـ 257 بايت، لكن iOS و Android يطلبان حتى 512–517 بايت مع تجزئة تلقائية.
  • زيادة MTU من 23 إلى 247 بايت تحسن الإنتاجية بمقدار 5–10 مرات مع فاصل اتصال أمثل.
  • لأقصى سرعة، تفاوض على MTU + DLE + فاصل اتصال 7.5 مللي ثانية.
  • في iOS، يتم التفاوض على MTU تلقائيًا؛ في Android، استخدم requestMtu — يُوصى بطلب 247–517 بايت.
  • التحديثات عبر الهواء (OTA) — السيناريو الأكثر تطلبًا: MTU المناسب يقلل وقت النقل من دقائق إلى ثوانٍ.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا