Characteristic হল Bluetooth Low Energy-তে ডেটার একটি মৌলিক একক, যার মাধ্যমে Central একটি পেরিফেরাল ডিভাইসে তথ্য পড়ে বা লেখে। প্রতিটি Characteristic একটি নির্দিষ্ট GATT সার্ভিসের অন্তর্গত, এর একটি অনন্য UUID এবং বৈশিষ্ট্যের (read, write, notify, indicate) একটি সেট থাকে যা সম্ভাব্য অপারেশনগুলি নির্ধারণ করে। Bluetooth Core Specification 5.4 (2023) অনুসারে, Bluetooth SIG চিকিৎসা, ফিটনেস এবং শিল্প ডিভাইসের জন্য 500টিরও বেশী মানক বৈশিষ্ট্য নির্দিষ্ট করেছে। ডেভেলপাররা সেন্সর রিডিং থেকে ডিভাইস কন্ট্রোল কমান্ড পর্যন্ত যেকোনো ব্যবহারকারী ডেটা প্রেরণের জন্য কাস্টম বৈশিষ্ট্য তৈরি করে।
মূল বিষয়
Characteristic হল GATT প্রোটোকোলের একটি অ্যাট্রিবিউট যা একটি মান (value) এবং মেটাডেটা ধারণ করে। BLE আর্কিটেকচারে, ডেটা সরাসরি ডিভাইসগুলির মধ্যে স্থানান্তরিত হয় না, বরং সার্ভিসের বৈশিষ্ট্যগুলির মান পড়া এবং লেখার মাধ্যমে স্থানান্তরিত হয়। যদি একটি সার্ভিস একটি ফোলডার হয়, তাহলে Characteristic হল সেই ফোলডারের ভিতরে একটি ফাইল।
প্রতিটি Characteristic তিনটি উপাদান নিয়ে গঠিত: ঘোষণা (declaration), মান (value), এবং ডেস্ক্রিপ্টর (descriptors)। ঘোষণায় বৈশিষ্ট্যের UUID এবং এর বৈশিষ্ট্য থাকে। মান হল Central এবং Peripheral-এর মধ্যে স্থানান্তরিত প্রকৃত ডেটা। ডেস্ক্রিপ্টর অতিরিক্ত কনফিগারেশন প্রদান করে।
Bluetooth Core Specification 5.4 (2023) অনুসারে, BLE-তে সমস্ত ডেটা বিনিময় বৈশিষ্ট্যগুলির উপর অপারেশনের মাধ্যমে ঘটে। এমনকি মানক প্রোফাইল যেমন Heart Rate Profile বা Battery Service পূর্বনির্ধারিত UUID সহ বৈশিষ্ট্যগুলির একটি সেটের উপর নির্মিত। এটি পূর্ব কনফিগারেশন ছাড়াই বিভিন্ন নির্মাতার ডিভাইসগুলির সামঞ্জস্য নিশ্চিত করে।
ডেভেলপারদের জন্য বোঝা গুরুত্বপূর্ণ: প্রতিটি Characteristic বিভিন্ন বৈশিষ্ট্যের সংমিশ্রণ সমর্থন করতে পারে। একটি বৈশিষ্ট্য শুধুমাত্র পড়ার জন্য হতে পারে, অন্যটি লেখার জন্য, তৃতীয়টি বিজ্ঞপ্তির জন্য। বৈশিষ্ট্যগুলির সঠিক পছন্দ ব্যবহারের পরিস্থিতি এবং ডিভাইসের শক্তি খরচ নির্ধারণ করে।
একটি বৈশিষ্ট্যের বৈশিষ্ট্য (properties) নির্ধারণ করে যে এটিতে কোন অপারেশনগুলি অনুমোদিত। এটি একটি বাইট মাস্ক যেখানে প্রতিটি বিট একটি নির্দিষ্ট অপারেশন সক্ষম বা নিষ্ক্রিয় করে। নীচে প্রধান বৈশিষ্ট্যগুলি তালিকাভুক্তিত।
| বৈশিষ্ট্য | বিট | বিবরণ | সাধারণ ব্যবহার |
|---|---|---|---|
| Read | 0x02 | Central বর্তমান মান পড়তে পারে | অবস্থা, ব্যাটারি লেভেল, কনফিগারেশন |
| Write | 0x08 | Central একটি নতুন মান লিখতে পারে | নিয়ন্ত্রণ কমান্ড, সেটিংস |
| Notify | 0x10 | Peripheral নিশ্চিতকরণ ছাড়া মান পাঠায় | স্ট্রিমিং ডেটা (নাড়ি, তাপমাত্রা) |
| Indicate | 0x20 | Peripheral নিশ্চিতকরণ সহ মান পাঠায় | গুরুত্বপূর্ণ ডেটা (সতর্কতা, অবস্থা) |
| Write Without Response | 0x04 | সার্ভার থেকে নিশ্চিতকরণের অপেক্ষা না করে লেখা | উচ্চ-গতির কমান্ড প্রেরণ |
অনুমতি (permissions) হল GATT সার্ভার স্তরে অ্যাক্সেসের স্তর। বৈশিষ্ট্যগুলির বিপরীতে, যা বৈশিষ্ট্যের ঘোষণায় ঘোষিত, অনুমতিগুলি প্রতিটি অপারেশনে পরীক্ষা করা হয়। এতে এনক্রিপশন এবং প্রমাণীকরণের প্রয়োজনীয়তা অন্তর্ভুক্ত থাকতে পারে।
Bluetooth SIG 500টিরও বেশী মানক বৈশিষ্ট্য নির্দিষ্ট করেছে যা বেশিরভাগ সাধারণ BLE ব্যবহারের ক্ষেত্র কভার করে। মানক UUID ব্যবহার নিশ্চিত করে যে কোনো প্রাপ্ত ডিভাইস পূর্ব কনফিগারেশন ছাড়াই ডেটা সঠিকভাবে ব্যাখ্যা করে।
এগুলি সবচেয়ে বেশি ব্যবহৃত মানক বৈশিষ্ট্য:
| UUID | নাম | ডেটার ধরণ | সার্ভিস |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + ফ্ল্যাগ | Heart Rate |
| 0x2A6E | Temperature | int16 (0.01°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (0.01%) | Environmental Sensing |
| 0x2A00 | Device Name | UTF-8 স্ট্রিং | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
যদি কোনও বিদ্যমান মানক বৈশিষ্ট্য আপনার কাজ কভার করে, তবে এটি ব্যবহার করুন। এটি Bluetooth সার্টিফিকেশন সহজতর করে এবং ইকোসিস্টেম সামঞ্জস্য উন্নত করে। শুধুমাত্র অনন্য ডেটার জন্য কাস্টম বৈশিষ্ট্য তৈরি করুন যা SIG রেজিস্ট্রিতে নেই।
একটি বৈশিষ্ট্য তৈরি করা Peripheral পক্ষে করা হয় — যে ডিভাইস ডেটা সরবরাহ করে। আসুন iOS (Swift) এবং Android (Java)-এ বাস্তবায়ন দেখি।
Core Bluetooth UUID, বৈশিষ্ট্য এবং প্রাথমিক মান সহ একটি বৈশিষ্ট্য তৈরির জন্য CBMutableCharacteristic ক্লাস সরবরাহ করে।
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // ব্যাটারি লেভেল বৈশিষ্ট্য
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-এ, UUID, বৈশিষ্ট্য এবং অনুমতি সহ BluetoothGattCharacteristic ব্যবহার করে একটি বৈশিষ্ট্য তৈরি করা হয়।
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 বৈশিষ্ট্যের মান পড়ার জন্য একটি অনুরোধ পাঠায়। Peripheral বর্তমান মান দিয়ে উত্তর দেয়। অপারেশনটি সিঙ্ক্রোনাস এবং প্রতিটি পক্ষ থেকে স্পষ্ট অনুরোধ প্রয়োজন। এটি ব্যবহার করা হয় যে ডেটা কম পরিবর্তিত হয়ে থাকে: ফার্মওয়ার সংস্করণ, সিরিয়াল নম্বর, সেটিংস।
Write: Central Peripheral-এ ডেটা পাঠায়। দুটি মোড আছে: Write with Response (Peripheral থেকে নিশ্চিতকরণ) এবং Write Without Response (নিশ্চিতকরণ ছাড়া)0964 Write with Response ডেলিভারি নিশ্চিত করে — Peripheral লেখার পর নিশ্চিতকরণ পাঠায়। Write Without Response দ্রুততর কিন্তু ডেলিভারি নিশ্চিত করে না।
Notify এবং Indicate: Peripheral Central-এ ডেটা প্রেরণ শুরু করে। Notify-তে, ডেটা নিশ্চিতকরণ ছাড়া পাঠানো হয় — যদি Central প্যাকেট গ্রহণ করতে ব্যর্থ হয়, তা হারিয়ে যায়। Indicate-এ, Central নিশ্চিতকরণ (PDU স্তর) পাঠায়, যা ডেলিভারি নিশ্চিত করে। Indicate ধীর কিন্তু আরও নির্ভরযোগ্য। বিজ্ঞপ্তিতে সাবস্ক্রাইব করতে, Central CCCD (Client Characteristic Configuration Descriptor)-এ মান 0x0001 লেখে।
MTU (Maximum Transmission Unit) একটি একক BLE ডেটা প্যাকেটের সর্বোচ্চ আকার নির্ধারণ করে। ডিফল্টভাবে, MTU 23 বাইট, যার মধ্যে 3 বাইট হেডার — পেলোড (ATT payload) 20 বাইটের সমান। এটি বেশিরভাগ সেন্সর ডেটার জন্য যথেষ্ট কিন্তু ফাইল স্থানান্তর বা বড় কনফিগারেশনের জন্য যথেষ্ট নয়।
Bluetooth Core Specification 5.4 MTU আলোচনা (MTU negotiation) সমর্থন করে — Central এবং Peripheral 517 বাইট পর্যন্ত বড় প্যাকেট আকারে একমত হতে পারে। প্রক্রিয়াটি এভাবে কাজ করে: Central তার প্রস্তাবিত MTU সহ MTU Exchange অনুরোধ পাঠায়; Peripheral তার MTU দিয়ে উত্তর দেয়; দুটি মানের মধ্যে ছোটটি ব্যবহৃত হয়।
// iOS সংযোগে MTU অনুরোধ করে
// iOS-এ সর্বোচ্চ MTU 185 বাইট
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// নির্দিষ্ট পেরিফেরালের জন্য MTU অনুরোধ
peripheral.maximumWriteValueLength(for: .withResponse)
}
Bluetooth SIG (2023) অনুসারে, MTU 23 থেকে 185 বাইটে বাড়ানো ডেটা প্রেরণ ওভারহেড 80% পর্যন্ত হ্রাস করে কম প্যাকেটের কারণে। উচ্চ-ফ্রিকোয়েন্সি রিডিং (যেমন, ECG বা অ্যাক্সেলেরোমিটার) প্রেরণকারী অ্যাপ্লিকেশনের জন্য, স্ট্রিম স্থিতিশীলতার জন্য MTU বৃদ্ধি গুরুত্বপূর্ণ।
সচরাচর জিজ্ঞাসা
BLE স্পেসিফিকেশন একটি সার্ভিসে বৈশিষ্ট্যের সংখ্যা সীমাবদ্ধ করে না। ব্যবহারে, সীমা GATT সার্ভার উপলব্ধ মেমরি এবং কর্মক্ষমতা প্রয়োজনীয়তা দ্বারা নির্ধারিত হয়। এম্বেডেড ডিভাইসের জন্য, প্রতি সার্ভিসে 10–15টির বেশী বৈশিষ্ট্য সুপারিশ করা হয় না।
Notify নিশ্চিতকরণ ছাড়া ডেটা পাঠায় — প্যাকেট প্রেরককে জানানো ছাড়াই হারিয়ে যেতে পারে। Indicate-এর প্রোটোকোল স্তরে নিশ্চিতকরণ (ACK) প্রয়োজন, যা ডেলিভারি নিশ্চিত করে। Indicate ধীর কিন্তু আরও নির্ভরযোগ্য। গুরুত্বপূর্ণ ডেটার (সতর্কতা, কমান্ড) জন্য Indicate ব্যবহার করুন।
হ্যাঁ, একটি বৈশিষ্ট্যের বৈশিষ্ট্যের সংমিশ্রণ থাকতে পারে। উদাহরণস্বরূপ, একটি সেটিংস বৈশিষ্ট্য Read (বর্তমান মান পড়া) এবং Write (সেটিং পরিবর্তন) সমর্থন করতে পারে। আপনার ব্যবহারের ক্ষেত্র অনুযায়ী বৈশিষ্ট্যগুলি সংমিশ্রিত করুন।
প্যাকেটের আকার 185–517 বাইটে বাড়াতে MTU আলোচনা ব্যবহার করুন। যদি ডেটা এখনও বড় হয়, তবে অ্যাপ্লিকেশন স্তরে খণ্ডীকরণ বাস্তবায়ন করুন: অখণ্ডতা নিয়ন্ত্রণ সহ ডেটা কয়েকটি অনুক্রমিক অনুরোধে বিভক্ত করুন।
যদি আপনার কাজ একটি মানক বৈশিষ্ট্য দ্বারা কভার করা হয়, তবে Bluetooth SIG রেজিস্ট্রি থেকে UUID ব্যবহার করুন। এটি সার্টিফিকেশন সহজতর করে এবং ইকোসিস্টেম সামঞ্জস্য নিশ্চিত করে। শুধুমাত্র অনন্য তৃতীয়-পক্ষের ডেটার জন্য কাস্টম UUID তৈরি করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন