MTU (Maximum Transmission Unit) হল একটি BLE প্যাকেটে উপযোগী ডেটার সর্বাধিক আকার যা একটি GATT লেনদেনে ডিভাইসগুলির মধ্যে প্রেরণ করা যেতে পারে। BLE Classic (4.x)-এ, MTU 23 বাইটে নির্ধারিত, যা ছোট সেন্সর রিডিংয়ের জন্য যথেষ্ট, কিন্তু ফাইল স্থানান্তর বা OTA আপডেটের জন্য অপর্যাপ্ত। Bluetooth Core Specification 4.2 (2014) MTU Size Request পদ্ধতি চালু করেছে, যা বড় MTU — 247 বাইট (BLE 5.0 — 251 বাইট পর্যন্ত) আলোচনার অনুমতি দেয়। সঠিক MTU কনফিগারেশন হল বৃহৎ পরিমাণ ডেটা প্রেরণকারী BLE অ্যাপ্লিকেশনগুলির কর্মক্ষমতার মূল কারণগুলির মধ্যে একটি।
মূল পয়েন্ট
Maximum Transmission Unit (MTU) BLE-এর প্রসঙ্গে হল একটি অ্যাপ্লিকেশন প্রোটোকল ডেটা ইউনিট (APDU)-এর সর্বাধিক আকার যা একটি ডিভাইস একটি GATT অনুরোধে গ্রহণ করতে পারে। MTU ATT (Attribute Protocol) স্তরে সংজ্ঞায়িত এবং এতে ATT হেডার (1 বাইট) + উপযোগী ডেটা অন্তর্ভুক্ত। ডিফল্টরূপে, সমস্ত BLE ডিভাইস MTU 23 বাইট সমর্থন করে (23 = 1 বাইট ATT হেডার + 22 বাইট ডেটা)।
MTU রেডিও চ্যানেলের একটি ভৌত সীমা নয়, বরং GATT স্তরে ডিভাইসগুলির মধ্যে একটি চুক্তি। লিংক লেয়ারে ভৌত BLE প্যাকেটের আকার বড় হতে পারে (BLE 4.0-এ 27 বাইট পর্যন্ত, BLE 5.0-এ Data Length Extension-সহ 257 বাইট পর্যন্ত), কিন্তু GATT স্তর সীমিত করে যে প্রতি লেনদেনে কত ডেটা প্রেরিত হয়। Data Length Extension (DLE) হল একটি পৃথক লিংক লেয়ার পদ্ধতি যা ভৌত প্যাকেটকে 251 বাইটে বাড়ায় এবং এটি আলাদাভাবে আলোচনা করা আবশ্যক।
MTU এবং DLE-এর মধ্যে পার্থক্য: ATT MTU — প্রতি GATT অনুরোধে কত ডেটা প্রেরিত হয়, DLE — একটি লিংক লেয়ার প্যাকেটে কত ডেটা ফিট হয়। সর্বাধিক গতির জন্য, উভয় প্যারামিটার আলোচনা করা প্রয়োজন। DLE ছাড়া, এমনকি MTU 247 বাইটের সাথেও, ডেটা একাধিক 27-বাইট লিংক লেয়ার প্যাকেটে খণ্ডিত হবে, থ্রুপুট হ্রাস করবে।
MTU Size Request — একটি পদ্ধতি যা GATT সংযোগ স্থাপনের পর Central দ্বারা শুরু হয়। Central তার MTU ক্ষমতা (সর্বাধিক আকার যা এটি গ্রহণ করতে পারে) উল্লেখ করে একটি MTU Request পাঠায়। Peripheral তার নিজস্ব মান সহ একটি MTU Response দিয়ে উত্তর দেয়। ফলস্বরূপ MTU হল দুটি মানের মধ্যে সর্বনিম্ন। যদি Central MTU 512 অফার করে এবং Peripheral শুধুমাত্র 128 সমর্থন করে, সংযোগটি MTU 128 ব্যবহার করবে।
import CoreBluetooth
// iOS-এ সর্বোচ্চ MTU অনুরোধ করুন
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// সংযোগের সময় iOS স্বয়ংক্রিয়ভাবে MTU আলোচনা করে
// BLE 5.0 ডিভাইসের জন্য MTU = 512
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("আলোচিত MTU: " +
String(mtu))
}
আলোচনার সময়: পরিষেবা আবিষ্কারের (discoverServices) পরে, কিন্তু সক্রিয় ডেটা প্রেরণ শুরুর আগে MTU Request পাঠানো উচিত। iOS Core Bluetooth-এ, সংযোগের সময় MTU স্বয়ংক্রিয়ভাবে আলোচিত হয় — ডেভেলপারকে ম্যানুয়ালি MTU Request পাঠানোর প্রয়োজন নেই। Android-এ, requestMTU স্পষ্টভাবে কল করতে হবে। একবার আলোচনা হয়ে গেলে, MTU সেই সংযোগের জন্য নির্ধারিত থাকে — সংযোগ বিচ্ছিন্ন এবং পুনরায় সংযোগ না করে পুনরায় আলোচনা অসম্ভব।
ATT (Attribute Protocol) — যে প্রোটোকলের উপর GATT নির্মিত। একটি ATT প্যাকেটের সর্বাধিক আকার 257 বাইট (ATT_MTU-1)। এর মধ্যে, 1 বাইট Opcode (অপারেশন প্রকার), 1 বাইট Handle, এবং 255 বাইট পর্যন্ত Value। সুতরাং, ATT স্পেসিফিকেশন দ্বারা অনুমোদিত সর্বাধিক MTU হল 257 বাইট (কিন্তু বাস্তবে 251 বাইট পর্যন্ত ব্যবহার করা হয়, কারণ কিছু ওভারহেড ফিল্ড এখনও প্রয়োজন)।
MTU-এর চেয়ে বড় ডেটা পাঠানোর জন্য, অ্যাপ্লিকেশন স্তরে খণ্ডন (fragmentation) ব্যবহার করা হয়। ডেভেলপার ম্যানুয়ালি ডেটাকে ≤ MTU আকারের টুকরোতে বিভক্ত করে এবং সেগুলি ক্রমিকভাবে পাঠায়। প্রতিটি টুকরো একটি পৃথক GATT Write Request হিসাবে পাঠানো হয়। প্রাপক পক্ষ টুকরোগুলিকে একটি একক বাফারে একত্রিত করে। GATT-এ খণ্ডনের কোনো অন্তর্নির্মিত সমর্থন নেই — এটি ডেভেলপারের দায়িত্ব।
| BLE সংস্করণ | সর্বোচ্চ MTU | সর্বোচ্চ DLE | ATT MTU সীমা |
|---|---|---|---|
| BLE 4.0 / 4.1 | 23 বাইট | 27 বাইট | ATT নির্ধারিত |
| BLE 4.2 | 247 বাইট | 251 বাইট | 257 বাইট |
| BLE 5.0 | 251 বাইট | 251 বাইট | 257 বাইট |
| Android + iOS | 512 / 517 | 251 বাইট | ATT-কে অতিক্রম করে |
মজার তথ্য: iOS এবং Android যথাক্রমে MTU 512 এবং 517 বাইট অনুরোধ করে, কিন্তু এই মান ATT সীমা অতিক্রম করে। বাস্তবে, BLE স্ট্যাক এই ধরনের ডেটা স্বয়ংক্রিয়ভাবে খণ্ডিত করে, সেগুলিকে প্রতিটি সর্বোচ্চ 251 বাইটের একাধিক ক্রমিক GATT অনুরোধ হিসাবে পাঠায়। ডেভেলপারের জন্য, পার্থক্যটি স্বচ্ছ — iOS-এ writeValue 512 বাইট পর্যন্ত যেকোনো আকারের সাথে কাজ করে।
MTU-এর আকার সরাসরি BLE সংযোগের থ্রুপুটকে প্রভাবিত করে। MTU 23 বাইটের সাথে, আদর্শ অবস্থায় সর্বাধিক উপযোগী স্থানান্তর হার প্রায় 7–10 KB/s। MTU 247 বাইটে বাড়ালে গতি 60–90 KB/s-এ পৌঁছে (DLE এবং অনুকূল সংযোগ ব্যবধানের সাথে)। এটি বিশেষ করে এমন অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ যা ছবি, অডিও খণ্ড বা লগ প্রেরণ করে।
BLE স্থানান্তর কর্মক্ষমতা তিনটি বিষয়ের উপর নির্ভর করে: MTU (প্রতি ATT অনুরোধে কত ডেটা), সংযোগ ব্যবধান (বিনিময় ঘটনা কতবার ঘটে), এবং DLE (প্রতি লিংক লেয়ার প্যাকেটে কত ডেটা)। সর্বাধিক গতির জন্য অনুকূল কনফিগারেশন: MTU = 247, DLE = 251, সংযোগ ব্যবধান = 7.5 ms (ন্যূনতম মান)।
Bluetooth SIG White Paper (2023) অনুসারে, 30 ms সংযোগ ব্যবধানের সাথে MTU 23 থেকে 247 বাইটে বাড়ালে থ্রুপুট 8 KB/s থেকে 42 KB/s-এ বৃদ্ধি পায় — 5 গুণ বৃদ্ধি। 7.5 ms সংযোগ ব্যবধানের সাথে, থ্রুপুট 88 KB/s-এ পৌঁছে। যে অ্যাপ্লিকেশনগুলির উচ্চ গতির প্রয়োজন নেই (তাপমাত্রা সেন্সর, BLE বীকন), তাদের জন্য মানক MTU 23 বাইট যথেষ্ট রয়ে গেছে।
iOS Core Bluetooth একটি Peripheral-এর সাথে সংযোগের সময় স্বয়ংক্রিয়ভাবে MTU আলোচনা করে। ডেভেলপার maximumWriteValueLength-এর মাধ্যমে বর্তমান MTU জিজ্ঞাসা করতে পারে, কিন্তু এটি ম্যানুয়ালি সেট করতে পারে না। iOS BLE 5.0 ডিভাইসের জন্য 512 বাইট পর্যন্ত এবং BLE 4.2-এর জন্য 247 বাইট পর্যন্ত MTU ব্যবহার করে। বৃহৎ পরিমাণ ডেটা লেখার জন্য, নিশ্চিত বিতরণের জন্য writeType: .withResponse ব্যবহার করুন।
// Android (Kotlin)-এ MTU অনুরোধ করুন
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) প্রদান করে, যা 517 বাইট পর্যন্ত যেকোনো MTU অনুরোধের অনুমতি দেয়। প্রকৃত MTU পেরিফেরাল ডিভাইস দ্বারা নির্ধারিত হয় — যদি এটি শুধুমাত্র 23 বাইট সমর্থন করে, Android MTU 23 ফিরিয়ে দেবে। বর্তমান MTU নির্ধারণ করতে, gatt.requestMtu(0) ব্যবহার করুন — এটি পরিবর্তনের চেষ্টা না করেই বর্তমান মান ফিরিয়ে দেয়। Android 12+ TRANSPORT_LE-এর মাধ্যমে সংযোগের সময় স্বয়ংক্রিয় MTU আলোচনা সমর্থন করে।
ক্রস-প্ল্যাটফর্ম ফ্রেমওয়ার্ক (Flutter, React Native) সাধারণত requestMTU-এর জন্য API প্রদান করে। FlutterBlue Plus লাইব্রেরিতে, MTU একটি সংযোগ প্যারামিটার হিসাবে সেট করা হয়। RxAndroidBle-এ — requestMtu পদ্ধতির মাধ্যমে। ডেটা প্রেরণ শুরুর আগে, পরিষেবা আবিষ্কারের পরপরই সর্বদা সর্বাধিক MTU আলোচনা করার পরামর্শ দেওয়া হয়, অ্যাপ্লিকেশন স্তরে খণ্ডন এড়াতে।
OTA (Over-The-Air) ফার্মওয়্যার আপডেট — BLE-তে সবচেয়ে MTU-চাহিদাপূর্ণ দৃশ্যকল্প। একটি IoT ডিভাইসের ফার্মওয়্যারের সাধারণ আকার 100–500 KB। MTU 23 বাইট এবং 30 ms সংযোগ ব্যবধানের সাথে, 100 KB স্থানান্তর করতে প্রায় 2–3 মিনিট সময় লাগে। MTU 247 বাইট এবং DLE 251 বাইটের সাথে — 20–40 সেকেন্ড। এবং MTU 512 বাইট (iOS) এর সাথে — 10–15 সেকেন্ড।
OTA আপডেট প্রক্রিয়ায় সাধারণত অন্তর্ভুক্ত: ফার্মওয়্যারকে ≤ MTU আকারের প্যাকেটে খণ্ডন, Notify/Write-এর মাধ্যমে ক্রমিক প্রেরণ, প্রতিটি প্যাকেটে চেকসাম যাচাইকরণ, এবং প্রাপ্তির নিশ্চিতকরণ। যদি কোনো প্যাকেট হারিয়ে যায়, ডিভাইসটি পুনঃপ্রেরণের অনুরোধ করে। OTA নির্ভরযোগ্যতা MTU এবং সংযোগ ব্যবধানের সঠিক নির্বাচনের উপর গুরুত্বপূর্ণভাবে নির্ভর করে।
OTA-র জন্য সুপারিশ: সর্বাধিক MTU (247–512 বাইট) আলোচনা করুন, সংযোগ ব্যবধান 7.5–15 ms (যদি ডিভাইস সমর্থন করে) সেট করুন, ভৌত প্যাকেট 251 বাইটে বাড়াতে DLE (Data Length Extension) ব্যবহার করুন। সীমিত বাফার মেমরি বিশিষ্ট ডিভাইসের জন্য (যেমন, nRF52-ভিত্তিক BLE মডিউল), চিপ স্পেসিফিকেশনে সর্বাধিক MTU পরীক্ষা করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সংযোগটি ডিফল্ট MTU — 23 বাইট ব্যবহার করবে। বেশিরভাগ IoT দৃশ্যকল্পের জন্য (সেন্সর রিডিং প্রেরণ) এটি যথেষ্ট। বৃহৎ পরিমাণ ডেটা স্থানান্তরের জন্য, গতি 247 বাইটের আলোচিত MTU-এর তুলনায় 5–10 গুণ কম হবে।
না, MTU সংযোগের পর একবার আলোচিত হয় এবং সংযোগ বিচ্ছিন্ন এবং পুনরায় সংযোগ না করে পরিবর্তন করা যায় না। তাই, সক্রিয় ডেটা প্রেরণ শুরুর আগে, পরিষেবা আবিষ্কারের পরপরই MTU আলোচনা করার পরামর্শ দেওয়া হয়।
এগুলি প্রতিটি স্ট্যাকের জন্য ঐতিহাসিকভাবে প্রতিষ্ঠিত অভিজ্ঞতামূলক সর্বোচ্চ সীমা। প্রকৃত ATT MTU এখনও স্পেসিফিকেশন দ্বারা 257 বাইটে সীমিত। স্ট্যাকগুলি 251 বাইটের চেয়ে বড় ডেটা স্বয়ংক্রিয়ভাবে একাধিক প্যাকেটে খণ্ডিত করে, তাই 512 এবং 517-এর মধ্যে পার্থক্য নগণ্য।
MTU — ATT স্তরে GATT অনুরোধের আকার। DLE — লিংক লেয়ারে ভৌত প্যাকেটের আকার। DLE ছাড়া, প্রতিটি GATT অনুরোধ (247 বাইট পর্যন্ত) 27-বাইট প্যাকেটে খণ্ডিত হয়। DLE-এর সাথে, এটি একটি একক প্যাকেটে প্রেরিত হয়। সর্বাধিক গতির জন্য, উভয় প্যারামিটার আলোচনা করা প্রয়োজন।
হৃদস্পন্দন এবং পদক্ষেপ রিডিং প্রেরণকারী ফিটনেস ট্র্যাকারের জন্য, মানক MTU 23 বাইট যথেষ্ট। যদি আপনার ওয়ার্কআউট ইতিহাস (10–50 KB আকার) স্থানান্তরের প্রয়োজন হয়, স্মার্টফোনে সংযোগ করার সময় ডেটা সিঙ্ক্রোনাইজেশন গতি বাড়াতে MTU 247 বাইট আলোচনা করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন