Bluetooth Low Energy (BLE) یک استاندارد ارتباط بیسیم است که برای انتقال حجم کم داده با حداقل مصرف انرژی بهینه شده است. به گفته Bluetooth SIG، 2025، این فناوری در بیش از 5 میلیارد دستگاه در سراسر جهان استفاده میشود. GATT (Generic Attribute Profile) دادهها را در سلسلهمراتب Service → Characteristic → Descriptor سازماندهی میکند که اساس همه برنامههای BLE برای iOS و Android است.
نکات کلیدی
Bluetooth Low Energy (BLE) با مدل کلاینت-سرور با دو نقش کار میکند: Central (دستگاه موبایل) و Peripheral (دستگاه). Central امواج را اسکن میکند و اتصال را آغاز میکند، در حالی که Peripheral داده را ارسال میکند. برخلاف Bluetooth کلاسیک، BLE برای جریانهای صوتی طراحی نشده است — وظیفه آن ارسال بستههای کوچک با حداقل مصرف انرژی است. طبق Bluetooth SIG Core Specification 5.4 (2025)، BLE از سرعت تا 2 Mbps با جریان کمتر از 15 mA در حالت فعال پشتیبانی میکند.
GATT (Generic Attribute Profile) ساختار داده Bluetooth Low Energy را تعریف میکند. Service یک گروه منطقی از ویژگیها است (مثلاً Heart Rate Service 0x180D). Characteristic یک نقطه داده با مقدار مشخص است. Descriptor فراداده ویژگی است، از جمله CCCD برای مدیریت اعلانها. هر عنصر یک UUID دارد — 16 بیتی برای پروفایلهای استاندارد Bluetooth SIG یا 128 بیتی برای سفارشی.
Bluetooth Low Energy در برنامههای موبایل از این سلسلهمراتب برای سازماندهی تبادل داده بین گوشی هوشمند و دستگاههای جانبی استفاده میکند. درک صحیح GATT پایه توسعه برنامههای BLE در هر دو پلتفرم است. توسعهدهنده باید UUID خدمات و ویژگیهای دستگاه، و همچنین ویژگیهای هر مشخصه (read، write، notify، indicate) را بداند.
دستگاههای BLE بستههای تبلیغاتی (advertising packets) برای شناسایی ارسال میکنند. Advertising Data شامل نام دستگاه، UUID خدمات، RSSI و Manufacturer Specific Data است. اندازه بسته تبلیغاتی به 31 بایت محدود شده است. برای انتقال دادههای اضافی، از Scan Response استفاده میشود — بسته دومی که دستگاه مرکزی پس از شناسایی درخواست میکند.
در iOS، فریمورک Core Bluetooth مسئول Bluetooth Low Energy است. CBCentralManager اسکن و اتصال را مدیریت میکند، CBPeripheral یک دستگاه BLE راه دور را نشان میدهد. فرآیند استاندارد است: مقداردهی اولیه CBCentralManager، بررسی وضعیت poweredOn، شروع scanForPeripherals، اتصال و کشف خدمات. Core Bluetooth به طور خودکار برق ماژول رادیو را مدیریت میکند — اگر BLE استفاده نشود، خاموش میشود.
BLE در توسعه موبایل در iOS نیاز به در نظر گرفتن حالتهای پسزمینه دارد. حالت پسزمینه Core Bluetooth از طریق Capabilities پروژه (Uses Bluetooth LE accessories) فعال میشود. در پسزمینه، برنامه میتواند اعلانهایی از ویژگیها دریافت کند، اما اسکن محدود است — سیستم فقط در هنگام حرکت دستگاه آن را مجدداً راهاندازی میکند. برای iBeacon، اسکن پسزمینه از طریق CLLocationManager فعالتر عمل میکند.
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("پیدا شد: \(peripheral.name ?? "unknown")")
}
}
در این مثال، CBCentralManagerDelegate تمام رویدادهای اتصال BLE را مدیریت میکند. روش centralManagerDidUpdateState بررسی میکند که آیا Bluetooth در دستگاه موبایل روشن است یا خیر. پس از مقداردهی موفق، اسکن شروع میشود. callback didDiscover برای هر دستگاه پیدا شده فراخوانی میشود.
پس از کشف یک دستگاه، باید connect و discoverServices را فراخوانی کرد. CBPeripheralDelegate روشهایی برای مدیریت هر مرحله ارائه میدهد: didDiscoverServices، didDiscoverCharacteristics، didUpdateValueFor. هر روش ناهمگام است — دادهها از طریق callbackهای نماینده میرسند. RSSI (Received Signal Strength Indicator) سطح سیگنال را نشان میدهد: هر چه مقدار به 0 نزدیکتر باشد، سیگنال قویتر است.
در Android، Bluetooth Low Energy از طریق بسته android.bluetooth پیادهسازی میشود. BluetoothAdapter نقطه ورود برای تمام عملیات BLE است. BluetoothLeScanner اسکن را با callbackهای ScanCallback شروع میکند. پس از کشف دستگاه، BluetoothGatt ایجاد میشود — اتصالی به دستگاه جانبی. BluetoothGattCallback رویدادها را مدیریت میکند: اتصال، کشف خدمات، خواندن ویژگیها، تغییرات RSSI.
Bluetooth Low Energy در برنامههای موبایل در Android نیاز به مجوزهای صریح BLUETOOTH_SCAN، BLUETOOTH_CONNECT و ACCESS_FINE_LOCATION دارد. از Android 12، مجوزها جدا شدهاند: BLUETOOTH_SCAN برای اسکن، BLUETOOTH_CONNECT برای اتصال. ACCESS_FINE_LOCATION فقط برای اسکن انواع خاصی از دستگاهها مورد نیاز است. بدون این مجوزها، برنامه نمیتواند با BLE کار کند.
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "دستگاه: ${device.name}، RSSI: $rssi")
}
}
}
ScanSettings به شما امکان میدهد حالت اسکن را پیکربندی کنید: LOW_POWER برای صرفهجویی در باتری، BALANCED برای وظایف استاندارد، LOW_LATENCY برای حداکثر سرعت تشخیص. ScanFilter جستجو را بر اساس UUID خدمات، نام دستگاه یا آدرس MAC محدود میکند. فیلتر کردن مصرف انرژی را کاهش میدهد و تشخیص دستگاه مورد نظر را سرعت میبخشد.
پس از ایجاد BluetoothGatt از طریق connectGatt، برنامه discoverServices را فراخوانی میکند. BluetoothGattCallback شامل onServicesDiscovered، onCharacteristicRead، onCharacteristicChanged است. برای دریافت اعلانها در مورد تغییرات ویژگی، باید setCharacteristicNotification را فراخوانی کرد. فرآیند نیاز به دقت دارد: هر عملیات GATT ناهمگام است و نتیجه در یک callback جداگانه میرسد.
iBeacon فناوری اپل برای بیکنهای BLE است که UUID، Major و Minor را ارسال میکنند. دستگاه بیکن یک بسته تبلیغاتی پخش میکند و برنامه موبایل بر اساس این دادهها مکان و فاصله را تعیین میکند. در iOS، iBeacon به صورت بومی از طریق CLLocationManager پشتیبانی میشود. در Android، یک کتابخانه شخص ثالث مورد نیاز است (مثلاً AltBeacon یا Android iBeacon Library).
Bonding روش ایجاد یک اتصال امن دائمی بین دستگاههای BLE است. پس از Bonding، کلیدهای رمزگذاری ذخیره میشوند و دستگاهها در نزدیک شدن مجدد به طور خودکار متصل میشوند. در iOS، bonding به طور خودکار توسط سیستم مدیریت میشود. در Android — از طریق BluetoothDevice.createBond(). Bonding برای دستگاههای پوشیدنی و ردیابهای تناسب اندام که نیاز به اتصال مجدد سریع دارند، مهم است.
Advertising Data یک مکانیسم کلیدی تشخیص در Bluetooth Low Energy است. تولیدکنندگان دستگاه میتوانند Manufacturer Specific Data را به بسته تبلیغاتی اضافه کنند تا دادههای سفارشی را ارسال کنند. فرمت بسته شامل Company Identifier (2 بایت) و دادههای دلخواه است. در iOS، CBCentralManager آرایهای از UUID خدمات را برای فیلتر کردن میپذیرد — این باعث صرفهجویی در باتری میشود. در Android، ScanFilter بر اساس همان اصل کار میکند.
| پارامتر | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| مدیر | CBCentralManager | BluetoothLeScanner |
| اتصال | connect(to:) | connectGatt() |
| خدمات | discoverServices() | discoverServices() |
| خواندن | readValue(for:) | readCharacteristic() |
| اعلانها | setNotifyValue(_:for:) | setCharacteristicNotification() |
| مجوزها | خودکار | BLUETOOTH_SCAN، BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (بومی) | AltBeacon / کتابخانهها |
MTU (Maximum Transmission Unit) حداکثر اندازه یک بسته داده Bluetooth Low Energy است. به طور پیشفرض، MTU 23 بایت است (3 بایت هدر + 20 بایت داده). افزایش MTU به 512 بایت، انتقال را هنگام تبادل پیکربندیها یا لاگها به طور قابل توجهی سرعت میبخشد. در iOS، maximumWriteValueLength MTU موجود را نشان میدهد. در Android، برای افزایش MTU از requestMtu() استفاده میشود.
Connection Interval فرکانسی است که دستگاه مرکزی از دستگاه جانبی پرسوجو میکند. هر چه بازه کوتاهتر باشد، سرعت انتقال بالاتر است، اما مصرف انرژی نیز بیشتر میشود. مقادیر معمول از 7.5 میلیثانیه تا 4 ثانیه متغیر است. برای ردیابهای تناسب اندام، 100 میلیثانیه کافی است؛ برای صدا — 7.5 میلیثانیه. BLE در توسعه موبایل نیاز به تعادل بین سرعت انتقال و عمر باتری دستگاه دارد.
iOS از BLE در حالت پسزمینه از طریق Background Modes پشتیبانی میکند، اما با محدودیتهایی. برنامه در پسزمینه اعلانهایی از ویژگیها دریافت میکند، اما نمیتواند به طور فعال اسکن کند. سیستم هنگام تغییر مکان دستگاه، اسکن را مجدداً راهاندازی میکند. در Android، اسکن پسزمینه نیاز به Foreground Service با یک اعلان دائمی دارد. بدون آن، سیستم موبایل هنگام کوچکسازی برنامه، فرآیند را میکشد.
برای عملکرد قابل اعتماد BLE در برنامههای موبایل، این قوانین را دنبال کنید. به جای polling از notify استفاده کنید — یک ویژگی با اعلانها در هنگام تغییر داده ارسال میکند و باتری را ذخیره میکند. MTU بهینه را در ابتدای اتصال تنظیم کنید. هنگام اسکن، دستگاهها را بر اساس UUID خدمات فیلتر کنید. سازگاری پشته BLE را در مدلهای مختلف بررسی کنید — تولیدکنندگان (Xiaomi، Huawei، Samsung) تغییراتی ایجاد میکنند که بر رفتار Bluetooth تأثیر میگذارد.
سؤالات متداول
Bluetooth Low Energy (BLE) برای انتقال دورهای بستههای کوچک با مصرف انرژی کم بهینه شده است. Bluetooth کلاسیک برای جریانهای صوتی و انتقال مداوم حجم بالای داده طراحی شده است.
GATT (Generic Attribute Profile) یک پروتکل تبادل داده در BLE است که سلسلهمراتب Service → Characteristic → Descriptor را تعریف میکند. GATT برای خواندن، نوشتن و دریافت اعلانها از دستگاههای BLE استفاده میشود.
قبل از Android 12، اسکن BLE میتوانست برای تعیین مکان استفاده شود، بنابراین Google این مجوزها را ترکیب کرد. از Android 12، مجوز جداگانه BLUETOOTH_SCAN بدون وابستگی به مکان معرفی شده است.
MTU را از طریق requestMtu() در Android و maximumWriteValueLength در iOS افزایش دهید. Connection Interval نیز بر سرعت تأثیر میگذارد — هر چه کوچکتر باشد، انتقال سریعتر است. ترکیب بهینه تا 10 برابر بهبود ایجاد میکند.
Bonding روش ایجاد یک اتصال امن دائمی بین دستگاههای BLE است. پس از Bonding، کلیدهای رمزگذاری ذخیره میشوند و دستگاهها بدون جستجوی مکرر به طور خودکار متصل میشوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.