وبلاگ - مطالب آموزشی

6
500
ساخت یک بلوتوث اسکنر با کمک Bluetooth API اندروید

ساخت یک بلوتوث اسکنر با کمک Bluetooth API اندروید

بلوتوث یکی از تکنولوژی های محبوب در گوشی های موبایل است و امکان انتقال اطلاعات بین گوشی های نزدیک به هم را میسر می سازد. هر گوشی مدرن دارای قابلیت بلوتوث است و چنانچه تمایل به ساخت یک رابط اپلیکیشن با کمک یک بلوتوث فعال داشته باشید لازم است از Bluetooth API اندروید استفاده کنید. در این مطلب آموزشی ما یک اپلیکیشن مشابه اپلیکیشن بلوتوث در تنظیمات اندروید می سازیم که دارای امکاناتی به شرح زیر می باشد.

– فعال سازی بلوتوث در یک گوشی.

– نمایش یک فهرست از گوشی های جفت شده.

– جستجو و فهرست کردن گوشی های بلوتوثی که در آن نزدیکی قرار دارند.

در این مطلب مقدماتی از چگونگی برقراری ارتباط و ارسال اطلاعات به گوشی بلوتوث دیگر شرح داده می شود. برای شروع کار باید یک پروژه بسازید، یک نمونه از آن را می توانید از GitHub دانلود کنید. اسکرین شات زیر یک نمای کلی از پروژه را نمایش می دهد. چنانچه با مشکلی روبه رو شدید می توانید به پروژه کامل شده در GitHub مراجعه کنید.

blog_16235_1

1. فعال سازی بلوتوث

پیش از فعال سازی بلوتوث در یک گوشی اندروید باید مجوزهای لازم برای انجام این کار را دریافت کنید، این کار در فایل منیفست اپلیکیشن صورت می پذیرد. مجوز BLUETOOTH به اپلیکیشن امکان برقراری اتصال، قطع آن و انتقال اطلاعات بین گوشی های دیگر را می دهد. مجوز BLUETOOTH_ADMIN اپلیکیشن را قادر به یافتن گوشی ها یا دستگاه های بلوتوث جدید می کند و تنظیمات بلوتوث گوشی را تغییر می دهد.

ما از آداپتور بلوتوث برای ارتباط با بلوتوث استفاده می کنیم. آداپتور در کلاس ListActivity معرفی شده است، چنانچه آداپتور null باشد به این معناست که گوشی از بلوتوث پشتیبانی نمی کند و اپلیکیشن در این گوشی قادر به کار نیست. این شرایط با نمایش یک پیغام به کاربر و خروج از اپلیکیشن منجر می شود.

چنانچه بلوتوث در گوشی در دسترس باشد باید آن را فعال سازی کنیم، برای این منظور از bluetoothAdabter.ACTION_REQUEST_ENABLE استفاده می کنیم. این کار یک دیالوگ را به کاربر نمایش می دهد و از او درخواست فعال سازی بلوتوث بر روی گوشی را می کند. REQUSET_BLUETOOTH یک مقدار صحیح ثابت است که برای شناسایی درخواست اکتیویتی نشانده می شود.

2. بدست آوردن یک فهرست از دستگاه های جفت شده

در این مرحله ما قادر به اسکن دستگاه های جفت شده و نمایش آنها در یک لیست می باشیم، وضعیت بلوتوث یک دستگاه به سه صورت زیر می باشد:

– ناشناس

– جفت شده

– متصل

درک تفاوت بین یک گوشی جفت شده و متصل اهمیت دارد، گوشی های جفت شده از حضور یکدیگر آگاهی دارند و یک link key را به اشتراک می گذارند که برای احراز هویت و برقراری اتصال استفاده می شود، در صورت برقراری یک اتصال رمزگذاری شده گوشی ها جفت می شوند.

گوشی های متصل دارای یک کانال RFCOMM هستند که آنها را قادر به ارسال و دریافت اطلاعات می کند. یک گوشی ممکن است دارای تعدادی گوشی جفت شده باشد اما در یک زمان خاص امکان اتصال به تنها یکی از آنها را دارد.

