Characteristic واحد بنیادی داده در Bluetooth Low Energy است که از طریق آن Central اطلاعات را روی دستگاه جانبی دریافت یا ثبت میکند. هر Characteristic متعلق به یک سرویس GATT خاص است، دارای UUID منحصربهفرد و مجموعهای از ویژگیها (read, write, notify, indicate) است که عملیات ممکن را تعیین میکنند. طبق Bluetooth Core Specification 5.4 (2023)، Bluetooth SIG بیش از 500 characteristic استاندارد برای دستگاههای پزشکی، تناسب اندام و صنعتی مشخص کرده است. توسعهدهنده characteristicهای سفارشی برای انتقال هرگونه داده کاربر — از خوانش سنسورها تا دستورات کنترل دستگاه — ایجاد میکند.
نکات کلیدی
Characteristic یک ویژگی از پروتکل GATT است که شامل مقدار (value) و فراداده است. در معماری BLE، دادهها مستقیماً بین دستگاهها منتقل نمیشوند، بلکه از طریق خواندن و نوشتن مقادیر characteristicهای سرویس منتقل میشوند. اگر سرویس یک پوشه باشد، Characteristic یک فایل درون آن پوشه است.
هر Characteristic از سه مؤلفه تشکیل شده است: اعلان (declaration)، مقدار (value) و توصیفگرها (descriptors). اعلان شامل UUID characteristic و ویژگیهای آن است. مقدار، دادهای است که بین Central و Peripheral منتقل میشود. توصیفگرها پیکربندی اضافی را فراهم میکنند.
طبق Bluetooth Core Specification 5.4 (2023)، تمام تبادلات داده در BLE از طریق عملیات روی characteristicها انجام میشود. حتی پروفایلهای استاندارد مانند Heart Rate Profile یا Battery Service بر روی مجموعهای از characteristicها با UUIDهای از پیش تعریفشده ساخته شدهاند. این امر سازگاری دستگاههای تولیدکنندگان مختلف را بدون پیکربندی قبلی تضمین میکند.
برای توسعهدهنده مهم است بداند: هر Characteristic میتواند از ترکیبات مختلفی از ویژگیها پشتیبانی کند. یک characteristic ممکن است فقط خواندنی باشد، دیگری فقط نوشتنی و سومی برای اعلانها. انتخاب صحیح ویژگیها سناریوی استفاده و مصرف انرژی دستگاه را تعیین میکند.
ویژگیها (properties) مشخص میکنند که چه عملیاتی روی characteristic مجاز است. این یک ماسک بایتی است که هر بیت یک عملیات خاص را فعال یا غیرفعال میکند. در زیر ویژگیهای اصلی فهرست شدهاند.
| ویژگی | بیت | توضیح | کاربرد معمول |
|---|---|---|---|
| Read | 0x02 | Central میتواند مقدار فعلی را بخواند | وضعیت، سطح باتری، پیکربندی |
| Write | 0x08 | Central میتواند مقدار جدید بنویسد | دستورات کنترلی، تنظیمات |
| Notify | 0x10 | Peripheral مقدار را بدون تأیید ارسال میکند | دادههای جریانی (نبض، دما) |
| Indicate | 0x20 | Peripheral مقدار را با تأیید ارسال میکند | دادههای بحرانی (هشدارها، وضعیتها) |
| Write Without Response | 0x04 | نوشتن بدون انتظار تأیید از سرور | انتقال فرمان با سرعت بالا |
مجوزها (permissions) سطح دسترسی در سطح سرور GATT هستند. برخلاف ویژگیها که در اعلان characteristic اعلام میشوند، مجوزها در هر عملیات بررسی میشوند. آنها میتوانند شامل الزامات رمزنگاری و احراز هویت باشند.
Bluetooth SIG بیش از ۵۰۰ characteristic استاندارد را مشخص کرده است که اکثر سناریوهای رایج استفاده از BLE را پوشش میدهند. استفاده از UUIDهای استاندارد تضمین میکند که هر دستگاه گیرنده دادهها را بدون پیکربندی قبلی به درستی تفسیر کند.
در زیر پرکاربردترین characteristicهای استاندارد آورده شده است:
| UUID | نام | نوع داده | سرویس |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (۰–۱۰۰%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + پرچمها | Heart Rate |
| 0x2A6E | Temperature | int16 (۰٫۰۱°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (۰٫۰۱%) | Environmental Sensing |
| 0x2A00 | Device Name | UTF-8 string | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
اگر یک characteristic استاندارد موجود وظیفه شما را پوشش میدهد — از آن استفاده کنید. این کار صدور گواهی Bluetooth را سادهتر کرده و سازگاری با اکوسیستم را افزایش میدهد. characteristicهای سفارشی را فقط برای دادههای منحصربهفردی که در رجیستری SIG وجود ندارند ایجاد کنید.
ایجاد characteristic در سمت Peripheral — دستگاهی که دادهها را ارائه میدهد — انجام میشود. بیایید پیادهسازی را در iOS (Swift) و Android (Java) بررسی کنیم.
Core Bluetooth کلاس CBMutableCharacteristic را برای ایجاد characteristic با مشخص کردن UUID، ویژگیها و مقدار اولیه فراهم میکند.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // characteristic سطح باتری
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// بهروزرسانی مقدار در هنگام تغییر
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
در Android، characteristic از طریق BluetoothGattCharacteristic با مشخص کردن UUID، ویژگیها و مجوزها ایجاد میشود.
import android.bluetooth.*;
UUID charUuid = UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB");
BluetoothGattCharacteristic characteristic =
new BluetoothGattCharacteristic(
charUuid,
BluetoothGattCharacteristic.PROPERTY_READ
| BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ
);
// تنظیم مقدار
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
عملیات روی Characteristic به سه نوع تقسیم میشوند: خواندن (read)، نوشتن (write) و اعلانها (notify/indicate). انتخاب عملیات به سناریو بستگی دارد: دادههای درخواستی خوانده میشوند، دستورات نوشته میشوند، دادههای جریانی از طریق اعلانها دریافت میشوند.
Read — Central درخواست خواندن مقدار characteristic را ارسال میکند. Peripheral با مقدار فعلی پاسخ میدهد. عملیات همزمان است و از هر طرف نیاز به درخواست صریح دارد. برای دادههایی که به ندرت تغییر میکنند استفاده میشود: نسخه فریمور، شماره سریال، تنظیمات.
Write — Central دادهها را به Peripheral ارسال میکند. دو حالت وجود دارد: Write with Response (تأیید از Peripheral) و Write Without Response (بدون تأیید). Write with Response تحویل را تضمین میکند — Peripheral پس از نوشتن تأییدیه ارسال میکند. Write Without Response سریعتر است اما تحویل را تضمین نمیکند.
Notify و Indicate — Peripheral ارسال داده به Central را آغاز میکند. در Notify دادهها بدون تأیید ارسال میشوند — اگر Central فرصت دریافت بسته را نداشته باشد، از دست میرود. در Indicate Central یک تأیید (در سطح PDU) ارسال میکند که تحویل را تضمین میکند. Indicate کندتر اما قابلاعتمادتر است. برای اشتراک در اعلانها، Central مقدار 0x0001 را در CCCD (Client Characteristic Configuration Descriptor) مینویسد.
MTU (Maximum Transmission Unit) حداکثر اندازه یک بسته داده BLE را تعیین میکند. به طور پیشفرض MTU ۲۳ بایت است که ۳ بایت آن هدر است — بار مفید (ATT payload) ۲۰ بایت است. این برای اکثر دادههای سنسوری کافی است، اما برای انتقال فایلها یا پیکربندیهای بزرگ کافی نیست.
Bluetooth Core Specification 5.4 از توافق MTU (MTU negotiation) پشتیبانی میکند — Central و Peripheral میتوانند بر روی اندازه بسته بزرگتر تا ۵۱۷ بایت توافق کنند. فرآیند به این صورت است: Central یک درخواست MTU Exchange با پیشنهاد MTU خود ارسال میکند؛ Peripheral با MTU خود پاسخ میدهد؛ از کوچکترین مقدار استفاده میشود.
// iOS در اتصال MTU درخواست میکند
// حداکثر MTU در iOS ۱۸۵ بایت است
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// درخواست MTU برای Peripheral خاص
peripheral.maximumWriteValueLength(for: .withResponse)
}
طبق Bluetooth SIG (2023)، افزایش MTU از ۲۳ به ۱۸۵ بایت سربار انتقال داده را تا ۸۰٪ کاهش میدهد به دلیل کاهش تعداد بستهها. برای برنامههایی که خوانشها را با فرکانس بالا منتقل میکنند (مانند نوار قلب یا شتابسنج)، افزایش MTU برای پایداری جریان حیاتی است.
سؤالات متداول
مشخصات BLE تعداد characteristicهای یک سرویس را محدود نمیکند. در عمل، محدودیت توسط حافظه موجود سرور GATT و الزامات عملکرد تعیین میشود. برای دستگاههای تعبیهشده، بیش از ۱۰–۱۵ characteristic در هر سرویس توصیه نمیشود.
Notify دادهها را بدون تأیید ارسال میکند — بسته ممکن است بدون اطلاع فرستنده از دست برود. Indicate نیاز به تأیید (ACK) در سطح پروتکل دارد که تحویل را تضمین میکند. Indicate کندتر اما قابلاعتمادتر است. برای دادههای بحرانی (هشدارها، دستورات) از Indicate استفاده کنید.
بله، یک characteristic میتواند ترکیبی از ویژگیها داشته باشد. به عنوان مثال، یک characteristic تنظیمات میتواند از Read (خواندن مقدار فعلی) و Write (تغییر تنظیمات) پشتیبانی کند. ویژگیها را مطابق سناریوی استفاده خود ترکیب کنید.
از توافق MTU برای افزایش اندازه بسته به ۱۸۵–۵۱۷ بایت استفاده کنید. اگر دادهها هنوز بزرگتر هستند — تکهتکهسازی را در سطح برنامه پیادهسازی کنید: دادهها را به چند درخواست متوالی با کنترل یکپارچگی تقسیم کنید.
اگر وظیفه شما توسط یک characteristic استاندارد پوشش داده میشود — از UUID رجیستری Bluetooth SIG استفاده کنید. این کار صدور گواهی را سادهتر کرده و سازگاری با اکوسیستم را تضمین میکند. UUIDهای سفارشی را فقط برای دادههای منحصربهفرد تولیدکنندگان شخص ثالث ایجاد کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.