یکی از عجیب ترین اتفاقاتی که موقع کار با ماژول های BLE ممکنه پیش بیاد اینه که گوشی به ماژول وصل میشه و اطلاعات هم بدون مشکل رد و بدل میشن ولی وقتی وارد تنظیمات بلوتوث گوشی میشیم هیچ خبری از اسم ماژول توی لیست دستگاه های Pair شده نیست!
اینجاست که آدم با خودش میگه مگه میشه دوتا دستگاه با هم ارتباط داشته باشن ولی Pair نشده باشن؟ ????
اتفاقا میشه و این موضوع در BLE کاملا طبیعیه.
داستان از تفاوت BLE با بلوتوث کلاسیک شروع میشه
ماژول CC2541 از Bluetooth Low Energy نسخه 4.0 استفاده میکنه.
این تراشه برخلاف ماژول هایی مثل HC-05 که با بلوتوث کلاسیک کار میکنن برای ارتباط کم مصرف طراحی شده.
توی بلوتوث کلاسیک معمولا وقتی گوشی رو به یه ماژول سریال مثل HC-05 وصل میکنیم اول عملیات Pairing انجام میشه و دستگاه توی فهرست دستگاه های جفت شده قرار میگیره.
اما توی BLE برای برقراری ارتباط و تبادل اطلاعات همیشه نیازی به Pairing نداریم.
پس گوشی چطوری بدون Pair شدن اطلاعات میفرسته؟
برای فهمیدن ماجرا باید 3 تا مفهوم رو از هم جدا کنیم.
اولی Connection هست که یعنی گوشی و ماژول یه ارتباط BLE با هم برقرار کردن.
دومی Pairing هست که طی اون دو دستگاه درباره روش امنیتی توافق میکنن و در صورت نیاز کلیدهای رمزنگاری ارتباط رو ایجاد میکنن.
سومی Bonding هست که باعث میشه اطلاعات امنیتی و کلیدهای لازم برای ارتباط های بعدی ذخیره بشن.
نکته جالب اینجاست که اتصال GATT و تبادل اطلاعات از طریق Characteristic هایی که نیاز به احراز هویت یا رمزنگاری ندارن میتونه بدون Pairing و Bonding انجام بشه.
یعنی گوشی میتونه به CC2541 متصل بشه و از طریق Read و Write یا Notification اطلاعات بفرسته و دریافت کنه بدون اینکه دستگاه توی فهرست Pair شده ها ثبت بشه.
پس این رفتار لزوما نشونه خرابی ماژول نیست.
حالا چرا بعضی وقت ها اسم ماژول توی تنظیمات بلوتوث هم دیده نمیشه؟
اینجا باید یه تفاوت دیگه رو هم در نظر بگیریم.
گوشی های اندرویدی و آیفون برای پیدا کردن دستگاه های BLE از مکانیزم اسکن مخصوص این فناوری استفاده میکنن.
برنامه هایی مثل nRF Connect میتونن پیام های Advertising ماژول رو اسکن کنن و سرویس ها و Characteristic های اون رو نمایش بدن.
ولی صفحه تنظیمات بلوتوث گوشی قرار نیست همیشه تمام دستگاه های BLE اطراف رو مثل ماژول های بلوتوث کلاسیک نشون بده.
بسته به سیستم عامل و نوع دستگاه ممکنه ماژول توی برنامه اسکن BLE دیده بشه ولی توی لیست دستگاه های جفت شده وجود نداشته باشه.
حتی در بعضی شرایط وقتی برنامه به ماژول وصل شده ممکنه خود ماژول دیگه Advertising قابل اتصال نفرسته و از لیست اسکن هم ناپدید بشه.
این موضوع رو نباید با قطع شدن ارتباط اشتباه بگیریم.
چطوری بفهمیم ارتباط واقعا برقرار شده؟
برای بررسی بهتر میشه از برنامه nRF Connect استفاده کرد.
اول ماژول رو روشن میکنیم و با گوشی اسکن BLE انجام میدیم.
اگه ماژول Advertising داشته باشه و قابل شناسایی باشه باید بتونیم اون رو داخل برنامه پیدا کنیم.
بعد از اتصال میتونیم سرویس های GATT رو بررسی کنیم و ببینیم کدوم Characteristic قابلیت Read یا Write یا Notification داره.
اگه اطلاعات از طریق همین بخش ها رد و بدل میشن یعنی ارتباط BLE برقرار شده و لازم نیست حتما اسم ماژول توی فهرست Pair شده های گوشی وجود داشته باشه.
برای گوشی اندرویدی یه روش دقیق تر هم هست.
میشه داخل برنامه وضعیت Bonding رو با دستور getBondState بررسی کرد.
اگه نتیجه BOND_NONE باشه یعنی دستگاه Bond نشده و کلید امنیتی ذخیره شده مشترک نداره.
اگه نتیجه BOND_BONDED باشه یعنی عملیات Bonding با موفقیت انجام شده.
جالب اینجاست که ممکنه ارتباط GATT برقرار باشه ولی وضعیت همچنان BOND_NONE باقی بمونه.
اگه بخوایم CC2541 حتما Pair بشه باید چیکار کنیم؟
اینجا همه چیز به فریمور ماژول بستگی داره.
خود تراشه CC2541 از امکانات امنیتی BLE و مکانیزم Pairing و Bonding پشتیبانی میکنه ولی اینکه ماژول آماده ما این قابلیت ها رو چطور پیاده سازی کرده باشه به برنامه داخلی اون مربوط میشه.
مثلا در فریمورهای مبتنی بر استک Texas Instruments تنظیماتی برای فعال کردن Bonding و تعیین روش Pairing وجود داره.
اما نباید فرض کنیم تمام بردهای CC2541 موجود در بازار دقیقا از دستورات AT ماژول HM-10 پشتیبانی میکنن.
برای همین اگه هدف پروژه ذخیره اطلاعات جفت سازی یا برقراری ارتباط رمزنگاری شده باشه باید اول فریمور ماژول شناسایی بشه و مشخص بشه قابلیت Bonding و تنظیمات امنیتی اون در دسترس هست یا نه.
در ضمن Pair شدن به تنهایی به معنی امن بودن کامل تبادل اطلاعات نیست. سطح امنیت به روش احراز هویت و تنظیمات رمزنگاری هم بستگی داره.
یه نکته مهم برای پروژه های اندروید و iOS
اگه داریم یه اپلیکیشن اختصاصی برای ارتباط با CC2541 مینویسیم بهتره از API مخصوص BLE استفاده کنیم.
در اندروید این کار معمولا با BluetoothGatt انجام میشه و در iOS از CoreBluetooth استفاده میکنیم.
برای پیدا کردن و اتصال به ماژول هم نباید صرفا به لیست دستگاه های Pair شده تکیه کنیم.
مخصوصا در پروژه هایی که فقط قراره اطلاعات سنسور دریافت بشه یا چند فرمان کنترلی ارسال کنیم ممکنه اصلا نیازی به Bonding نداشته باشیم.
البته اگه اطلاعات حساس باشن یا بخوایم فقط گوشی های مجاز به دستگاه دسترسی داشته باشن باید امنیت ارتباط رو جداگانه طراحی کنیم.



دیدگاه