دستگاه های بلوتوث با آبجکت BluetoothDevice نمایش داده می شوند. یک فهرست از گوشی های جفت شده با متد ()getBondedDevices قابل دسترسی است که یک مجموعه از آبجکت های BluetoothDevice را برمی گرداند. فراخوانی متد getBondedDevices در متد ()onCreate متعلق به DeviceListFragment صورت می پذیرد.

ار متدهای ()getName و ()getAddress برای دریافت اطلاعات بیشتر درباره دستگاه بلوتوث استفاده می شود، متد ()getName یک شناسنده عمومی از گوشی را باز می گرداند، در حالی که مقدار بازگشتی متد ()getAddress مک آدرس گوشی است، یک شناسنده منحصر به فرد برای شناسایی گوشی.

حال که فهرستی از دستگاه های جفت شده در اختیار ما قرار گرفته است یک آبجکت DeviceItem برای هر آبجکت BluetoothDevice می سازیم و پس از آن هر آبجکت DeviceItem را به آرایه ای به نام deviceItemList می افزاییم. این آرایه به منظور نمایش یک فهرست از دستگاه های جفت شده در اپلیکیشن به کار می رود. کد مربوط به نمایش یک فهرست از آبجکت های DeviceItem در پروژه اولیه در دسترس می باشد.

3. کشف دستگاه های بلوتوثی که در اطراف قرار دارند

گام بعد کشف دستگاه هایی است که هنوز جفت نشده اند، یعنی همان دستگاه های ناشناس و سپس افزودن آنها به فهرست گوشی های جفت شده. این کار با لمس دکمه اسکن در صفحه صورت می پذیرد. کد موردنظر برای انجام این کار در DeviceListFreagment قرار گرفته است.

اول از همه لازم است یک BroadcastReceiver بسازیم و متد ()onRecieve آنرا اورراید نماییم. متد ()onRecieve همزمان با پیدا شدن یک دستگاه بلوتوث فراخوانی می شود.

متد ()onReceive یک اینتنت را به عنوان پارمتر دوم خود می گیرد. با فراخوانی ()getAction قادر به تشخیص اینتنی هستیم که در حال برادکستینگ است. چنانچه اکشن BluetoothDevice.ACTION_FOUND باشد نشان از این است که یک دستگاه بلوتوث را پیدا کرده ایم. پس از این کار با استفاده از نام دستگاه و آدرس مک آن یک آبجکت DeviceItem می سازیم و در نهایت آبجکت DeviceItem را به ArrayAdapter جهت نمایش در اپلیکیشن می افزاییم.

زمانی که دکمه اسکن فعال می شود، لازم است گیرنده ای را که ساخته بودیم ثبت کنیم و متد ()startDiscovery را فراخوانی نماییم. چنانچه دکمه اسکن غیرفعال شود فرستنده نیز از حالت ثبت شده در می آید و متد ()cancelDiscovery فراخوانی می شود، توجه داشته باشید که این فرآیند منابع زیادی را مورد استفاده قرار می دهد. چنانچه اپلیکیشن شما به یک دستگاه بلوتوث دیگر متصل باشد باید پیش از اتصال این فرآیند جستجو را متوقف کنید.

علاوه بر این باید در زمان شروع فرآیند جستجو اقدام به پاک کردن آبجکت ArrayAdapter و mAdapter نیز نمایید.

4. اتصال به یک دستگاه

اتصالات بلوتوث نیز مانند سایر انواع اتصالات می باشند و یک سرور و کلاینت وجود دارند که با سوکت های RFCOMM به برقراری ارتباط می پردازند. در اندروید سوکت های RFCOMM به عنوان یک آبجکت BluetoothSocket نمایش داده می شوند. بسیاری از کدهای فنی برای سرورها توسط اندروید SDK مدیریت می شوند و در API بلوتوث جای گرفته اند.

اتصال به عنوان کلاینت آسان است، اول از همه سوکت RFCOMM را از BluetoothDevice موردنظر با فراخوانی ()createRfcommSocketToServiceRecord می گیرید و یک UUID که مقداری 128 بیتی است را ارسال می کنید، UUID مشابه شماره پورت می باشد.

