Bluetooth Low Energy (BLE) trong phát triển di động: nó là gì, giao thức và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-07-25 Thời gian đọc: 11 phút

Bluetooth Low Energy (BLE) là một tiêu chuẩn giao tiếp không dây được tối ưu hóa để truyền một lượng nhỏ dữ liệu với mức tiêu thụ điện năng tối thiểu. Theo Bluetooth SIG, 2025, công nghệ này được sử dụng trong hơn 5 tỷ thiết bị trên toàn thế giới. GATT (Generic Attribute Profile) tổ chức dữ liệu theo hệ thống phân cấp Service → Characteristic → Descriptor, là nền tảng của tất cả các ứng dụng BLE cho iOS và Android.

Những điểm chính

  • GATT — giao thức trao đổi dữ liệu trong Bluetooth Low Energy với hệ thống phân cấp Service → Characteristic → Descriptor
  • Core Bluetooth — framework của Apple để làm việc với BLE trên iOS, dựa trên CBCentralManager và CBPeripheral
  • BluetoothGatt — API chính cho kết nối BLE trên Android qua BluetoothLeScanner
  • iBeacon — giao thức beacon BLE của Apple với hỗ trợ gốc qua CLLocationManager trên iOS
  • Bonding — kết nối mã hóa vĩnh viễn loại bỏ việc quét và ghép nối lặp lại

Bluetooth Low Energy (BLE) là gì và nó hoạt động như thế nào?

Bluetooth Low Energy (BLE) hoạt động theo mô hình client-server với hai vai trò: Central (thiết bị di động) và Peripheral (thiết bị). Central quét sóng và khởi tạo kết nối, trong khi Peripheral truyền dữ liệu. Không giống như Bluetooth cổ điển, BLE không được thiết kế cho luồng âm thanh — nhiệm vụ của nó là truyền các gói nhỏ với mức tiêu thụ điện năng tối thiểu. Theo Bluetooth SIG Core Specification 5.4 (2025), BLE hỗ trợ tốc độ lên đến 2 Mbps với dòng điện dưới 15 mA ở chế độ hoạt động.

Hệ thống phân cấp GATT: Service, Characteristic, Descriptor

GATT (Generic Attribute Profile) định nghĩa cấu trúc dữ liệu của Bluetooth Low Energy. Service là một nhóm logic các đặc tính (ví dụ: Heart Rate Service 0x180D). Characteristic là một điểm dữ liệu với giá trị cụ thể. Descriptor là siêu dữ liệu của đặc tính, bao gồm CCCD để quản lý thông báo. Mỗi phần tử có một UUID — 16-bit cho hồ sơ Bluetooth SIG tiêu chuẩn hoặc 128-bit cho hồ sơ tùy chỉnh.

Bluetooth Low Energy trong ứng dụng di động sử dụng hệ thống phân cấp này để tổ chức trao đổi dữ liệu giữa điện thoại thông minh và thiết bị ngoại vi. Hiểu đúng về GATT là nền tảng để phát triển ứng dụng BLE trên cả hai nền tảng. Nhà phát triển phải biết UUID của các dịch vụ và đặc tính của thiết bị, cũng như thuộc tính của từng đặc tính (read, write, notify, indicate).

Advertising Data và Scan Response

Các thiết bị BLE truyền gói quảng cáo (advertising packets) để phát hiện. Advertising Data chứa tên thiết bị, UUID dịch vụ, RSSI và Manufacturer Specific Data. Kích thước gói quảng cáo bị giới hạn ở 31 byte. Để truyền dữ liệu bổ sung, Scan Response được sử dụng — gói thứ hai mà thiết bị trung tâm yêu cầu sau khi phát hiện.

BLE trên iOS: Core Bluetooth, CBCentralManager, CBPeripheral

Trên iOS, framework Core Bluetooth xử lý Bluetooth Low Energy. CBCentralManager quản lý việc quét và kết nối, CBPeripheral đại diện cho thiết bị BLE từ xa. Quy trình chuẩn: khởi tạo CBCentralManager, kiểm tra trạng thái poweredOn, bắt đầu scanForPeripherals, kết nối và khám phá dịch vụ. Core Bluetooth tự động quản lý nguồn điện của mô-đun radio — nếu BLE không được sử dụng, nó sẽ tắt.

BLE trong phát triển di động trên iOS yêu cầu xem xét chế độ nền. Chế độ nền Core Bluetooth được bật qua Capabilities của dự án (Uses Bluetooth LE accessories). Ở chế độ nền, ứng dụng có thể nhận thông báo từ các đặc tính, nhưng việc quét bị hạn chế — hệ thống chỉ khởi động lại khi thiết bị di chuyển. Đối với iBeacon, quét nền hoạt động tích cực hơn qua CLLocationManager.

Ví dụ quét BLE trong Swift

swift
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("Đã tìm thấy: \(peripheral.name ?? "unknown")")
    }
}

