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 ميجابت/ثانية باستهلاك تيار أقل من 15 مللي أمبير في الوضع النشط.
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. كل طريقة غير متزامنة — تصل البيانات عبر callbacks التفويض. RSSI (Received Signal Strength Indicator) يظهر مستوى الإشارة: كلما اقتربت القيمة من 0، كانت الإشارة أقوى.
على Android، يتم تنفيذ Bluetooth Low Energy عبر حزمة android.bluetooth. BluetoothAdapter هو نقطة الدخول لجميع عمليات BLE. BluetoothLeScanner يبدأ المسح مع callbacks من نوع 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 هي تقنية Apple لمنارات 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، يُستخدم requestMtu() لزيادة MTU.
Connection Interval هو التردد الذي يتحقق به الجهاز المركزي من الجهاز الطرفي. كلما كان الفاصل أقصر، زادت سرعة النقل، ولكن أيضًا زاد استهلاك الطاقة. القيم النموذجية تتراوح من 7.5 مللي ثانية إلى 4 ثوانٍ. لأجهزة تتبع اللياقة البدنية، 100 مللي ثانية كافية؛ للصوت — 7.5 مللي ثانية. BLE في تطوير التطبيقات المحمولة يتطلب توازنًا بين سرعة النقل وعمر بطارية الجهاز.
iOS يدعم BLE في الوضع الخلفي عبر Background Modes، لكن مع قيود. التطبيق في الخلفية يتلقى إشعارات من الخصائص، لكنه لا يستطيع المسح بنشاط. يعيد النظام تشغيل المسح عند تغيير موقع الجهاز. على Android، المسح الخلفي يتطلب Foreground Service مع إشعار دائم. بدونه، سيقتل النظام المحمول العملية عند تصغير التطبيق.
لتشغيل BLE موثوق في التطبيقات المحمولة، اتبع هذه القواعد. استخدم notify بدلاً من polling — خاصية مع الإشعارات ترسل البيانات عند التغيير، مما يوفر البطارية. حدد 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.