برای نمونه تصور کنید که در حال ساخت یک اپلیکیشن چت می باشید که از بلوتوث جهت چت با کاربران اطراف استفاده می کند. جهت یافتن سایر کاربران برای چت باید به دنبال گوشی های دیگری بگردید که اپلیکیشن چت را بر روی گوشی خود نصب کرده اند. استفاده از UUID برای گوش دادن و پذیرفتن ارتباطات بلوتوث به طور خودکار یک UUID را به لیست سرویس های گوشی یا پروتکل کشف سرویس می افزاید.

زمانی که BluetoothSocket ساخته شد شما قادر به فراخوانی connect() در BluetoothSocket هستید. این کار یک ارتباط با BluetoothDevice را با استفاده از سوکت RFCOMM ایجاد می کند. زمانی که گوشی شما متصل باشد می توانید از سوکت برای تبادل اطلاعات با گوشی یا دستگاه متصل شده استفاده کنید. این کار مشابه پیاده سازی استاندارد برای سرور است.

حفظ ارتباط بلوتوث هزینه بر است و باید هر زمان که کار تمام شد سوکت را ببندیم. برای بستن سوکت متد ()close از BluetoothDevice را صدا می زنیم.

این قطعه کد نحوه برقراری ارتباط با BluetoothDevice داده شده را به تصویر کشیده است:

اتصال به عنوان سرور کمی پیچیده تر است، اول از همه باید از BluetoothAdapter خود یک BluetoothServerSocket دریافت کنید، این سوکت برای گوش دادن به یک اتصال مورد استفاده قرار می گیرد و برای گرفتن یک سوکت RFCOMM اشتراک گذاشته شده در اتصال استفاده می شود. زمانی که ارتباط برقرار شد سوکت سرور دیگر موردنیاز نخواهد بود و می توان با متد ()close آنرا بست.

ساخت سوکت سروربا فراخوانی (listUsingRfcommWithServiceRecord(String name, UUID mUUID صورت می پذیرد. این متد دو پارامتر می گیرد، یکی نام که از نوع رشته است و دیگری یک شناسنده منحصر به فرد از نوع UUID. پارامتر نام در حقیقت نامی است که هنگام افزوده شدن به SDP گوشی به سرویس می دهیم. شناسنده منحصر به فرد باید با UUID که کلاینت سعی در برقراری ارتباط با آن دارد مطابقت داشته باشد. پس از آن ()accept را در BluetoothServerSocket جدید صدا می زنیم و منتظر برقراری ارتباط می مانیم. زمانی که مقدار بازگشتی accept() چیزی به غیر از null باشد، آن را به BluetoothSocket اختصاص می دهیم که بعدا برای تبادل اطلاعات با گوشی متصل شده استفاده می شود.

کد زیر نحوه پذیرش یک ارتباط به عنوان سرور را نمایش می دهد:

نوشتن و خواندن در ارتباط با استفاده از استریم ها انجام می شود یعنی InputStream و OutputStream. ما قادر به دریافت یک مرجع به این استریم ها با کمک فراخوانی ()getInputStream و getOutputStream در BluetoothSocket می باشیم. به منظور خواندن و نوشتن بر روی این استریم ها تابع ()read و ()write را مورد استفاده قرار می دهیم.

قطعه کد زیر نحوه انجام این کار برای یک عدد صحیح منفرد را نمایش داده است:

در finished project on GitHub قادر به پیدا کردن نمونه های تکمیل شده می باشید.

نتیجه گیری

ما با موفقیت قادر به ساخت بلوتوث اسکنر خود شدیم و موارد زیر را فرا گرفتیم:

– درخواست مجوز برای بلوتوث.

– فعال سازی بلوتوث بر روی گوشی.

– دریافت لیستی از گوشی های جفت شده.

– اسکن و نمایش یک لیست از گوشی های بلوتوث اطراف.

– برقراری یک ارتباط بلوتوث بین دو گوشی.

– ارسال و دریافت اطلاعات با کمک ارتباط بلوتوث.

 

منبع:

http://code.tutsplus.com

این نوشته را به گوگل توصیه کنید :

بسته های آموزشی جذاب!بیشتر