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 ที่เลเยอร์ลิงก์ (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 Size Request — ขั้นตอนที่เริ่มต้นโดย Central หลังจากสร้างการเชื่อมต่อ GATT Central ส่งคำขอ MTU Request โดยระบุความจุ MTU ของตน (ขนาดสูงสุดที่สามารถยอมรับได้) Peripheral ตอบสนองด้วย MTU Response พร้อมค่าของตนเอง MTU ที่ได้คือค่าที่น้อยกว่าของสองค่า ถ้า Central เสนอ MTU 512 และ Peripheral รองรับเพียง 128 การเชื่อมต่อจะใช้ MTU 128
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 (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.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 จะแยกส่วนข้อมูลดังกล่าวโดยอัตโนมัติ โดยส่งเป็นคำขอ GATT แบบเรียงลำดับหลายคำขอสูงสุด 251 ไบต์ต่อคำขอ สำหรับนักพัฒนา ความแตกต่างนั้นโปร่งใส — writeValue ทำงานกับทุกขนาดสูงสุด 512 ไบต์บน iOS
ขนาดของ 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 (2023) การเพิ่ม MTU จาก 23 เป็น 247 ไบต์ด้วยช่วงเวลาการเชื่อมต่อ 30 ms จะเพิ่มปริมาณงานจาก 8 KB/s เป็น 42 KB/s — เพิ่มขึ้น 5 เท่า ด้วยช่วงเวลาการเชื่อมต่อ 7.5 ms ปริมาณงานจะถึง 88 KB/s สำหรับแอปพลิเคชันที่ไม่ต้องการความเร็วสูง (เซ็นเซอร์อุณหภูมิ, บีคอน BLE) MTU มาตรฐาน 23 ไบต์ยังคงเพียงพอ
iOS Core Bluetooth เจรจา MTU โดยอัตโนมัติเมื่อเชื่อมต่อกับ Peripheral นักพัฒนาสามารถสอบถาม MTU ปัจจุบันผ่าน maximumWriteValueLength แต่ไม่สามารถตั้งค่าด้วยตนเองได้ iOS ใช้ MTU สูงสุด 512 ไบต์สำหรับอุปกรณ์ BLE 5.0 และสูงสุด 247 สำหรับ BLE 4.2 สำหรับการเขียนข้อมูลปริมาณมาก ให้ใช้ writeType: .withResponse เพื่อการส่งที่รับประกัน
// ขอ MTU บน Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...
// ขอ MTU 517 ไบต์
bluetoothGatt.requestMtu(517)
// จัดการผลลัพธ์ใน callback
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) มักมี API สำหรับ requestMTU ในไลบรารี FlutterBlue Plus MTU ถูกตั้งเป็นพารามิเตอร์การเชื่อมต่อ ใน RxAndroidBle — ผ่านเมธอด requestMtu ขอแนะนำให้เจรจา MTU สูงสุดทันทีหลังจากค้นพบบริการ ก่อนเริ่มการส่งข้อมูล เพื่อหลีกเลี่ยงการแยกส่วนที่ระดับแอปพลิเคชัน
การอัปเดตเฟิร์มแวร์ OTA (Over-The-Air) — สถานการณ์ที่ต้องการ MTU มากที่สุดใน BLE ขนาดเฟิร์มแวร์ทั่วไปของอุปกรณ์ 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 (ถ้าอุปกรณ์รองรับ) ใช้ DLE (Data Length Extension) เพื่อเพิ่มแพ็กเก็ตทางกายภาพเป็น 251 ไบต์ สำหรับอุปกรณ์ที่มีหน่วยความจำบัฟเฟอร์จำกัด (เช่น โมดูล BLE ที่ใช้ nRF52) ให้ตรวจสอบ MTU สูงสุดในข้อกำหนดของชิป
คำถามที่พบบ่อย
การเชื่อมต่อจะใช้ MTU เริ่มต้น — 23 ไบต์ สำหรับสถานการณ์ IoT ส่วนใหญ่ (การส่งค่าอ่านจากเซ็นเซอร์) นั้นเพียงพอ สำหรับการถ่ายโอนข้อมูลปริมาณมาก ความเร็วจะต่ำกว่า MTU ที่เจรจาแล้ว 247 ไบต์ 5–10 เท่า
ไม่ MTU จะถูกเจรจา หนึ่งครั้งหลังจากเชื่อมต่อและไม่สามารถเปลี่ยนแปลงได้โดยไม่ตัดการเชื่อมต่อและเชื่อมต่อใหม่ ดังนั้นขอแนะนำให้เจรจา MTU ทันทีหลังจากค้นพบบริการ ก่อนเริ่มการส่งข้อมูลที่ใช้งานอยู่
นี่คือค่าสูงสุดเชิงประจักษ์ที่กำหนดขึ้นในอดีตสำหรับแต่ละสแต็ก ATT MTU จริงยังคงถูกจำกัดที่ 257 ไบต์ตามข้อกำหนด สแต็กจะแยกส่วนข้อมูลที่มากกว่า 251 ไบต์ออกเป็นหลายแพ็กเก็ตโดยอัตโนมัติ ดังนั้นความแตกต่างระหว่าง 512 และ 517 จึงไม่มีนัยสำคัญ
MTU — ขนาดของคำขอ GATT ที่ระดับ ATT DLE — ขนาดของแพ็กเก็ตทางกายภาพที่เลเยอร์ลิงก์ หากไม่มี DLE แต่ละคำขอ GATT (สูงสุด 247 ไบต์) จะถูกแยกส่วนเป็นแพ็กเก็ตขนาด 27 ไบต์ เมื่อมี DLE จะถูกส่งเป็นแพ็กเก็ตเดียว เพื่อความเร็วสูงสุด จำเป็นต้องเจรจาทั้งสองพารามิเตอร์
สำหรับสายรัดข้อมือฟิตเนสที่ส่งค่าอัตราการเต้นของหัวใจและจำนวนก้าว MTU มาตรฐาน 23 ไบต์ก็เพียงพอ หากคุณต้องการถ่ายโอนประวัติการออกกำลังกาย (ขนาด 10–50 KB) ให้เจรจา MTU 247 ไบต์เพื่อเร่งการซิงโครไนซ์ข้อมูลเมื่อเชื่อมต่อกับสมาร์ทโฟน
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม