Characteristic là một đơn vị dữ liệu cơ bản trong Bluetooth Low Energy, qua đó Central đọc hoặc ghi thông tin trên thiết bị ngoại vi. Mỗi Characteristic thuộc về một dịch vụ GATT cụ thể, có UUID duy nhất và một tập các thuộc tính (read, write, notify, indicate) xác định các thao tác khả thi. Theo Bluetooth Core Specification 5.4 (2023), Bluetooth SIG đã chỉ định hơn 500 đặc tính tiêu chuẩn cho các thiết bị y tế, thể dục và công nghiệp. Các nhà phát triển tạo các đặc tính tùy chỉnh để truyền bất kỳ dữ liệu người dùng nào — từ chỉ số cảm biến đến lệnh điều khiển thiết bị.
Điểm chính
Characteristic là một thuộc tính của giao thức GATT chứa một giá trị và siêu dữ liệu. Trong kiến trúc BLE, dữ liệu không được truyền trực tiếp giữa các thiết bị mà thông qua việc đọc và ghi các giá trị đặc tính của dịch vụ. Nếu một dịch vụ là một thư mục, thì Characteristic là một tập tin bên trong thư mục đó.
Mỗi Characteristic bao gồm ba thành phần: khai báo (declaration), giá trị (value) và bộ mô tả (descriptors). Khai báo chứa UUID của đặc tính và các thuộc tính của nó. Giá trị là dữ liệu thực tế được truyền giữa Central và Peripheral. Bộ mô tả cung cấp cấu hình bổ sung.
Theo Bluetooth Core Specification 5.4 (2023), tất cả các trao đổi dữ liệu trong BLE đều diễn ra thông qua các thao tác trên các đặc tính. Ngay cả các hồ sơ tiêu chuẩn như Heart Rate Profile hay Battery Service cũng được xây dựng trên một tập các đặc tính với UUID được xác định trước. Điều này đảm bảo khả năng tương thích của các thiết bị từ các nhà sản xuất khác nhau mà không cần cấu hình trước.
Điều quan trọng là nhà phát triển phải hiểu: mỗi Characteristic có thể hỗ trợ các kết hợp thuộc tính khác nhau. Một đặc tính có thể chỉ đọc, một đặc tính khác để ghi, đặc tính thứ ba để thông báo. Việc lựa chọn đúng các thuộc tính xác định kịch bản sử dụng và mức tiêu thụ điện năng của thiết bị.
Thuộc tính (properties) của một đặc tính xác định những thao tác nào được phép trên nó. Đây là một mặt nạ byte trong đó mỗi bit bật hoặc tắt một thao tác cụ thể. Dưới đây là các thuộc tính chính.
| Thuộc tính | Bit | Mô tả | Sử dụng điển hình |
|---|---|---|---|
| Read | 0x02 | Central có thể đọc giá trị hiện tại | Trạng thái, mức pin, cấu hình |
| Write | 0x08 | Central có thể ghi giá trị mới | Lệnh điều khiển, cài đặt |
| Notify | 0x10 | Peripheral gửi giá trị mà không xác nhận | Dữ liệu dòng (mạch, nhiệt độ) |
| Indicate | 0x20 | Peripheral gửi giá trị có xác nhận | Dữ liệu quan trọng (cảnh báo, trạng thái) |
| Write Without Response | 0x04 | Ghi mà không chờ xác nhận từ máy chủ | Truyền lệnh tốc độ cao |
Quyền (permissions) là mức truy cập ở cấp máy chủ GATT. Khác với các thuộc tính được khai báo trong khai báo đặc tính, quyền được kiểm tra trong mỗi thao tác. Chúng có thể bao gồm các yêu cầu về mã hóa và xác thực.
Bluetooth SIG đã chỉ định hơn 500 đặc tính tiêu chuẩn bao phủ hầu hết các trường hợp sử dụng BLE phổ biến. Việc sử dụng UUID tiêu chuẩn đảm bảo rằng mọi thiết bị nhận sẽ giải thích chính xác dữ liệu mà không cần cấu hình trước.
Đây là các đặc tính tiêu chuẩn được sử dụng nhiều nhất:
| UUID | Tên | Loại dữ liệu | Dịch vụ |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + cờ | Heart Rate |
| 0x2A6E | Temperature | int16 (0.01°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (0.01%) | Environmental Sensing |
| 0x2A00 | Device Name | Chuỗi UTF-8 | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
Nếu một đặc tính tiêu chuẩn hiện có bao phủ nhiệm vụ của bạn, hãy sử dụng nó. Điều này đơn giản hóa chứng nhận Bluetooth và cải thiện khả năng tương thích với hệ sinh thái. Chỉ tạo các đặc tính tùy chỉnh cho dữ liệu duy nhất không có trong sổ đăng ký SIG.
Việc tạo một đặc tính được thực hiện ở phía Peripheral — thiết bị cung cấp dữ liệu. Hãy xem xét các triển khai trên iOS (Swift) và Android (Java).
Core Bluetooth cung cấp lớp CBMutableCharacteristic để tạo một đặc tính với UUID, thuộc tính và giá trị ban đầu.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // Đặc tính mức pin
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// Cập nhật giá trị khi thay đổi
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
Trên Android, một đặc tính được tạo bằng BluetoothGattCharacteristic với UUID, thuộc tính và quyền.
import android.bluetooth.*;
UUID charUuid = UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB");
BluetoothGattCharacteristic characteristic =
new BluetoothGattCharacteristic(
charUuid,
BluetoothGattCharacteristic.PROPERTY_READ
| BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ
);
// Đặt giá trị
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
Các thao tác trên Characteristic được chia thành ba loại: đọc (read), ghi (write) và thông báo (notify/indicate). Việc lựa chọn phụ thuộc vào kịch bản: dữ liệu theo yêu cầu được đọc, lệnh được ghi, dữ liệu dòng đăng ký nhận thông báo.
Read: Central gửi yêu cầu đọc giá trị đặc tính. Peripheral trả lời với giá trị hiện tại. Thao tác là đồng bộ và yêu cầu một yêu cầu rõ ràng từ mỗi phía. Được sử dụng cho dữ liệu hiếm khi thay đổi: phiên bản firmware, số sê-ri, cài đặt.
Write: Central gửi dữ liệu đến Peripheral. Có hai chế độ: Write with Response (xác nhận từ Peripheral) và Write Without Response (không xác nhận). Write with Response đảm bảo phân phối — Peripheral gửi xác nhận sau khi ghi. Write Without Response nhanh hơn nhưng không đảm bảo phân phối.
Notify và Indicate: Peripheral bắt đầu truyền dữ liệu đến Central. Với Notify, dữ liệu được gửi mà không xác nhận — nếu Central không nhận được gói, nó sẽ bị mất. Với Indicate, Central gửi xác nhận (cấp PDU), đảm bảo phân phối. Indicate chậm hơn nhưng đáng tin cậy hơn. Để đăng ký nhận thông báo, Central ghi giá trị 0x0001 vào CCCD (Client Characteristic Configuration Descriptor).
MTU (Maximum Transmission Unit) xác định kích thước tối đa của một gói dữ liệu BLE. Theo mặc định, MTU là 23 byte, trong đó 3 byte là tiêu đề — tải trọng (ATT payload) là 20 byte. Điều này đủ cho hầu hết dữ liệu cảm biến nhưng không đủ cho truyền tập tin hoặc cấu hình lớn.
Bluetooth Core Specification 5.4 hỗ trợ đàm phán MTU — Central và Peripheral có thể thỏa thuận kích thước gói lớn hơn lên đến 517 byte. Quy trình hoạt động như sau: Central gửi yêu cầu MTU Exchange với MTU đề xuất của nó; Peripheral trả lời bằng MTU của nó; giá trị nhỏ hơn trong hai giá trị được sử dụng.
// iOS yêu cầu MTU khi kết nối
// MTU tối đa trong iOS là 185 byte
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// Yêu cầu MTU cho thiết bị ngoại vi cụ thể
peripheral.maximumWriteValueLength(for: .withResponse)
}
Theo Bluetooth SIG (2023), việc tăng MTU từ 23 lên 185 byte giảm chi phí truyền dữ liệu tới 80% nhờ giảm số lượng gói. Đối với các ứng dụng truyền chỉ số tần số cao (ví dụ ECG hoặc gia tốc kế), việc tăng MTU là rất quan trọng đối với sự ổn định của luồng dữ liệu.
Câu hỏi thường gặp
Đặc tả kỹ thuật BLE không giới hạn số lượng đặc tính trong một dịch vụ. Trong thực tế, giới hạn được xác định bởi bộ nhớ khả dụng của máy chủ GATT và các yêu cầu về hiệu suất. Đối với các thiết bị nhúng, không nên vượt quá 10–15 đặc tính cho mỗi dịch vụ.
Notify gửi dữ liệu mà không xác nhận — gói tin có thể bị mất mà không báo cho người gửi. Indicate yêu cầu xác nhận (ACK) ở cấp giao thức, đảm bảo phân phối. Indicate chậm hơn nhưng đáng tin cậy hơn. Đối với dữ liệu quan trọng (cảnh báo, lệnh), hãy sử dụng Indicate.
Có, một đặc tính có thể có sự kết hợp các thuộc tính. Ví dụ, một đặc tính cài đặt có thể hỗ trợ Read (đọc giá trị hiện tại) và Write (thay đổi cài đặt). Kết hợp các thuộc tính theo trường hợp sử dụng của bạn.
Sử dụng đàm phán MTU để tăng kích thước gói lên 185–517 byte. Nếu dữ liệu vẫn lớn hơn, hãy thực hiện phân mảnh ở cấp ứng dụng: chia dữ liệu thành nhiều yêu cầu tuần tự với kiểm soát tính toàn vẹn.
Nếu nhiệm vụ của bạn được bao phủ bởi một đặc tính tiêu chuẩn, hãy sử dụng UUID từ sổ đăng ký Bluetooth SIG. Điều này đơn giản hóa chứng nhận và đảm bảo khả năng tương thích với hệ sinh thái. Chỉ tạo UUID tùy chỉnh cho dữ liệu độc đáo của bên thứ ba.
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.
Đọc thêm