Service UUID — είναι ένα μοναδικό αναγνωριστικό 16 ή 128 bit Bluetooth Low Energy (BLE) που ορίζει κατηγορηματικά μια λειτουργική υπηρεσία σε μια συσκευή. Η Bluetooth SIG έχει εκχωρήσει τυπικά 16-bit UUID για κοινές υπηρεσίες όπως Battery Service (0x180F), Device Information (0x180A) και Heart Rate (0x180D), γεγονός που απλοποιεί τη διαλειτουργικότητα μεταξύ πλατφορμών. Σύμφωνα με το Bluetooth Core Specification 5.4 (2023), οι προσαρμοσμένες υπηρεσίες τρίτων προγραμματιστών υποχρεούνται να χρησιμοποιούν 128-bit UUID, των οποίων η μορφή εγγυάται παγκόσμια μοναδικότητα χωρίς κεντρικό μητρώο. Η σωστή δήλωση του Service UUID είναι το πρώτο βήμα για τη σωστή λειτουργία του διακομιστή GATT στην περιφερειακή συσκευή.
Κύρια σημεία
Service UUID — είναι ένα αναγνωριστικό που εκχωρείται σε μια υπηρεσία GATT Bluetooth Low Energy για μοναδική αναγνώριση από άλλες συσκευές. Στην αρχιτεκτονική BLE, κάθε υπηρεσία αντιπροσωπεύει μια λογική ομάδα χαρακτηριστικών που ενώνονται από μια κοινή λειτουργία. Για παράδειγμα, η υπηρεσία Battery Service περιέχει το χαρακτηριστικό Battery Level, το οποίο μεταδίδει το τρέχον επίπεδο φόρτισης της μπαταρίας.
Η Bluetooth SIG (Special Interest Group) διαχειρίζεται το μητρώο τυπικών 16-bit UUID που εκχωρούνται στις πιο κοινές υπηρεσίες. Αυτό επιτρέπει σε συσκευές διαφορετικών κατασκευαστών να αναγνωρίζουν η μία τις υπηρεσίες της άλλης χωρίς προηγούμενη διαμόρφωση. Ένας ιχνηλάτης φυσικής κατάστασης οποιασδήποτε μάρκας μπορεί να δηλώσει το Heart Rate Service με UUID 0x180D, και οποιοδήποτε smartphone θα καταλάβει ότι πρόκειται για υπηρεσία καρδιακών παλμών.
Σύμφωνα με το Bluetooth Core Specification 5.4 (2023), το εύρος των 16-bit UUID (0x0000–0xFFFF) χωρίζεται σε δύο μέρη: από 0x0001 έως 0xFFFE — τυπικές υπηρεσίες Bluetooth SIG, και το 0xFFFF είναι δεσμευμένο. Εάν ένας προγραμματιστής χρειάζεται μια μοναδική υπηρεσία που δεν υπάρχει στο μητρώο SIG, χρησιμοποιεί ένα 128-bit UUID.
Η διαφορά μεταξύ τυπικού και προσαρμοσμένου UUID δεν είναι μόνο στο μήκος: τα 16-bit UUID εξοικονομούν χρόνο μετάδοσης του πακέτου διαφήμισης, καθώς μεταδίδονται ως 2 byte αντί για 16 byte. Για συσκευές με αυστηρούς περιορισμούς στο μέγεθος του πακέτου advertising (έως 31 byte), αυτό είναι κρίσιμο.
Τυπικά 16-bit UUID καλύπτουν τις κύριες κατηγορίες συσκευών BLE: ιατρικοί αισθητήρες, ιχνηλάτες φυσικής κατάστασης, φορητά ηλεκτρονικά και αξεσουάρ. Εάν μια συσκευή υλοποιεί μια τυπική λειτουργία — συνιστάται στον προγραμματιστή να χρησιμοποιήσει το αντίστοιχο UUID από το μητρώο Bluetooth SIG για μέγιστη συμβατότητα.
Ακολουθούν μερικά παραδείγματα τυπικών UUID υπηρεσιών:
| UUID (hex) | Όνομα υπηρεσίας | Σκοπός |
|---|---|---|
| 0x1800 | Generic Access | Διαχείριση πρόσβασης, όνομα συσκευής, εξωτερική εμφάνιση |
| 0x180A | Device Information | Κατασκευαστής, μοντέλο, σειριακός αριθμός, έκδοση λογισμικού |
| 0x180D | Heart Rate | Μέτρηση παλμού, θέση αισθητήρα, ενέργεια μπαταρίας |
| 0x180F | Battery Service | Επίπεδο φόρτισης μπαταρίας σε ποσοστό |
| 0x181A | Environmental Sensing | Θερμοκρασία, υγρασία, πίεση, φωτισμός |
| 0x181C | User Data | Ηλικία, βάρος, ύψος, φύλο, παλμός ηρεμίας |
Προσαρμοσμένα 128-bit UUID είναι απαραίτητα όταν η συσκευή παρέχει μοναδική λειτουργικότητα. Για παράδειγμα, ένας κατασκευαστής έξυπνης κλειδαριάς δημιουργεί τη δική του υπηρεσία Lock Control με UUID της μορφής XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Ένα τέτοιο UUID εγγυάται ότι δεν θα έρθει σε σύγκρουση με άλλες υπηρεσίες, καθώς ο χώρος των 128-bit τιμών είναι πρακτικά ανεξάντλητος.
128-bit UUID γράφεται στην τυπική μορφή UUID RFC 4122: οκτώ δεκαεξαδικοί χαρακτήρες, παύλα, τέσσερις, παύλα, τέσσερις, παύλα, τέσσερις, παύλα, δώδεκα χαρακτήρες. Για BLE χρησιμοποιείται η έκδοση όπου το βασικό μέρος του UUID Bluetooth SIG έχει σταθερά bits.
Η Bluetooth SIG ορίζει το βασικό UUID: 0000XXXX-0000-1000-8000-00805F9B34FB. Για τυπικές 16-bit υπηρεσίες, σε αυτή τη μάσκα αντικαθίσταται η τιμή UUID: για παράδειγμα, το 0x180F γίνεται 0000180F-0000-1000-8000-00805F9B34FB. Οι προσαρμοσμένες υπηρεσίες χρησιμοποιούν ένα εντελώς ανεξάρτητο UUID, που δημιουργείται από τον προγραμματιστή.
Κατά τη δημιουργία προσαρμοσμένου UUID μπορείτε να χρησιμοποιήσετε οποιαδήποτε γεννήτρια UUID (UUID v4). Ένα τυχαίο UUID v4 παρέχει 122 bits εντροπίας, καθιστώντας τις συγκρούσεις πρακτικά αδύνατες. Μην χρησιμοποιείτε τροποποιημένη έκδοση του βασικού UUID Bluetooth SIG για προσαρμοσμένες υπηρεσίες — αυτό παραβιάζει τις προδιαγραφές.
Δήλωση υπηρεσίας με UUID εκτελείται στην πλευρά του Peripheral κατά τη δημιουργία του διακομιστή GATT. Στο iOS χρησιμοποιείται το Core Bluetooth, στο Android — το android.bluetooth.le. Ας εξετάσουμε και τις δύο προσεγγίσεις.
Στο Swift, η υπηρεσία δημιουργείται μέσω CBMutableService με καθορισμό UUID, μετά το οποίο προστίθενται χαρακτηριστικά μέσω CBMutableCharacteristic.
import CoreBluetooth
// Τυπικό 16-bit UUID
let batteryServiceUUID = CBUUID("180F")
// Προσαρμοσμένο 128-bit UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Προσθήκη χαρακτηριστικών
service.characteristics = [characteristic]
// Δημοσίευση υπηρεσίας μέσω peripheralManager
peripheralManager.add(service)
Στο Android, η υπηρεσία καταχωρείται μέσω BluetoothGattServer και BluetoothGattService. Το UUID μεταβιβάζεται ως συμβολοσειρά στο java.util.UUID.fromString.
import android.bluetooth.*;
// Προσαρμοσμένο 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
);
// Προσθήκη χαρακτηριστικών
service.addCharacteristic(characteristic);
// Εγγραφή στον διακομιστή GATT
gattServer.addService(service);
Σάρωση βάσει Service UUID επιτρέπει στο Central να βρίσκει συσκευές που προσφέρουν την απαιτούμενη υπηρεσία χωρίς σύνδεση σε όλες τις ανιχνευμένες Peripheral. Το πακέτο διαφήμισης BLE μπορεί να περιέχει μια λίστα UUID υπηρεσιών, επιτρέποντας στο Central να φιλτράρει συσκευές στο στάδιο της σάρωσης.
Στο iOS, το CBCentralManager σαρώνει συσκευές με φίλτρο βάσει UUID υπηρεσίας. Αυτό μειώνει την κατανάλωση ενέργειας και επιταχύνει την ανίχνευση των απαιτούμενων συσκευών.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Ο delegate λαμβάνει μόνο συσκευές Heart Rate Service
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// το peripheral έχει μόνο συσκευές με UUID 0x180D
}
Στο Android, το φιλτράρισμα βάσει UUID υποστηρίζεται επίσης μέσω ScanFilter.Builder. Αυτός είναι ένας αποτελεσματικός τρόπος για να περιορίσετε το εύρος αναζήτησης χωρίς σύνδεση σε κάθε συσκευή.
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
);
Μία συσκευή BLE μπορεί να δηλώσει πολλαπλές υπηρεσίες ταυτόχρονα. Για παράδειγμα, ένα βραχιόλι φυσικής κατάστασης μπορεί να περιέχει Battery Service (0x180F), Heart Rate Service (0x180D) και μια προσαρμοσμένη υπηρεσία για συγχρονισμό δεδομένων με το cloud. Κάθε υπηρεσία έχει το δικό της UUID και το δικό της σύνολο χαρακτηριστικών.
Σε περίπτωση πολλαπλών υπηρεσιών, είναι σημαντικό να λαμβάνεται υπόψη ο περιορισμός του πακέτου διαφήμισης. Το πακέτο διαφήμισης BLE μπορεί να περιέχει έως 31 byte δεδομένων. Εάν τα UUID των υπηρεσιών καταλαμβάνουν πολύ χώρο, ορισμένα από αυτά μπορεί να μην χωρούν στο πακέτο διαφήμισης. Σε αυτήν την περίπτωση, χρησιμοποιείται το scan response — το δεύτερο πακέτο που αποστέλλεται κατόπιν αιτήματος του Central.
Σύμφωνα με το Bluetooth Core Specification 5.4 (2023), ο μέγιστος αριθμός κύριων υπηρεσιών σε έναν διακομιστή GATT δεν περιορίζεται από τις προδιαγραφές, αλλά στην πράξη περιορίζεται από τη μνήμη της συσκευής και τις απαιτήσεις απόδοσης. Για ενσωματωμένες συσκευές με 256 KB μνήμης flash, συνιστώνται όχι περισσότερες από 5–10 υπηρεσίες.
Συχνές ερωτήσεις
Τα 16-bit UUID έχουν δεσμευτεί από την Bluetooth SIG για τυπικές υπηρεσίες και καταλαμβάνουν 2 byte στο πακέτο διαφήμισης. Τα 128-bit UUID χρησιμοποιούνται για προσαρμοσμένες υπηρεσίες και καταλαμβάνουν 16 byte. Η επιλογή εξαρτάται από τον τύπο υπηρεσίας: η τυπική λειτουργικότητα χρησιμοποιεί 16-bit UUID, η μοναδική — 128-bit UUID.
Χρησιμοποιήστε UUID v4 — ένα τυχαίο UUID που δημιουργείται από διαδικτυακά εργαλεία, την εντολή τερματικού uuidgen ή το API της γλώσσας προγραμματισμού σας. Παράδειγμα: UUID.fromString(UUID.randomUUID().toString()) σε Java ή UUID() σε Swift.
Όχι, δεν απαιτείται εγγραφή. Η Bluetooth SIG καταχωρεί μόνο 16-bit UUID. Τα προσαρμοσμένα 128-bit UUID δημιουργούνται ανεξάρτητα από τον προγραμματιστή και εγγυώνται μοναδικότητα χάρη στον τεράστιο χώρο διευθύνσεων (2^128 συνδυασμοί).
Ναι, μια τυπική υπηρεσία GATT μπορεί να περιέχει απεριόριστο αριθμό χαρακτηριστικών. Για παράδειγμα, η Battery Service μπορεί να περιέχει Battery Level (0x2A19) και Battery Power State (0x2A1A). Κάθε χαρακτηριστικό έχει το δικό του UUID και σύνολο ιδιοτήτων.
Εάν τα UUID συμπίπτουν, το Central δεν θα μπορεί να διακρίνει τη μία υπηρεσία από την άλλη χωρίς πρόσθετες πληροφορίες. Η πιθανότητα σύγκρουσης τυχαίων UUID v4 είναι αμελητέα — περίπου 5,3 × 10^−37. Χρησιμοποιήστε γεννήτρια τυχαίων UUID, μην αντιγράφετε UUID από παραδείγματα.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης