Bluetooth Low Energy (BLE) در توسعه موبایل: چیست، پروتکل‌ها و نحوه کار

نویسنده: IT Sectr منتشر شده: 2026-07-25 زمان مطالعه: 11 دقیقه

Bluetooth Low Energy (BLE) یک استاندارد ارتباط بی‌سیم است که برای انتقال حجم کم داده با حداقل مصرف انرژی بهینه شده است. به گفته Bluetooth SIG، 2025، این فناوری در بیش از 5 میلیارد دستگاه در سراسر جهان استفاده می‌شود. GATT (Generic Attribute Profile) داده‌ها را در سلسله‌مراتب Service → Characteristic → Descriptor سازماندهی می‌کند که اساس همه برنامه‌های BLE برای iOS و Android است.

نکات کلیدی

  • GATT — پروتکل تبادل داده در Bluetooth Low Energy با سلسله‌مراتب Service → Characteristic → Descriptor
  • Core Bluetooth — فریمورک اپل برای کار با BLE در iOS، مبتنی بر CBCentralManager و CBPeripheral
  • BluetoothGatt — API اصلی برای اتصالات BLE در Android از طریق BluetoothLeScanner
  • iBeacon — پروتکل بیکن BLE اپل با پشتیبانی بومی از طریق CLLocationManager در iOS
  • Bonding — اتصال رمزگذاری شده دائمی که اسکن و جفت‌سازی مکرر را حذف می‌کند

Bluetooth Low Energy (BLE) چیست و چگونه کار می‌کند؟

Bluetooth Low Energy (BLE) با مدل کلاینت-سرور با دو نقش کار می‌کند: Central (دستگاه موبایل) و Peripheral (دستگاه). Central امواج را اسکن می‌کند و اتصال را آغاز می‌کند، در حالی که Peripheral داده را ارسال می‌کند. برخلاف Bluetooth کلاسیک، BLE برای جریان‌های صوتی طراحی نشده است — وظیفه آن ارسال بسته‌های کوچک با حداقل مصرف انرژی است. طبق Bluetooth SIG Core Specification 5.4 (2025)، BLE از سرعت تا 2 Mbps با جریان کمتر از 15 mA در حالت فعال پشتیبانی می‌کند.

سلسله‌مراتب GATT: Service، Characteristic، Descriptor

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) را بداند.

Advertising Data و Scan Response

دستگاه‌های BLE بسته‌های تبلیغاتی (advertising packets) برای شناسایی ارسال می‌کنند. Advertising Data شامل نام دستگاه، UUID خدمات، RSSI و Manufacturer Specific Data است. اندازه بسته تبلیغاتی به 31 بایت محدود شده است. برای انتقال داده‌های اضافی، از Scan Response استفاده می‌شود — بسته دومی که دستگاه مرکزی پس از شناسایی درخواست می‌کند.

BLE در iOS: Core Bluetooth، CBCentralManager، CBPeripheral

در 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 فعال‌تر عمل می‌کند.

مثال اسکن BLE در Swift

swift
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 برای هر دستگاه پیدا شده فراخوانی می‌شود.

اتصال و خواندن ویژگی‌ها در Core Bluetooth

پس از کشف یک دستگاه، باید connect و discoverServices را فراخوانی کرد. CBPeripheralDelegate روش‌هایی برای مدیریت هر مرحله ارائه می‌دهد: didDiscoverServices، didDiscoverCharacteristics، didUpdateValueFor. هر روش ناهمگام است — داده‌ها از طریق callbackهای نماینده می‌رسند. RSSI (Received Signal Strength Indicator) سطح سیگنال را نشان می‌دهد: هر چه مقدار به 0 نزدیک‌تر باشد، سیگنال قوی‌تر است.

BLE در Android: BluetoothAdapter، BluetoothGatt، BluetoothLeScanner

در 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 کار کند.

مثال اسکن BLE در Kotlin

kotlin
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: خواندن و اعلان‌ها در Android

پس از ایجاد BluetoothGatt از طریق connectGatt، برنامه discoverServices را فراخوانی می‌کند. BluetoothGattCallback شامل onServicesDiscovered، onCharacteristicRead، onCharacteristicChanged است. برای دریافت اعلان‌ها در مورد تغییرات ویژگی، باید setCharacteristicNotification را فراخوانی کرد. فرآیند نیاز به دقت دارد: هر عملیات GATT ناهمگام است و نتیجه در یک callback جداگانه می‌رسد.

iBeacon، Bonding و Advertising Data در اکوسیستم BLE

iBeacon فناوری اپل برای بیکن‌های BLE است که UUID، Major و Minor را ارسال می‌کنند. دستگاه بیکن یک بسته تبلیغاتی پخش می‌کند و برنامه موبایل بر اساس این داده‌ها مکان و فاصله را تعیین می‌کند. در iOS، iBeacon به صورت بومی از طریق CLLocationManager پشتیبانی می‌شود. در Android، یک کتابخانه شخص ثالث مورد نیاز است (مثلاً AltBeacon یا Android iBeacon Library).

Bonding روش ایجاد یک اتصال امن دائمی بین دستگاه‌های BLE است. پس از Bonding، کلیدهای رمزگذاری ذخیره می‌شوند و دستگاه‌ها در نزدیک شدن مجدد به طور خودکار متصل می‌شوند. در iOS، bonding به طور خودکار توسط سیستم مدیریت می‌شود. در Android — از طریق BluetoothDevice.createBond(). Bonding برای دستگاه‌های پوشیدنی و ردیاب‌های تناسب اندام که نیاز به اتصال مجدد سریع دارند، مهم است.

