Characteristic: چیست، انواع داده و خواندن مقادیر

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

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 BLE است که دارای UUID، ویژگی‌ها و مقدار از نوع مشخص است.
  • ویژگی‌ها عملیات موجود را تعیین می‌کنند: read (خواندن)، write (نوشتن)، notify (اعلان)، indicate (اعلان تأییدشده).
  • characteristicهای استاندارد (battery level, heart rate) دارای UUID 16 بیتی از رجیستری Bluetooth SIG هستند.
  • هر Characteristic می‌تواند توصیف‌گرهایی داشته باشد — فراداده‌هایی که واحدهای اندازه‌گیری یا پیکربندی اعلان‌ها را توصیف می‌کنند.
  • حداکثر اندازه یک بسته داده از طریق Characteristic 20 بایت (MTU 23) یا تا ۲۴۴ بایت با افزایش MTU است.

Characteristic در BLE چیست؟

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 ممکن است فقط خواندنی باشد، دیگری فقط نوشتنی و سومی برای اعلان‌ها. انتخاب صحیح ویژگی‌ها سناریوی استفاده و مصرف انرژی دستگاه را تعیین می‌کند.

ویژگی‌ها و مجوزهای Characteristic

ویژگی‌ها (properties) مشخص می‌کنند که چه عملیاتی روی characteristic مجاز است. این یک ماسک بایتی است که هر بیت یک عملیات خاص را فعال یا غیرفعال می‌کند. در زیر ویژگی‌های اصلی فهرست شده‌اند.

ویژگیبیتتوضیحکاربرد معمول
Read0x02Central می‌تواند مقدار فعلی را بخواندوضعیت، سطح باتری، پیکربندی
Write0x08Central می‌تواند مقدار جدید بنویسددستورات کنترلی، تنظیمات
Notify0x10Peripheral مقدار را بدون تأیید ارسال می‌کندداده‌های جریانی (نبض، دما)
Indicate0x20Peripheral مقدار را با تأیید ارسال می‌کندداده‌های بحرانی (هشدارها، وضعیت‌ها)
Write Without Response0x04نوشتن بدون انتظار تأیید از سرورانتقال فرمان با سرعت بالا

مجوزها (permissions) سطح دسترسی در سطح سرور GATT هستند. برخلاف ویژگی‌ها که در اعلان characteristic اعلام می‌شوند، مجوزها در هر عملیات بررسی می‌شوند. آنها می‌توانند شامل الزامات رمزنگاری و احراز هویت باشند.

characteristicهای استاندارد Bluetooth SIG

Bluetooth SIG بیش از ۵۰۰ characteristic استاندارد را مشخص کرده است که اکثر سناریوهای رایج استفاده از BLE را پوشش می‌دهند. استفاده از UUIDهای استاندارد تضمین می‌کند که هر دستگاه گیرنده داده‌ها را بدون پیکربندی قبلی به درستی تفسیر کند.

در زیر پرکاربردترین characteristicهای استاندارد آورده شده است:

UUIDنامنوع دادهسرویس
0x2A19Battery Leveluint8 (۰–۱۰۰%)Battery Service
0x2A37Heart Rate Measurementuint8 + پرچم‌هاHeart Rate
0x2A6ETemperatureint16 (۰٫۰۱°C)Environmental Sensing
0x2A6FHumidityuint16 (۰٫۰۱%)Environmental Sensing
0x2A00Device NameUTF-8 stringGeneric Access
0x2A01Appearanceuint16Generic Access

اگر یک characteristic استاندارد موجود وظیفه شما را پوشش می‌دهد — از آن استفاده کنید. این کار صدور گواهی Bluetooth را ساده‌تر کرده و سازگاری با اکوسیستم را افزایش می‌دهد. characteristicهای سفارشی را فقط برای داده‌های منحصربه‌فردی که در رجیستری SIG وجود ندارند ایجاد کنید.

ایجاد Characteristic در iOS و Android

ایجاد characteristic در سمت Peripheral — دستگاهی که داده‌ها را ارائه می‌دهد — انجام می‌شود. بیایید پیاده‌سازی را در iOS (Swift) و Android (Java) بررسی کنیم.

iOS: CBMutableCharacteristic

Core Bluetooth کلاس CBMutableCharacteristic را برای ایجاد characteristic با مشخص کردن UUID، ویژگی‌ها و مقدار اولیه فراهم می‌کند.

swift
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: BluetoothGattCharacteristic

در Android، characteristic از طریق BluetoothGattCharacteristic با مشخص کردن UUID، ویژگی‌ها و مجوزها ایجاد می‌شود.

java
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 و اندازه داده‌های منتقل‌شده

MTU (Maximum Transmission Unit) حداکثر اندازه یک بسته داده BLE را تعیین می‌کند. به طور پیش‌فرض MTU ۲۳ بایت است که ۳ بایت آن هدر است — بار مفید (ATT payload) ۲۰ بایت است. این برای اکثر داده‌های سنسوری کافی است، اما برای انتقال فایل‌ها یا پیکربندی‌های بزرگ کافی نیست.

