Service UUID — یک شناسه 16 یا 128 بیتی Bluetooth Low Energy (BLE) است که سرویس عملکردی را روی دستگاه به طور یکتا تعریف میکند. Bluetooth SIG شناسههای استاندارد 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 (Special Interest Group) رجیستری از 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 بیتی زمان رادیویی بسته تبلیغاتی را ذخیره میکنند، زیرا به جای 16 بایت به عنوان 2 بایت منتقل میشوند. برای دستگاههایی با محدودیتهای شدید اندازه بسته advertising (تا 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 در سمت Peripheral هنگام ایجاد سرور GATT انجام میشود. در iOS از Core Bluetooth و در Android از android.bluetooth.le استفاده میشود. بیایید هر دو روش را بررسی کنیم.
در Swift سرویس از طریق CBMutableService با مشخص کردن UUID ایجاد میشود و سپس ویژگیها از طریق CBMutableCharacteristic به آن اضافه میشوند.
import CoreBluetooth
// UUID 16 بیتی استاندارد
let batteryServiceUUID = CBUUID("180F")
// UUID 128 بیتی سفارشی
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
)
}
// دلیگیت فقط دستگاههای 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) و یک سرویس سفارشی برای همگامسازی دادهها با ابر باشد. هر سرویس UUID و مجموعه ویژگیهای خاص خود را دارد.
در صورت چندین سرویس، مهم است که محدودیت بسته تبلیغاتی در نظر گرفته شود. بسته advertising BLE میتواند تا 31 بایت داده داشته باشد. اگر UUIDهای سرویس فضای زیادی اشغال کنند، ممکن است برخی از آنها در بسته تبلیغاتی جا نشوند. در این حالت از scan response استفاده میشود — بسته دومی که به درخواست Central ارسال میشود.
طبق Bluetooth Core Specification 5.4 (2023)، حداکثر تعداد سرویسهای اولیه روی یک سرور GATT توسط مشخصات محدود نشده است، اما در عمل با حافظه دستگاه و الزامات عملکرد محدود میشود. برای دستگاههای تعبیهشده با 256 KB حافظه فلش، بیش از 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 مطابقت داشته باشد، Central بدون اطلاعات اضافی نمیتواند یک سرویس را از دیگری تشخیص دهد. احتمال برخورد UUID v4 تصادفی بسیار ناچیز است — حدود 5.3 × 10^−37. از مولد UUID تصادفی استفاده کنید، نه کپی کردن UUID از مثالها.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.