بسته‌های تبلیغاتی و Manufacturer Specific Data

Advertising Data یک مکانیسم کلیدی تشخیص در Bluetooth Low Energy است. تولیدکنندگان دستگاه می‌توانند Manufacturer Specific Data را به بسته تبلیغاتی اضافه کنند تا داده‌های سفارشی را ارسال کنند. فرمت بسته شامل Company Identifier (2 بایت) و داده‌های دلخواه است. در iOS، CBCentralManager آرایه‌ای از UUID خدمات را برای فیلتر کردن می‌پذیرد — این باعث صرفه‌جویی در باتری می‌شود. در Android، ScanFilter بر اساس همان اصل کار می‌کند.

مقایسه iOS و Android برای توسعه BLE

پارامترiOS (Core Bluetooth)Android (BluetoothGatt)
مدیرCBCentralManagerBluetoothLeScanner
اتصالconnect(to:)connectGatt()
خدماتdiscoverServices()discoverServices()
خواندنreadValue(for:)readCharacteristic()
اعلان‌هاsetNotifyValue(_:for:)setCharacteristicNotification()
مجوزهاخودکارBLUETOOTH_SCAN، BLUETOOTH_CONNECT
iBeaconCLLocationManager (بومی)AltBeacon / کتابخانه‌ها

بهینه‌سازی BLE: MTU، Connection Interval و حالت پس‌زمینه

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 و Android

iOS از BLE در حالت پس‌زمینه از طریق Background Modes پشتیبانی می‌کند، اما با محدودیت‌هایی. برنامه در پس‌زمینه اعلان‌هایی از ویژگی‌ها دریافت می‌کند، اما نمی‌تواند به طور فعال اسکن کند. سیستم هنگام تغییر مکان دستگاه، اسکن را مجدداً راه‌اندازی می‌کند. در Android، اسکن پس‌زمینه نیاز به Foreground Service با یک اعلان دائمی دارد. بدون آن، سیستم موبایل هنگام کوچک‌سازی برنامه، فرآیند را می‌کشد.

توصیه‌های عملی بهینه‌سازی

برای عملکرد قابل اعتماد BLE در برنامه‌های موبایل، این قوانین را دنبال کنید. به جای polling از notify استفاده کنید — یک ویژگی با اعلان‌ها در هنگام تغییر داده ارسال می‌کند و باتری را ذخیره می‌کند. MTU بهینه را در ابتدای اتصال تنظیم کنید. هنگام اسکن، دستگاه‌ها را بر اساس UUID خدمات فیلتر کنید. سازگاری پشته BLE را در مدل‌های مختلف بررسی کنید — تولیدکنندگان (Xiaomi، Huawei، Samsung) تغییراتی ایجاد می‌کنند که بر رفتار Bluetooth تأثیر می‌گذارد.

سؤالات متداول

BLE چه تفاوتی با Bluetooth کلاسیک دارد؟

Bluetooth Low Energy (BLE) برای انتقال دوره‌ای بسته‌های کوچک با مصرف انرژی کم بهینه شده است. Bluetooth کلاسیک برای جریان‌های صوتی و انتقال مداوم حجم بالای داده طراحی شده است.

GATT در Bluetooth Low Energy چیست؟

GATT (Generic Attribute Profile) یک پروتکل تبادل داده در BLE است که سلسله‌مراتب Service → Characteristic → Descriptor را تعریف می‌کند. GATT برای خواندن، نوشتن و دریافت اعلان‌ها از دستگاه‌های BLE استفاده می‌شود.

چرا Android برای BLE به مجوز ACCESS_FINE_LOCATION نیاز دارد؟

قبل از Android 12، اسکن BLE می‌توانست برای تعیین مکان استفاده شود، بنابراین Google این مجوزها را ترکیب کرد. از Android 12، مجوز جداگانه BLUETOOTH_SCAN بدون وابستگی به مکان معرفی شده است.

چگونه سرعت انتقال داده BLE را افزایش دهیم؟

MTU را از طریق requestMtu() در Android و maximumWriteValueLength در iOS افزایش دهید. Connection Interval نیز بر سرعت تأثیر می‌گذارد — هر چه کوچک‌تر باشد، انتقال سریع‌تر است. ترکیب بهینه تا 10 برابر بهبود ایجاد می‌کند.

Bonding در BLE چیست؟

Bonding روش ایجاد یک اتصال امن دائمی بین دستگاه‌های BLE است. پس از Bonding، کلیدهای رمزگذاری ذخیره می‌شوند و دستگاه‌ها بدون جستجوی مکرر به طور خودکار متصل می‌شوند.

خلاصه

  • Bluetooth Low Energy — استاندارد ارتباط بی‌سیم برای IoT با حداقل مصرف انرژی و سرعت تا 2 Mbps
  • GATT داده‌ها را در سلسله‌مراتب Service → Characteristic → Descriptor با UUID برای هر عنصر سازماندهی می‌کند
  • Core Bluetooth — فریمورک اپل برای BLE در iOS با CBCentralManager، CBPeripheral و حالت‌های پس‌زمینه
  • BluetoothGatt — API اصلی Android با BluetoothAdapter، BluetoothLeScanner و مجوزهای صریح BLUETOOTH_SCAN
  • iBeacon — فناوری بیکن BLE با پشتیبانی بومی در iOS از طریق CLLocationManager
  • Bonding اتصال مجدد خودکار را پس از ذخیره کلیدهای رمزگذاری امکان‌پذیر می‌کند
  • Bluetooth Low Energy در برنامه‌های موبایل نیاز به در نظر گرفتن MTU، Connection Interval و محدودیت‌های پس‌زمینه پلتفرم دارد

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه