Characteristic: khái niệm, loại dữ liệu và cách đọc giá trị

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

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 điểm dữ liệu bên trong dịch vụ GATT BLE, có UUID, thuộc tính và giá trị của một loại cụ thể.
  • Các thuộc tính xác định các thao tác có sẵn: read (đọc), write (ghi), notify (thông báo), indicate (thông báo xác nhận).
  • Các đặc tính tiêu chuẩn (mức pin, nhịp tim) có UUID 16 bit từ sổ đăng ký Bluetooth SIG.
  • Mỗi Characteristic có thể chứa bộ mô tả (descriptors) — siêu dữ liệu mô tả đơn vị đo lường hoặc cấu hình thông báo.
  • Kích thước tối đa của một gói dữ liệu qua Characteristic là 20 byte (MTU 23) hoặc lên đến 244 byte khi tăng MTU.

Characteristic trong BLE là gì?

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)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 và quyền của Characteristic

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ínhBitMô tảSử dụng điển hình
Read0x02Central có thể đọc giá trị hiện tạiTrạng thái, mức pin, cấu hình
Write0x08Central có thể ghi giá trị mớiLệnh điều khiển, cài đặt
Notify0x10Peripheral gửi giá trị mà không xác nhậnDữ liệu dòng (mạch, nhiệt độ)
Indicate0x20Peripheral gửi giá trị có xác nhậnDữ liệu quan trọng (cảnh báo, trạng thái)
Write Without Response0x04Ghi 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.

Đặc tính tiêu chuẩn Bluetooth SIG

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:

UUIDTênLoại dữ liệuDịch vụ
0x2A19Battery Leveluint8 (0–100%)Battery Service
0x2A37Heart Rate Measurementuint8 + cờHeart Rate
0x2A6ETemperatureint16 (0.01°C)Environmental Sensing
0x2A6FHumidityuint16 (0.01%)Environmental Sensing
0x2A00Device NameChuỗi UTF-8Generic Access
0x2A01Appearanceuint16Generic 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.

Cách tạo Characteristic trong iOS và Android

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).

iOS: CBMutableCharacteristic

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.

swift
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
)

Android: BluetoothGattCharacteristic

Trên Android, một đặc tính được tạo bằng BluetoothGattCharacteristic với UUID, thuộc tính và quyền.

java
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, ghi và thông báo

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 và kích thước dữ liệu truyền

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.

swift
// 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

Một dịch vụ có thể chứa bao nhiêu đặc tính?

Đặ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ụ.

Sự khác biệt giữa Notify và Indicate là gì?

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.

Một đặc tính có thể có cả Read và Write không?

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.

Làm cách nào để truyền dữ liệu lớn hơn 20 byte qua BLE?

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.

Tôi có nên sử dụng UUID đặc tính tiêu chuẩn không?

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

  • Characteristic là cơ chế truyền dữ liệu chính trong BLE, đại diện cho một giá trị với UUID, thuộc tính và bộ mô tả.
  • Các thuộc tính (Read, Write, Notify, Indicate) xác định các thao tác có sẵn trên đặc tính.
  • Bluetooth SIG đã chỉ định hơn 500 đặc tính tiêu chuẩn — hãy sử dụng chúng cho khả năng tương thích thiết bị.
  • Việc tạo đặc tính được thực hiện ở phía Peripheral thông qua Core Bluetooth (iOS) hoặc BluetoothGattCharacteristic (Android).
  • Thông báo (Notify/Indicate) hiệu quả hơn so với việc thăm dò định kỳ cho dữ liệu dòng — chúng không yêu cầu các yêu cầu liên tục từ Central.
  • Kích thước của một gói duy nhất bị giới hạn bởi MTU (20 byte mặc định) nhưng có thể được tăng lên 517 byte thông qua MTU Exchange.
  • Việc lựa chọn đúng các thuộc tính và UUID xác định mức tiêu thụ điện, độ tin cậy và hiệu suất của kết nối BLE.

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

Đọc thêm