Bluetooth Low Energy (BLE) เป็นมาตรฐานการสื่อสารไร้สายที่ปรับให้เหมาะสมสำหรับการส่งข้อมูลปริมาณน้อยโดยใช้พลังงานต่ำที่สุด ตาม Bluetooth SIG, 2025 เทคโนโลยีนี้ถูกใช้ในอุปกรณ์มากกว่า 5 พันล้านเครื่องทั่วโลก GATT (Generic Attribute Profile) จัดระเบียบข้อมูลในลำดับชั้น Service → Characteristic → Descriptor ซึ่งเป็นพื้นฐานของแอปพลิเคชัน BLE ทั้งหมดสำหรับ iOS และ Android
ประเด็นสำคัญ
Bluetooth Low Energy (BLE) ทำงานบนโมเดลไคลเอนต์-เซิร์ฟเวอร์โดยมีสองบทบาท: Central (อุปกรณ์มือถือ) และ Peripheral (อุปกรณ์) Central สแกนคลื่นและเริ่มการเชื่อมต่อ ในขณะที่ Peripheral ส่งข้อมูล แตกต่างจาก Bluetooth แบบคลาสสิก BLE ไม่ได้ออกแบบมาสำหรับสตรีมเสียง — หน้าที่ของมันคือส่งแพ็กเก็ตขนาดเล็กโดยใช้พลังงานต่ำที่สุด ตาม Bluetooth SIG Core Specification 5.4 (2025) BLE รองรับความเร็วสูงสุด 2 Mbps โดยใช้กระแสไฟน้อยกว่า 15 mA ในโหมดแอคทีฟ
GATT (Generic Attribute Profile) กำหนดโครงสร้างข้อมูลของ Bluetooth Low Energy Service คือกลุ่มตรรกะของคุณลักษณะ (เช่น Heart Rate Service 0x180D) Characteristic คือจุดข้อมูลที่มีค่าเฉพาะ Descriptor คือข้อมูลเมตาของคุณลักษณะ รวมถึง CCCD สำหรับการจัดการการแจ้งเตือน แต่ละองค์ประกอบมี UUID — 16 บิตสำหรับโปรไฟล์ Bluetooth SIG มาตรฐาน หรือ 128 บิตสำหรับแบบกำหนดเอง
Bluetooth Low Energy ในแอปพลิเคชันมือถือใช้ลำดับชั้นนี้เพื่อจัดระเบียบการแลกเปลี่ยนข้อมูลระหว่างสมาร์ทโฟนและอุปกรณ์ต่อพ่วง ความเข้าใจที่ถูกต้องเกี่ยวกับ GATT เป็นพื้นฐานสำหรับการพัฒนาแอปพลิเคชัน BLE บนทั้งสองแพลตฟอร์ม นักพัฒนาต้องรู้ UUID ของบริการและคุณลักษณะของอุปกรณ์ รวมถึงคุณสมบัติของคุณลักษณะแต่ละอย่าง (read, write, notify, indicate)
อุปกรณ์ BLE ส่งแพ็กเก็ตโฆษณา (advertising packets) เพื่อการค้นหา Advertising Data ประกอบด้วยชื่ออุปกรณ์, UUID ของบริการ, RSSI และ Manufacturer Specific Data ขนาดของแพ็กเก็ตโฆษณาจำกัดที่ 31 ไบต์ สำหรับส่งข้อมูลเพิ่มเติม จะใช้ Scan Response — แพ็กเก็ตที่สองที่อุปกรณ์กลางร้องขอหลังจากการค้นหา
บน iOS เฟรมเวิร์ก Core Bluetooth จัดการ Bluetooth Low Energy CBCentralManager จัดการการสแกนและการเชื่อมต่อ CBPeripheral แสดงถึงอุปกรณ์ BLE ระยะไกล กระบวนการเป็นมาตรฐาน: เริ่มต้น CBCentralManager, ตรวจสอบสถานะ poweredOn, เริ่ม scanForPeripherals, เชื่อมต่อและค้นพบบริการ Core Bluetooth จัดการพลังงานของโมดูลวิทยุโดยอัตโนมัติ — ถ้าไม่ได้ใช้ BLE ก็จะปิด
BLE ในการพัฒนามือถือบน iOS ต้องคำนึงถึงโหมดพื้นหลัง โหมดพื้นหลังของ Core Bluetooth เปิดใช้งานผ่าน Capabilities ของโปรเจ็กต์ (Uses Bluetooth LE accessories) ในพื้นหลัง แอปสามารถรับการแจ้งเตือนจากคุณลักษณะได้ แต่การสแกนมีข้อจำกัด — ระบบจะเริ่มการสแกนใหม่เฉพาะเมื่ออุปกรณ์เคลื่อนที่ สำหรับ iBeacon การสแกนพื้นหลังทำงานได้อย่างแข็งขันมากขึ้นผ่าน CLLocationManager
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("พบ: \(peripheral.name ?? "unknown")")
}
}
ในตัวอย่างนี้ CBCentralManagerDelegate จัดการเหตุการณ์การเชื่อมต่อ BLE ทั้งหมด เมธอด centralManagerDidUpdateState ตรวจสอบว่า Bluetooth เปิดอยู่บนอุปกรณ์มือถือหรือไม่ หลังจากการเริ่มต้นสำเร็จ การสแกนจะเริ่มขึ้น Callback didDiscover ถูกเรียกสำหรับแต่ละอุปกรณ์ที่พบ
หลังจากค้นพบอุปกรณ์ ต้องเรียก connect และ discoverServices CBPeripheralDelegate มีเมธอดสำหรับจัดการแต่ละขั้นตอน: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor แต่ละเมธอดเป็นแบบอะซิงโครนัส — ข้อมูลมาถึงผ่าน callback ของตัวแทน RSSI (Received Signal Strength Indicator) แสดงระดับสัญญาณ: ยิ่งค่าใกล้ 0 มากเท่าไร สัญญาณยิ่งแรง
บน Android Bluetooth Low Energy ถูกใช้งานผ่านแพ็กเกจ android.bluetooth BluetoothAdapter เป็นจุดเริ่มต้นสำหรับการดำเนินการ BLE ทั้งหมด BluetoothLeScanner เริ่มการสแกนด้วย callback ScanCallback หลังจากค้นพบอุปกรณ์ จะสร้าง BluetoothGatt — การเชื่อมต่อกับอุปกรณ์ต่อพ่วง BluetoothGattCallback จัดการเหตุการณ์: การเชื่อมต่อ, การค้นพบบริการ, การอ่านคุณลักษณะ, การเปลี่ยนแปลง RSSI
Bluetooth Low Energy ในแอปพลิเคชันมือถือบน Android ต้องได้รับอนุญาต BLUETOOTH_SCAN, BLUETOOTH_CONNECT และ ACCESS_FINE_LOCATION อย่างชัดเจน ตั้งแต่ Android 12 สิทธิ์ถูกแยกออกจากกัน: BLUETOOTH_SCAN สำหรับการสแกน, BLUETOOTH_CONNECT สำหรับการเชื่อมต่อ ACCESS_FINE_LOCATION จำเป็นสำหรับการสแกนอุปกรณ์บางประเภทเท่านั้น หากไม่มีสิทธิ์เหล่านี้ แอปจะไม่สามารถทำงานกับ BLE ได้
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "อุปกรณ์: ${device.name}, RSSI: $rssi")
}
}
}
ScanSettings ให้คุณกำหนดค่าโหมดการสแกน: LOW_POWER เพื่อประหยัดแบตเตอรี่, BALANCED สำหรับงานมาตรฐาน, LOW_LATENCY เพื่อความเร็วในการค้นหาสูงสุด ScanFilter จำกัดการค้นหาตาม UUID ของบริการ, ชื่ออุปกรณ์ หรือที่อยู่ MAC การกรองช่วยลดการใช้พลังงานและเร่งการค้นหาอุปกรณ์ที่ต้องการ
หลังจากสร้าง BluetoothGatt ผ่าน connectGatt แอปจะเรียก discoverServices BluetoothGattCallback ประกอบด้วย onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงคุณลักษณะ ต้องเรียก setCharacteristicNotification กระบวนการนี้ต้องใช้ความระมัดระวัง: การดำเนินการ GATT แต่ละครั้งเป็นแบบอะซิงโครนัส และผลลัพธ์มาใน callback ที่แยกต่างหาก
iBeacon คือเทคโนโลยีของ Apple สำหรับบีคอน BLE ที่ส่ง UUID, Major และ Minor อุปกรณ์บีคอน จะกระจายแพ็กเก็ตโฆษณา และแอปพลิเคชันมือถือจะระบุตำแหน่งและระยะทางตามข้อมูลนี้ บน iOS iBeacon รองรับแบบเนทีฟผ่าน CLLocationManager บน Android ต้องใช้ไลบรารีของบริษัทอื่น (เช่น AltBeacon หรือ Android iBeacon Library)
Bonding คือขั้นตอนการสร้างการเชื่อมต่อที่ปลอดภัยแบบถาวรระหว่างอุปกรณ์ BLE หลังจาก Bonding คีย์การเข้ารหัสจะถูกบันทึก และอุปกรณ์จะเชื่อมต่อโดยอัตโนมัติเมื่อเข้ามาใกล้กันอีกครั้ง บน iOS bonding ถูกจัดการโดยระบบโดยอัตโนมัติ บน Android — ผ่าน BluetoothDevice.createBond() Bonding มีความสำคัญสำหรับอุปกรณ์สวมใส่และเครื่องติดตามฟิตเนสที่ต้องการการเชื่อมต่อใหม่อย่างรวดเร็ว
Advertising Data เป็นกลไกการค้นหาที่สำคัญใน Bluetooth Low Energy ผู้ผลิตอุปกรณ์ สามารถเพิ่ม Manufacturer Specific Data ในแพ็กเก็ตโฆษณาเพื่อส่งข้อมูลที่กำหนดเอง รูปแบบแพ็กเก็ตประกอบด้วย Company Identifier (2 ไบต์) และข้อมูลตามต้องการ บน iOS CBCentralManager รับอาร์เรย์ของ UUID บริการเพื่อการกรอง — ซึ่งช่วยประหยัดแบตเตอรี่ บน Android ScanFilter ทำงานบนหลักการเดียวกัน
| พารามิเตอร์ | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| ผู้จัดการ | CBCentralManager | BluetoothLeScanner |
| การเชื่อมต่อ | connect(to:) | connectGatt() |
| บริการ | discoverServices() | discoverServices() |
| การอ่าน | readValue(for:) | readCharacteristic() |
| การแจ้งเตือน | setNotifyValue(_:for:) | setCharacteristicNotification() |
| สิทธิ์ | อัตโนมัติ | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (เนทีฟ) | AltBeacon / ไลบรารี |
MTU (Maximum Transmission Unit) คือขนาดสูงสุดของแพ็กเก็ตข้อมูล Bluetooth Low Energy หนึ่งแพ็กเก็ต โดยค่าเริ่มต้น MTU คือ 23 ไบต์ (3 ไบต์ส่วนหัว + 20 ไบต์ข้อมูล) การเพิ่ม MTU เป็น 512 ไบต์ช่วยเร่งการส่งข้อมูลอย่างมากเมื่อแลกเปลี่ยนการกำหนดค่าหรือบันทึก บน iOS maximumWriteValueLength แสดง MTU ที่มีอยู่ บน Android ใช้ requestMtu() เพื่อเพิ่ม MTU
Connection Interval คือความถี่ที่อุปกรณ์กลางสอบถามอุปกรณ์ต่อพ่วง ยิ่งช่วงห่างสั้น ความเร็วในการส่งยิ่งสูง แต่การใช้พลังงานก็มากขึ้นเช่นกัน ค่าทั่วไปอยู่ระหว่าง 7.5 ms ถึง 4 วินาที สำหรับเครื่องติดตามฟิตเนส 100 ms ก็เพียงพอ สำหรับเสียง — 7.5 ms BLE ในการพัฒนามือถือต้องมีความสมดุลระหว่างความเร็วในการส่งและอายุการใช้งานแบตเตอรี่ของอุปกรณ์
iOS รองรับ BLE ในโหมดพื้นหลังผ่าน Background Modes แต่มีข้อจำกัด แอปในพื้นหลัง รับการแจ้งเตือนจากคุณลักษณะ แต่ไม่สามารถสแกนอย่างแข็งขันได้ ระบบจะเริ่มการสแกนใหม่เมื่อตำแหน่งของอุปกรณ์เปลี่ยนไป บน Android การสแกนพื้นหลังต้องใช้ Foreground Service พร้อมการแจ้งเตือนถาวร หากไม่มี ระบบมือถือจะหยุดกระบวนการเมื่อย่อแอป
สำหรับการทำงาน BLE ที่เชื่อถือได้ในแอปพลิเคชันมือถือ ให้ปฏิบัติตามกฎเหล่านี้ ใช้ notify แทนการ polling — คุณลักษณะที่มีการแจ้งเตือนจะส่งข้อมูลเมื่อมีการเปลี่ยนแปลง ช่วยประหยัดแบตเตอรี่ ตั้งค่า MTU ที่เหมาะสมที่สุดเมื่อเริ่มการเชื่อมต่อ กรองอุปกรณ์ตาม UUID ของบริการเมื่อสแกน ตรวจสอบความเข้ากันได้ของสแต็ก BLE ในรุ่นต่างๆ — ผู้ผลิต (Xiaomi, Huawei, Samsung) ทำการเปลี่ยนแปลงที่ส่งผลต่อพฤติกรรมของ Bluetooth
คำถามที่พบบ่อย
Bluetooth Low Energy (BLE) ถูกปรับให้เหมาะสมสำหรับการส่งแพ็กเก็ตขนาดเล็กเป็นระยะด้วยการใช้พลังงานต่ำ Bluetooth แบบคลาสสิก ออกแบบมาสำหรับสตรีมเสียงและการส่งข้อมูลปริมาณมากอย่างต่อเนื่อง
GATT (Generic Attribute Profile) คือโปรโตคอลแลกเปลี่ยนข้อมูลใน BLE ที่กำหนดลำดับชั้น Service → Characteristic → Descriptor GATT ใช้สำหรับอ่าน เขียน และรับการแจ้งเตือนจากอุปกรณ์ BLE
ก่อน Android 12 การสแกน BLE สามารถใช้ระบุตำแหน่งได้ ดังนั้น Google จึงรวมสิทธิ์เหล่านี้เข้าด้วยกัน ตั้งแต่ Android 12 มีการแนะนำสิทธิ์ BLUETOOTH_SCAN แยกต่างหากโดยไม่เกี่ยวข้องกับตำแหน่ง
เพิ่ม MTU ผ่าน requestMtu() บน Android และ maximumWriteValueLength บน iOS Connection Interval ก็ส่งผลต่อความเร็วเช่นกัน — ยิ่งสั้น การถ่ายโอนยิ่งเร็ว การรวมกันที่เหมาะสมที่สุดช่วยเพิ่มได้ถึง 10 เท่า
Bonding คือขั้นตอนการสร้างการเชื่อมต่อที่ปลอดภัยแบบถาวรระหว่างอุปกรณ์ BLE หลังจาก Bonding คีย์การเข้ารหัสจะถูกบันทึก และอุปกรณ์จะเชื่อมต่อโดยอัตโนมัติโดยไม่ต้องค้นหาซ้ำ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