Service UUID là một định danh duy nhất 16 hoặc 128 bit của Bluetooth Low Energy (BLE) xác định rõ ràng một dịch vụ chức năng trên thiết bị. Bluetooth SIG đã cấp phát UUID 16 bit tiêu chuẩn cho các dịch vụ phổ biến như Battery Service (0x180F), Device Information (0x180A) và Heart Rate (0x180D), giúp đơn giản hóa khả năng tương thích đa nền tảng. Theo Bluetooth Core Specification 5.4 (2023), các dịch vụ tùy chỉnh của nhà phát triển bên thứ ba phải sử dụng UUID 128 bit, định dạng này đảm bảo tính duy nhất toàn cầu mà không cần đăng ký trung tâm. Khai báo đúng Service UUID là bước đầu tiên để máy chủ GATT hoạt động chính xác trên thiết bị ngoại vi.
Những điểm chính
Service UUID là một định danh được gán cho dịch vụ GATT của Bluetooth Low Energy để các thiết bị khác nhận dạng rõ ràng. Trong kiến trúc BLE, mỗi dịch vụ đại diện cho một nhóm đặc tính logic được liên kết bởi một chức năng chung. Ví dụ, Battery Service chứa đặc tính Battery Level, truyền tải mức sạc pin hiện tại.
Bluetooth SIG (Special Interest Group) quản lý sổ đăng ký các UUID 16 bit tiêu chuẩn được gán cho các dịch vụ phổ biến nhất. Điều này cho phép các thiết bị từ các nhà sản xuất khác nhau nhận ra dịch vụ của nhau mà không cần cấu hình trước. Một trình theo dõi thể dục của bất kỳ thương hiệu nào cũng có thể khai báo Heart Rate Service với UUID 0x180D, và bất kỳ điện thoại thông minh nào cũng hiểu rằng đây là dịch vụ nhịp tim.
Theo Bluetooth Core Specification 5.4 (2023), phạm vi UUID 16 bit (0x0000–0xFFFF) được chia thành hai phần: từ 0x0001 đến 0xFFFE là các dịch vụ tiêu chuẩn Bluetooth SIG, và 0xFFFF được dự phòng. Nếu nhà phát triển cần một dịch vụ duy nhất không có trong sổ đăng ký SIG, họ sử dụng UUID 128 bit.
Sự khác biệt giữa UUID tiêu chuẩn và tùy chỉnh không chỉ ở độ dài: UUID 16 bit tiết kiệm thời gian phát sóng trong gói quảng cáo, vì chúng được truyền dưới dạng 2 byte thay vì 16 byte. Đối với các thiết bị có giới hạn nghiêm ngặt về kích thước gói quảng cáo (tối đa 31 byte), điều này rất quan trọng.
UUID 16 bit tiêu chuẩn bao phủ các danh mục chính của thiết bị BLE: cảm biến y tế, trình theo dõi thể dục, thiết bị điện tử đeo được và phụ kiện. Nếu một thiết bị thực hiện chức năng tiêu chuẩn, nhà phát triển được khuyến nghị sử dụng UUID tương ứng từ sổ đăng ký Bluetooth SIG để có khả năng tương thích tối đa.
Dưới đây là một số ví dụ về UUID dịch vụ tiêu chuẩn:
| UUID (hex) | Tên dịch vụ | Mục đích |
|---|---|---|
| 0x1800 | Generic Access | Kiểm soát truy cập, tên thiết bị, hình thức |
| 0x180A | Device Information | Nhà sản xuất, kiểu máy, số sê-ri, phiên bản phần mềm |
| 0x180D | Heart Rate | Đo nhịp tim, vị trí cảm biến, năng lượng pin |
| 0x180F | Battery Service | Mức sạc pin theo phần trăm |
| 0x181A | Environmental Sensing | Nhiệt độ, độ ẩm, áp suất, độ sáng |
| 0x181C | User Data | Tuổi, cân nặng, chiều cao, giới tính, nhịp tim lúc nghỉ |
UUID 128 bit tùy chỉnh cần thiết khi thiết bị cung cấp chức năng độc đáo. Ví dụ, nhà sản xuất khóa thông minh tạo dịch vụ Lock Control riêng với UUID dạng XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. UUID như vậy được đảm bảo không xung đột với các dịch vụ khác, vì không gian giá trị 128 bit thực tế là vô tận.
UUID 128 bit được viết theo định dạng UUID chuẩn RFC 4122: tám ký tự thập lục phân, dấu gạch nối, bốn, dấu gạch nối, bốn, dấu gạch nối, bốn, dấu gạch nối, mười hai ký tự. Đối với BLE, một phiên bản được sử dụng trong đó phần cơ sở của UUID Bluetooth SIG có các bit cố định.
Bluetooth SIG định nghĩa UUID cơ sở: 0000XXXX-0000-1000-8000-00805F9B34FB. Đối với các dịch vụ 16 bit tiêu chuẩn, giá trị UUID được thay thế vào mặt nạ này: ví dụ, 0x180F trở thành 0000180F-0000-1000-8000-00805F9B34FB. Các dịch vụ tùy chỉnh sử dụng UUID hoàn toàn độc lập do nhà phát triển tạo ra.
Khi tạo UUID tùy chỉnh, bạn có thể sử dụng bất kỳ trình tạo UUID nào (UUID v4). UUID v4 ngẫu nhiên cung cấp 122 bit entropy, làm cho xung đột gần như không thể xảy ra. Không sử dụng phiên bản sửa đổi của UUID cơ sở Bluetooth SIG cho các dịch vụ tùy chỉnh — điều này vi phạm đặc tả.
Khai báo dịch vụ với UUID được thực hiện ở phía ngoại vi khi tạo máy chủ GATT. Trên iOS, Core Bluetooth được sử dụng; trên Android, android.bluetooth.le. Hãy xem xét cả hai cách tiếp cận.
Trong Swift, một dịch vụ được tạo thông qua CBMutableService với việc chỉ định UUID, sau đó các đặc tính được thêm vào nó thông qua CBMutableCharacteristic.
import CoreBluetooth
// Standard 16-bit UUID
let batteryServiceUUID = CBUUID("180F")
// Custom 128-bit UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Add characteristics
service.characteristics = [characteristic]
// Publish service via peripheralManager
peripheralManager.add(service)
Trên Android, dịch vụ được đăng ký thông qua BluetoothGattServer và BluetoothGattService. UUID được truyền dưới dạng chuỗi thông qua java.util.UUID.fromString.
import android.bluetooth.*;
// Custom service UUID
private static final UUID CUSTOM_SERVICE_UUID =
UUID.fromString("E20A39F4-73F5-4BC4-A12F-17D1AD07A961");
BluetoothGattService service = new BluetoothGattService(
CUSTOM_SERVICE_UUID,
BluetoothGattService.SERVICE_TYPE_PRIMARY
);
// Add characteristics
service.addCharacteristic(characteristic);
// Register on GATT server
gattServer.addService(service);
Quét theo Service UUID cho phép thiết bị trung tâm tìm các thiết bị cung cấp dịch vụ cần thiết mà không cần kết nối với tất cả các thiết bị ngoại vi được phát hiện. Một gói quảng cáo BLE có thể chứa danh sách UUID dịch vụ, cho phép thiết bị trung tâm lọc thiết bị ở giai đoạn quét.
Trên iOS, CBCentralManager quét các thiết bị với bộ lọc theo UUID dịch vụ. Điều này giảm mức tiêu thụ điện năng và tăng tốc độ phát hiện các thiết bị cần thiết.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegate receives only Heart Rate Service devices
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral has only devices with UUID 0x180D
}
Trên Android, việc lọc theo UUID cũng được hỗ trợ thông qua ScanFilter.Builder. Đây là cách hiệu quả để thu hẹp phạm vi tìm kiếm mà không cần kết nối với từng thiết bị.
import android.bluetooth.le.*;
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(
new ParcelUuid(
UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB")
)
)
.build();
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
scanner.startScan(
Collections.singletonList(filter),
scanSettings,
scanCallback
);
Một thiết bị BLE có thể khai báo nhiều dịch vụ cùng lúc. Ví dụ, một vòng đeo tay thể dục có thể chứa Battery Service (0x180F), Heart Rate Service (0x180D) và một dịch vụ tùy chỉnh để đồng bộ dữ liệu với đám mây. Mỗi dịch vụ có UUID riêng và tập hợp đặc tính riêng.
Với nhiều dịch vụ, điều quan trọng là phải xem xét giới hạn gói quảng cáo. Một gói quảng cáo BLE có thể chứa tối đa 31 byte dữ liệu. Nếu UUID dịch vụ chiếm quá nhiều không gian, một số có thể không vừa trong gói quảng cáo. Trong trường hợp này, phản hồi quét được sử dụng — gói thứ hai được gửi theo yêu cầu của thiết bị trung tâm.
Theo Bluetooth Core Specification 5.4 (2023), số lượng dịch vụ chính tối đa trên một máy chủ GATT không bị giới hạn bởi đặc tả, nhưng trong thực tế bị giới hạn bởi bộ nhớ thiết bị và yêu cầu hiệu suất. Đối với các thiết bị nhúng có 256 KB bộ nhớ flash, khuyến nghị không quá 5–10 dịch vụ.
Các câu hỏi thường gặp
UUID 16 bit được Bluetooth SIG dự phòng cho các dịch vụ tiêu chuẩn và chiếm 2 byte trong gói quảng cáo. UUID 128 bit được sử dụng cho các dịch vụ tùy chỉnh và chiếm 16 byte. Sự lựa chọn phụ thuộc vào loại dịch vụ: chức năng tiêu chuẩn sử dụng UUID 16 bit, chức năng độc đáo sử dụng UUID 128 bit.
Sử dụng UUID v4 — một UUID ngẫu nhiên được tạo bởi các công cụ trực tuyến, lệnh terminal uuidgen hoặc API của ngôn ngữ lập trình của bạn. Ví dụ: UUID.fromString(UUID.randomUUID().toString()) trong Java hoặc UUID() trong Swift.
Không, không cần đăng ký. Bluetooth SIG chỉ đăng ký UUID 16 bit. UUID 128 bit tùy chỉnh được nhà phát triển tạo độc lập và đảm bảo tính duy nhất nhờ không gian địa chỉ rộng lớn (2^128 tổ hợp).
Có, một dịch vụ GATT tiêu chuẩn có thể chứa số lượng đặc tính không giới hạn. Ví dụ, Battery Service có thể chứa Battery Level (0x2A19) và Battery Power State (0x2A1A). Mỗi đặc tính có UUID riêng và tập hợp thuộc tính riêng.
Nếu UUID trùng nhau, thiết bị trung tâm không thể phân biệt dịch vụ này với dịch vụ khác nếu không có thông tin bổ sung. Xác suất xung đột của UUID v4 ngẫu nhiên là không đáng kể — khoảng 5,3 × 10^−37. Sử dụng trình tạo UUID ngẫu nhiên, không sao chép UUID từ các ví dụ.
Tổng kế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