Central — دستگاهی در معماری Bluetooth Low Energy است که اسکن را آغاز میکند، اتصال برقرار میکند و تبادل داده با دستگاههای جانبی را مدیریت میکند. در زمینه توسعه موبایل، Central یک گوشی هوشمند یا تبلت iOS یا Android است که به سنسورهای BLE، ردیابهای تناسب اندام و اکسسوریهای هوشمند متصل میشود. طبق Bluetooth Core Specification 5.4 (2023)، Central میتواند همزمان تا 7 اتصال به Peripheralهای مختلف پشتیبانی کند، اگرچه محدودیت واقعی به سازنده تراشه و نسخه سیستم عامل بستگی دارد. Core Bluetooth در iOS و android.bluetooth.le در Android API کاملی برای مدیریت نقش Central ارائه میدهند.
نکات اصلی
Central — یک کلاینت GATT در معماری Bluetooth Low Energy است که تمام ارتباطات را آغاز میکند. برخلاف Peripheral که به صورت غیرفعال منتظر اتصال میماند و سرویسهای خود را تبلیغ میکند، Central به طور فعال کانال را اسکن میکند، بستههای تبلیغاتی را شناسایی میکند و اتصال را آغاز میکند.
مدل نامتقارن Central-Peripheral یک ویژگی اساسی BLE است. Central منطق تعامل را مدیریت میکند: تصمیم میگیرد به کدام دستگاه متصل شود، کدام سرویسها را بررسی کند، کدام ویژگیها را بخواند و بنویسد. Peripheral نقش سرور داده را ایفا میکند — سرویسها و ویژگیها را ذخیره میکند، اما اتصال را آغاز نمیکند.
طبق Bluetooth Core Specification 5.4 (2023)، یک دستگاه میتواند همزمان Central و Peripheral باشد (dual role). به عنوان مثال، گوشی هوشمند میتواند برای دستبند تناسب اندام Central و برای گوشی دیگری که فایل ارسال میکند Peripheral باشد. با این حال، کار همزمان در هر دو نقش مصرف انرژی و پیچیدگی مدیریت اتصال را افزایش میدهد.
در اکوسیستم توسعه موبایل، نقش Central رایجترین سناریو است. برنامه روی گوشی هوشمند به دنبال دستگاههای BLE (سنسورها، هدفونها، دستبندها) میگردد، به آنها متصل میشود و داده دریافت میکند. توسعهدهنده از API سیستم عامل برای کار با Central استفاده میکند: CBCentralManager در iOS، BluetoothLeScanner و BluetoothGatt در Android.
اسکن — اولین مرحله کار Central است. دستگاه کانالهای رادیویی BLE (37، 38، 39) را برای شناسایی بستههای تبلیغاتی که Peripheral به صورت دورهای ارسال میکند، گوش میدهد. هر بسته تبلیغاتی شامل نام دستگاه، لیست UUID سرویسها و دادههای کاربر است.
Central میتواند در دو حالت اسکن کار کند: passive scanning (فقط دریافت بستههای تبلیغاتی) و active scanning (ارسال scan request برای دریافت دادههای اضافی از طریق scan response). Passive scanning در انرژی صرفهجویی میکند اما اطلاعات کمتری میدهد. Active scanning امکان دریافت کامل دادههای بسته تبلیغاتی از جمله نام دستگاه و لیست کامل سرویسها را فراهم میکند.
فیلتر کردن بر اساس UUID — یک بهینهسازی مهم است. Central میتواند فقط دستگاههای دارای Service UUID مشخص را اسکن کند و بقیه را نادیده بگیرد. این نه تنها در انرژی صرفهجویی میکند، بلکه منطق برنامه را سادهتر میکند: delegate فقط دستگاههای مرتبط را دریافت میکند.
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
مدیریت اتصالها — وظیفه اصلی Central است. پس از شناسایی Peripheral مناسب، Central اتصال را آغاز میکند. اتصال BLE از طریق فرآیند برقراری اتصال (connection establishment) برقرار میشود که شامل تبادل پارامترها است: connection interval، slave latency و supervision timeout.
Connection interval تعیین میکند که Central و Peripheral پس از اتصال چند وقت یکبار داده تبادل کنند. فاصله میتواند از 7.5 میلیثانیه تا 4 ثانیه باشد. هرچه فاصله کوتاهتر باشد، پهنای باند بیشتر است اما مصرف انرژی نیز بیشتر است. Slave latency به Peripheral اجازه میدهد برای صرفهجویی در انرژی، چند رویداد اتصال را نادیده بگیرد. Supervision timeout — حداکثر زمان بدون پاسخ، پس از آن اتصال قطع شده تلقی میشود.
Central مسئول قطع اتصال پس از اتمام تبادل داده است. دستگاههای BLE معمولاً اتصال را دائمی نگه نمیدارند — Central متصل میشود، داده را دریافت میکند و قطع میکند. این یک الگوی استاندارد برای سنسورهای IoT است: Central اسکن میکند، سنسور دما را پیدا میکند، متصل میشود، مقدار را میخواند و قطع میکند.
| پارامتر | محدوده | هدف | توصیه |
|---|---|---|---|
| Connection Interval | 7.5 ms – 4 s | فرکانس تبادل داده | 30–50 ms برای جریانها، 1–4 s برای دادههای نادر |
| Slave Latency | 0–499 رویداد | نادیده گرفتن رویدادها توسط Peripheral | 4–10 برای صرفهجویی در انرژی سنسور |
| Supervision Timeout | 100 ms – 32 s | مهلت قطع ارتباط | 6–10 ثانیه برای بیشتر سناریوها |
| MTU | 23–517 بایت | اندازه بسته ATT | درخواست حداکثر در زمان اتصال |
Core Bluetooth — فریمورک Apple برای کار با BLE در iOS و macOS است. کلاس CBCentralManager API کاملی برای پیادهسازی نقش Central فراهم میکند: اسکن، اتصال، مدیریت اتصالها. کار با Central در iOS بر اساس مدل delegate است: CBCentralManagerDelegate رویدادهای تغییر وضعیت، شناسایی دستگاهها و نتایج اتصال را دریافت میکند.
مراحل اصلی کار Central در iOS: مقداردهی CBCentralManager، بررسی وضعیت Bluetooth، شروع اسکن، پردازش دستگاههای شناسایی شده از طریق delegate، اتصال به Peripheral انتخاب شده، شناسایی سرویسها و ویژگیها، تبادل داده.
// اتصال به Peripheral شناسایی شده
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// نگه داشتن مرجع peripheral و اتصال
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// اتصال موفق
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS کار BLE در پسزمینه را محدود میکند: در حالت پسزمینه، برنامه فقط با کلیدهای مشخصی در Info.plist میتواند اسکن کند و دستگاههای متصل میتوانند Central را از تغییر داده مطلع کنند. برای برنامههای حیاتی (دستگاههای پزشکی) از Background Modes با کلید bluetooth-central استفاده کنید.
Android API BluetoothLeScanner را برای اسکن دستگاههای BLE و BluetoothGatt را برای مدیریت اتصالها فراهم میکند. از Android 5.0 (API 21)، BluetoothLeScanner جایگزین startLeScan قدیمی شده است. API به مجوزهای BLUETOOTH، BLUETOOTH_ADMIN و ACCESS_FINE_LOCATION (یا ACCESS_BACKGROUND_LOCATION برای Android 10+) نیاز دارد.
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// تنظیم اسکن
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// شروع اسکن
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// اتصال به دستگاه
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
در Android باید محدودیتهای اسکن را در نظر گرفت: از Android 7 (API 24)، اسکن نمیتواند بیش از 5 بار در 30 ثانیه در برنامههایی که از Location استفاده نمیکنند راهاندازی شود. Android 12+ به مجوزهای BLUETOOTH_SCAN، BLUETOOTH_CONNECT و ADVERTISE و همچنین درخواست runtime این مجوزها نیاز دارد.
مصرف انرژی Central به دلیل نیاز به اسکن مداوم کانالهای رادیویی بیشتر از Peripheral است. Central دادهها را از طریق بستههای BLE دریافت میکند، آنها را پردازش میکند، اتصالها را مدیریت میکند و اغلب محاسبات را روی پردازنده برنامه انجام میدهد. طبق Bluetooth SIG، اسکن بسته به حالت از 30 mA تا 100 mA مصرف میکند.
چندین استراتژی صرفهجویی در انرژی برای Central وجود دارد. اسکن بازهای — مؤثرترین روش: Central در پنجرههای کوتاه (scan window) با فواصل طولانی (scan interval) اسکن میکند. به عنوان مثال، با scan window 30 ms و scan interval 1000 ms مصرف انرژی در مقایسه با اسکن مداوم 97٪ کاهش مییابد.
بهینهسازی اضافی — فیلتر کردن بر اساس UUID. Central فقط بستههای تبلیغاتی مرتبط را سریعتر پردازش میکند و بقیه را نادیده میگیرد. این بار پردازنده را کاهش میدهد و عمر باتری دستگاه را افزایش میدهد. همچنین توصیه میشود بلافاصله پس از شناسایی دستگاه مورد نظر اسکن را متوقف کنید و اتصال را بیش از حد لازم نگه ندارید.
سوالات متداول
بله، BLE از dual role پشتیبانی میکند: یک دستگاه میتواند همزمان برای برخی دستگاهها Central و برای برخی دیگر Peripheral باشد. به عنوان مثال، گوشی هوشمند دادهها را از سنسور میخواند (به عنوان Central) و همزمان سرویس خود را (به عنوان Peripheral) برای انتقال داده به دستگاه دیگر تبلیغ میکند.
مشخصات BLE محدودیت 7 اتصال را برای یک Central تعیین میکند. در عمل، محدودیت به سازنده تراشه بستگی دارد: تراشههای Nordic nRF52840 تا 20 اتصال را پشتیبانی میکنند و برخی آداپتورهای Bluetooth ارزانقیمت بیش از 3–4 اتصال را پشتیبانی نمیکنند.
دلایل میتواند متفاوت باشد: سنسور تبلیغ نمیکند (در حالت advertising نیست)، فیلتر UUID بیش از حد سختگیرانه است، بلوتوث در گوشی خاموش است، مجوزهای لازم وجود ندارد (Location در Android) یا سنسور خارج از محدوده است (تا 10 متر در داخل ساختمان توصیه میشود).
نه لزوماً. برای بسیاری از سناریوها از الگوی connect-and-read استفاده میشود: Central اسکن میکند، متصل میشود، دادههای لازم را میخواند و اتصال را قطع میکند. اتصال دائمی فقط برای دادههای جریانی (نبض، نوار قلب) یا کنترل بلادرنگ دستگاه لازم است.
از اسکن بازهای با نسبت scan window 30–50 ms و scan interval 500–1000 ms استفاده کنید. دستگاهها را بر اساس UUID فیلتر کنید تا فقط بستههای تبلیغاتی مرتبط پردازش شوند. بلافاصله پس از شناسایی Peripheral مورد نظر اسکن را متوقف کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.