Service UUID هو معرّف فريد مكون من 16 أو 128 بت لتقنية Bluetooth Low Energy (BLE) والذي يُحدد بشكل قاطع خدمة وظيفية على الجهاز. خصصت Bluetooth SIG معرفات UUID قياسية 16 بت للخدمات الشائعة مثل Battery Service (0x180F) وDevice Information (0x180A) وHeart Rate (0x180D)، مما يُبسط التوافق عبر المنصات. وفقاً لـ Bluetooth Core Specification 5.4 (2023)، يجب أن تستخدم الخدمات المخصصة لمطوري الطرف الثالث معرفات UUID 128 بت، التي يضمن تنسيقها التفرد العالمي دون سجل مركزي. الإعلان الصحيح عن Service UUID هو الخطوة الأولى نحو التشغيل الصحيح لخادم GATT على الجهاز الطرفي.
النقاط الرئيسية
Service UUID هو معرّف يُخصص لخدمة GATT الخاصة بـ Bluetooth Low Energy للتعرف عليها بشكل قاطع من قبل الأجهزة الأخرى. في بنية BLE، تمثل كل خدمة مجموعة منطقية من الخصائص المرتبطة بوظيفة مشتركة. على سبيل المثال، يحتوي Battery Service على خاصية Battery Level التي تنقل شحن البطارية الحالي.
تدير Bluetooth SIG (مجموعة الاهتمامات الخاصة) سجل معرفات UUID 16 بت القياسية المخصصة للخدمات الأكثر شيوعاً. يتيح ذلك للأجهزة من مختلف المصنعين التعرف على خدمات بعضهم البعض دون إعداد مسبق. يمكن لأي متتبع لياقة بدنية من أي علامة تجارية أن يُعلن عن Heart Rate Service بـ UUID 0x180D، وسيفهم أي هاتف ذكي أن هذه خدمة معدل ضربات القلب.
وفقاً لـ Bluetooth Core Specification 5.4 (2023)، ينقسم نطاق UUID 16 بت (0x0000–0xFFFF) إلى جزأين: من 0x0001 إلى 0xFFFE هي خدمات Bluetooth SIG القياسية، و0xFFFF محجوز. إذا احتاج المطور إلى خدمة فريدة غير موجودة في سجل SIG، فإنه يستخدم UUID 128 بت.
الفرق بين UUID القياسي والمخصص ليس فقط في الطول: معرفات UUID 16 بت توفر وقت البث في حزمة الإعلان، حيث تُنقل كـ 2 بايت بدلاً من 16 بايت. بالنسبة للأجهزة ذات القيود الصارمة على حجم حزمة الإعلان (حتى 31 بايت)، هذا أمر بالغ الأهمية.
معرفات UUID القياسية 16 بت تغطي الفئات الرئيسية لأجهزة 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 | العمر، الوزن، الطول، الجنس، النبض أثناء الراحة |
معرفات UUID المخصصة 128 بت ضرورية عندما يوفر الجهاز وظائف فريدة. على سبيل المثال، تقوم شركة تصنيع الأقفال الذكية بإنشاء خدمة Lock Control الخاصة بها بـ UUID بالشكل XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. هذا UUID مضمون ألا يتعارض مع الخدمات الأخرى، لأن مساحة القيم 128 بت لا تنضب عملياً.
يُكتب UUID 128 بت بالتنسيق القياسي UUID RFC 4122: ثمانية أحرف سداسية عشرية، شرطة، أربعة، شرطة، أربعة، شرطة، أربعة، شرطة، اثنا عشر حرفاً. بالنسبة لـ BLE، تُستخدم نسخة حيث الجزء الأساسي من UUID لـ Bluetooth SIG له بتات ثابتة.
يُعرّف Bluetooth SIG الـ UUID الأساسي: 0000XXXX-0000-1000-8000-00805F9B34FB. بالنسبة للخدمات القياسية 16 بت، يتم إدراج قيمة UUID في هذا القناع: على سبيل المثال، 0x180F يصبح 0000180F-0000-1000-8000-00805F9B34FB. تستخدم الخدمات المخصصة UUID مستقلاً تماماً يولده المطور.
عند إنشاء UUID مخصص، يمكنك استخدام أي مولد UUID (UUID v4). يوفر UUID v4 العشوائي 122 بت من الإنتروبيا، مما يجعل التصادمات مستحيلة عملياً. لا تستخدم نسخة معدلة من UUID الأساسي لـ Bluetooth SIG للخدمات المخصصة — فهذا ينتهك المواصفات.
الإعلان عن خدمة بـ UUID يتم على الجانب الطرفي عند إنشاء خادم GATT. في iOS، يُستخدم Core Bluetooth، وفي Android android.bluetooth.le. دعنا ننظر إلى كلا النهجين.
في Swift، يتم إنشاء الخدمة عبر CBMutableService مع تحديد UUID، ثم تُضاف إليها الخصائص عبر 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)
في Android، يتم تسجيل الخدمة عبر BluetoothGattServer وBluetoothGattService. يُمرر UUID كسلسلة نصية عبر 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);
المسح الضوئي بواسطة Service UUID يسمح للجهاز المركزي بالعثور على الأجهزة التي توفر الخدمة المطلوبة دون الاتصال بجميع الأجهزة الطرفية المكتشفة. يمكن أن تحتوي حزمة إعلان BLE على قائمة بـ UUID الخدمات، مما يسمح للجهاز المركزي بتصفية الأجهزة في مرحلة المسح الضوئي.
في 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 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
}
في 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) وخدمة مخصصة لمزامنة البيانات مع السحابة. كل خدمة لها UUID الخاص بها ومجموعتها الخاصة من الخصائص.
مع الخدمات المتعددة، من المهم مراعاة الحد الأقصى لحزمة الإعلان. يمكن أن تحتوي حزمة إعلان BLE على ما يصل إلى 31 بايت من البيانات. إذا كانت معرفات UUID للخدمات تشغل مساحة كبيرة جداً، فقد لا تتسع بعضها في حزمة الإعلان. في هذه الحالة، يُستخدم scan response — حزمة ثانية تُرسل بناءً على طلب الجهاز المركزي.
وفقاً لـ Bluetooth Core Specification 5.4 (2023)، الحد الأقصى لعدد الخدمات الأساسية على خادم GATT واحد غير محدد في المواصفات، لكنه عملياً محدود بذاكرة الجهاز ومتطلبات الأداء. للأجهزة المدمجة ذات ذاكرة فلاش 256 كيلوبايت، يُوصى بما لا يزيد عن 5–10 خدمات.
الأسئلة الشائعة
معرفات UUID 16 بت محجوزة من قبل Bluetooth SIG للخدمات القياسية وتشغل 2 بايت في حزمة الإعلان. تُستخدم معرفات UUID 128 بت للخدمات المخصصة وتشغل 16 بايت. يعتمد الاختيار على نوع الخدمة: الوظائف القياسية تستخدم UUID 16 بت، والوظائف الفريدة تستخدم UUID 128 بت.
استخدم UUID v4 — UUID عشوائي يتم إنشاؤه بواسطة أدوات عبر الإنترنت أو أمر uuidgen في الطرفية أو API للغة البرمجة الخاصة بك. مثال: UUID.fromString(UUID.randomUUID().toString()) في Java أو UUID() في Swift.
لا، التسجيل غير مطلوب. تسجل Bluetooth SIG فقط معرفات UUID 16 بت. يتم إنشاء معرفات UUID 128 بت المخصصة بواسطة المطور بشكل مستقل وتضمن التفرد بفضل مساحة العناوين الهائلة (مجموعات 2^128).
نعم، يمكن أن تحتوي خدمة GATT القياسية على عدد غير محدود من الخصائص. على سبيل المثال، قد يحتوي Battery Service على Battery Level (0x2A19) وBattery Power State (0x2A1A). كل خاصية لها UUID الخاص بها ومجموعة من الخصائص.
إذا تطابقت معرفات UUID، فلن يتمكن الجهاز المركزي من التمييز بين خدمة وأخرى دون معلومات إضافية. احتمال تصادم UUID v4 العشوائي ضئيل جداً — حوالي 5.3 × 10^−37. استخدم مولد UUID عشوائي، ولا تنسخ UUID من الأمثلة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.