Bluetooth Core Specification 5.4 از توافق MTU (MTU negotiation) پشتیبانی می‌کند — Central و Peripheral می‌توانند بر روی اندازه بسته بزرگتر تا ۵۱۷ بایت توافق کنند. فرآیند به این صورت است: Central یک درخواست MTU Exchange با پیشنهاد MTU خود ارسال می‌کند؛ Peripheral با MTU خود پاسخ می‌دهد؛ از کوچک‌ترین مقدار استفاده می‌شود.

swift
// iOS در اتصال MTU درخواست می‌کند
// حداکثر MTU در iOS ۱۸۵ بایت است
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverServices error: Error?
) {
    // درخواست MTU برای Peripheral خاص
    peripheral.maximumWriteValueLength(for: .withResponse)
}

طبق Bluetooth SIG (2023)، افزایش MTU از ۲۳ به ۱۸۵ بایت سربار انتقال داده را تا ۸۰٪ کاهش می‌دهد به دلیل کاهش تعداد بسته‌ها. برای برنامه‌هایی که خوانش‌ها را با فرکانس بالا منتقل می‌کنند (مانند نوار قلب یا شتاب‌سنج)، افزایش MTU برای پایداری جریان حیاتی است.

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

یک سرویس چند characteristic می‌تواند داشته باشد؟

مشخصات BLE تعداد characteristicهای یک سرویس را محدود نمی‌کند. در عمل، محدودیت توسط حافظه موجود سرور GATT و الزامات عملکرد تعیین می‌شود. برای دستگاه‌های تعبیه‌شده، بیش از ۱۰–۱۵ characteristic در هر سرویس توصیه نمی‌شود.

تفاوت بین Notify و Indicate چیست؟

Notify داده‌ها را بدون تأیید ارسال می‌کند — بسته ممکن است بدون اطلاع فرستنده از دست برود. Indicate نیاز به تأیید (ACK) در سطح پروتکل دارد که تحویل را تضمین می‌کند. Indicate کندتر اما قابل‌اعتمادتر است. برای داده‌های بحرانی (هشدارها، دستورات) از Indicate استفاده کنید.

آیا یک characteristic می‌تواند همزمان Read و Write داشته باشد؟

بله، یک characteristic می‌تواند ترکیبی از ویژگی‌ها داشته باشد. به عنوان مثال، یک characteristic تنظیمات می‌تواند از Read (خواندن مقدار فعلی) و Write (تغییر تنظیمات) پشتیبانی کند. ویژگی‌ها را مطابق سناریوی استفاده خود ترکیب کنید.

چگونه داده‌های بزرگتر از ۲۰ بایت را از طریق BLE منتقل کنیم؟

از توافق MTU برای افزایش اندازه بسته به ۱۸۵–۵۱۷ بایت استفاده کنید. اگر داده‌ها هنوز بزرگ‌تر هستند — تکه‌تکه‌سازی را در سطح برنامه پیاده‌سازی کنید: داده‌ها را به چند درخواست متوالی با کنترل یکپارچگی تقسیم کنید.

آیا باید از UUIDهای استاندارد characteristic استفاده کنم؟

اگر وظیفه شما توسط یک characteristic استاندارد پوشش داده می‌شود — از UUID رجیستری Bluetooth SIG استفاده کنید. این کار صدور گواهی را ساده‌تر کرده و سازگاری با اکوسیستم را تضمین می‌کند. UUIDهای سفارشی را فقط برای داده‌های منحصربه‌فرد تولیدکنندگان شخص ثالث ایجاد کنید.

خلاصه

  • Characteristic مکانیسم اصلی انتقال داده در BLE است که یک مقدار با UUID، ویژگی‌ها و توصیف‌گرها را نشان می‌دهد.
  • ویژگی‌ها (Read, Write, Notify, Indicate) تعیین می‌کنند که چه عملیاتی روی characteristic در دسترس است.
  • Bluetooth SIG بیش از ۵۰۰ characteristic استاندارد را مشخص کرده است — برای سازگاری دستگاه‌ها از آنها استفاده کنید.
  • ایجاد characteristic در سمت Peripheral از طریق Core Bluetooth (iOS) یا BluetoothGattCharacteristic (Android) انجام می‌شود.
  • اعلان‌ها (Notify/Indicate) برای داده‌های جریانی کارآمدتر از نظرسنجی منظم هستند — آنها به درخواست‌های مداوم از Central نیاز ندارند.
  • اندازه یک بسته توسط MTU (۲۰ بایت پیش‌فرض) محدود می‌شود، اما می‌تواند از طریق MTU Exchange به ۵۱۷ بایت افزایش یابد.
  • انتخاب صحیح ویژگی‌ها و UUID characteristic تعیین‌کننده مصرف انرژی، قابلیت اطمینان و عملکرد اتصال BLE است.

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

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

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

همچنین بخوانید