Trong ví dụ này, CBCentralManagerDelegate xử lý tất cả các sự kiện kết nối BLE. Phương thức centralManagerDidUpdateState kiểm tra xem Bluetooth có được bật trên thiết bị di động hay không. Sau khi khởi tạo thành công, quét bắt đầu. Callback didDiscover được gọi cho mỗi thiết bị được tìm thấy.

Kết nối và đọc đặc tính trong Core Bluetooth

Sau khi phát hiện thiết bị, cần gọi connect và discoverServices. CBPeripheralDelegate cung cấp các phương thức để xử lý từng bước: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Mỗi phương thức là bất đồng bộ — dữ liệu đến qua callback ủy quyền. RSSI (Received Signal Strength Indicator) hiển thị mức tín hiệu: giá trị càng gần 0, tín hiệu càng mạnh.

BLE trên Android: BluetoothAdapter, BluetoothGatt, BluetoothLeScanner

Trên Android, Bluetooth Low Energy được triển khai qua gói android.bluetooth. BluetoothAdapter là điểm vào cho tất cả các thao tác BLE. BluetoothLeScanner bắt đầu quét với callback ScanCallback. Sau khi phát hiện thiết bị, BluetoothGatt được tạo — kết nối với thiết bị ngoại vi. BluetoothGattCallback xử lý các sự kiện: kết nối, khám phá dịch vụ, đọc đặc tính, thay đổi RSSI.

Bluetooth Low Energy trong ứng dụng di động trên Android yêu cầu quyền rõ ràng BLUETOOTH_SCAN, BLUETOOTH_CONNECT và ACCESS_FINE_LOCATION. Từ Android 12, các quyền được tách riêng: BLUETOOTH_SCAN để quét, BLUETOOTH_CONNECT để kết nối. ACCESS_FINE_LOCATION chỉ cần thiết để quét một số loại thiết bị nhất định. Nếu không có các quyền này, ứng dụng không thể hoạt động với BLE.

Ví dụ quét BLE trong Kotlin

kotlin
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", "Thiết bị: ${device.name}, RSSI: $rssi")
        }
    }
}

ScanSettings cho phép cấu hình chế độ quét: LOW_POWER để tiết kiệm pin, BALANCED cho tác vụ tiêu chuẩn, LOW_LATENCY cho tốc độ phát hiện tối đa. ScanFilter thu hẹp tìm kiếm theo UUID dịch vụ, tên thiết bị hoặc địa chỉ MAC. Lọc giảm tiêu thụ điện năng và tăng tốc phát hiện thiết bị mong muốn.

BluetoothGatt: đọc và thông báo trên Android

Sau khi tạo BluetoothGatt qua connectGatt, ứng dụng gọi discoverServices. BluetoothGattCallback chứa onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Để nhận thông báo về thay đổi đặc tính, cần gọi setCharacteristicNotification. Quy trình đòi hỏi sự chú ý: mỗi thao tác GATT là bất đồng bộ và kết quả đến trong một callback riêng.

iBeacon, Bonding và Advertising Data trong hệ sinh thái BLE

iBeacon là công nghệ của Apple cho beacon BLE truyền UUID, Major và Minor. Thiết bị beacon phát gói quảng cáo và ứng dụng di động xác định vị trí và khoảng cách dựa trên dữ liệu này. Trên iOS, iBeacon được hỗ trợ gốc qua CLLocationManager. Trên Android, cần thư viện bên thứ ba (ví dụ: AltBeacon hoặc Android iBeacon Library).

Bonding là quy trình tạo kết nối an toàn vĩnh viễn giữa các thiết bị BLE. Sau Bonding, khóa mã hóa được lưu và các thiết bị tự động kết nối khi ở gần nhau trở lại. Trên iOS, bonding được hệ thống quản lý tự động. Trên Android — qua BluetoothDevice.createBond(). Bonding quan trọng cho thiết bị đeo và máy theo dõi sức khỏe yêu cầu kết nối lại nhanh.

Gói quảng cáo và Manufacturer Specific Data

Advertising Data là cơ chế phát hiện chính trong Bluetooth Low Energy. Nhà sản xuất thiết bị có thể thêm Manufacturer Specific Data vào gói quảng cáo để truyền dữ liệu tùy chỉnh. Định dạng gói bao gồm Company Identifier (2 byte) và dữ liệu tùy ý. Trên iOS, CBCentralManager chấp nhận mảng UUID dịch vụ để lọc — điều này tiết kiệm pin. Trên Android, ScanFilter hoạt động theo nguyên tắc tương tự.

So sánh iOS và Android cho phát triển BLE

Tham sốiOS (Core Bluetooth)Android (BluetoothGatt)
Trình quản lýCBCentralManagerBluetoothLeScanner
Kết nốiconnect(to:)connectGatt()
Dịch vụdiscoverServices()discoverServices()
ĐọcreadValue(for:)readCharacteristic()
Thông báosetNotifyValue(_:for:)setCharacteristicNotification()
QuyềnTự độngBLUETOOTH_SCAN, BLUETOOTH_CONNECT
iBeaconCLLocationManager (gốc)AltBeacon / thư viện

