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
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.
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).
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.
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.
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.
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.
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.
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.
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 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.
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ự.
| Tham số | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| Trình quản lý | CBCentralManager | BluetoothLeScanner |
| Kết nối | connect(to:) | connectGatt() |
| Dịch vụ | discoverServices() | discoverServices() |
| Đọc | readValue(for:) | readCharacteristic() |
| Thông báo | setNotifyValue(_:for:) | setCharacteristicNotification() |
| Quyền | Tự động | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (gốc) | AltBeacon / thư việ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ị.
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.
Để 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
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 (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.
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.
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 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
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.