Tối ưu hóa BLE: MTU, Connection Interval và chế độ nền

MTU (Maximum Transmission Unit) là kích thước tối đa của một gói dữ liệu Bluetooth Low Energy. Theo mặc định, MTU là 23 byte (3 byte tiêu đề + 20 byte dữ liệu). Tăng MTU lên 512 byte tăng tốc đáng kể việc truyền khi trao đổi cấu hình hoặc nhật ký. Trên iOS, maximumWriteValueLength hiển thị MTU khả dụng. Trên Android, requestMtu() được sử dụng để tăng MTU.

Connection Interval là tần suất thiết bị trung tâm thăm dò thiết bị ngoại vi. Khoảng càng ngắn, tốc độ truyền càng cao, nhưng tiêu thụ điện năng cũng tăng. Giá trị điển hình từ 7,5 ms đến 4 giây. Cho máy theo dõi sức khỏe, 100 ms là đủ; cho âm thanh — 7,5 ms. BLE trong phát triển di động yêu cầu cân bằng giữa tốc độ truyền và thời lượng pin thiết bị.

Chế độ nền trên iOS và Android

iOS hỗ trợ BLE ở chế độ nền qua Background Modes, nhưng có hạn chế. Ứng dụng ở nền nhận thông báo từ đặc tính nhưng không thể quét chủ động. Hệ thống khởi động lại quét khi vị trí thiết bị thay đổi. Trên Android, quét nền yêu cầu Foreground Service với thông báo liên tục. Nếu không, hệ thống di động sẽ hủy tiến trình khi thu nhỏ ứng dụng.

Khuyến nghị tối ưu hóa thực tế

Để BLE hoạt động đáng tin cậy trong ứng dụng di động, hãy tuân theo các quy tắc này. Sử dụng notify thay vì polling — đặc tính có thông báo gửi dữ liệu khi thay đổi, tiết kiệm pin. Đặt MTU tối ưu khi bắt đầu kết nối. Lọc thiết bị theo UUID dịch vụ khi quét. Kiểm tra tương thích ngăn xếp BLE trên các mẫu khác nhau — nhà sản xuất (Xiaomi, Huawei, Samsung) thực hiện thay đổi ảnh hưởng đến hành vi Bluetooth.

Câu hỏi thường gặp

BLE khác với Bluetooth cổ điển như thế nào?

Bluetooth Low Energy (BLE) được tối ưu hóa để truyền định kỳ các gói nhỏ với mức tiêu thụ điện năng thấp. Bluetooth cổ điển được thiết kế cho luồng âm thanh và truyền liên tục khối lượng dữ liệu lớn.

GATT trong Bluetooth Low Energy là gì?

GATT (Generic Attribute Profile) là giao thức trao đổi dữ liệu trong BLE xác định hệ thống phân cấp Service → Characteristic → Descriptor. GATT được sử dụng để đọc, ghi và nhận thông báo từ thiết bị BLE.

Tại sao Android yêu cầu quyền ACCESS_FINE_LOCATION cho BLE?

Trước Android 12, quét BLE có thể được sử dụng để xác định vị trí, vì vậy Google đã kết hợp các quyền này. Từ Android 12, quyền BLUETOOTH_SCAN riêng biệt không gắn với vị trí đã được giới thiệu.

Làm thế nào để tăng tốc độ truyền dữ liệu BLE?

Tăng MTU qua requestMtu() trên Android và maximumWriteValueLength trên iOS. Connection Interval cũng ảnh hưởng đến tốc độ — càng nhỏ, truyền càng nhanh. Kết hợp tối ưu mang lại cải thiện lên đến 10 lần.

Bonding trong BLE là gì?

Bonding là quy trình tạo kết nối an toàn vĩnh viễn giữa các thiết bị BLE. Sau Bonding, khóa mã hóa được lưu và các thiết bị tự động kết nối mà không cần tìm kiếm lặp lại.

Tóm tắt

  • Bluetooth Low Energy — tiêu chuẩn giao tiếp không dây cho IoT với mức tiêu thụ điện năng tối thiểu và tốc độ lên đến 2 Mbps
  • GATT tổ chức dữ liệu theo hệ thống phân cấp Service → Characteristic → Descriptor với UUID cho mỗi phần tử
  • Core Bluetooth — framework Apple cho BLE trên iOS với CBCentralManager, CBPeripheral và chế độ nền
  • BluetoothGatt — API Android chính với BluetoothAdapter, BluetoothLeScanner và quyền rõ ràng BLUETOOTH_SCAN
  • iBeacon — công nghệ beacon BLE với hỗ trợ gốc trên iOS qua CLLocationManager
  • Bonding cho phép kết nối lại tự động sau khi lưu khóa mã hóa
  • Bluetooth Low Energy trong ứng dụng di động yêu cầu xem xét MTU, Connection Interval và giới hạn nền của từng nền tảng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án