توی چند سال گذشته وضعیت بازی‌ها در سیستم‌عامل‌های آزاد نسبت به گذشته خیلی فرق کرده و با وجود Steam عناوین زیادی از بازی‌ها، برای نصب مستقیم در گنو/لینوکس منتشر میشن و با کمک wine هم میشه اکثر بازی‌های معروفی که برای ویندوز منتشر شدن رو، روی گنو/لینوکس‌ها هم با کیفیت خیلی خوب نصب و اجرا کرد. اما همچنان مشکلاتی وجود داره و هنوز همه چیز مثل ویندوز، وصل کن و استفاده کن نیست. یکی از این مشکلات هم استفاده وایرلس از کنترلرهای بازی یا همون دسته‌های بازی هست.

توضیح: از نظر قیمت و راحتی استفاده و جای دکمه‌ها و خیلی دلایل شخصی دیگه، من چند سال پیش تصمیم گرفتم یک دسته بازی Xbox One S بخرم، ولی باید این نکته رو اضافه کنم که اگه هدف اصلیتون بازی کردن روی استیم هست، دسته‌های Nintendo Switch Pro، جایگزین خیلی خوبی هستند که به شکل رسمی توسط استیم هم پشتیبانی میشن و در ضمن قابل شارژ هم هستند و لازم نیست نگرانی عوض کردن باطری رو هم داشته باشید، اما این کنترلرها هم مشکل اتصال بلوتوث روی اوبونتو رو دارن.

بارها سعی کردم دسته بازی Xbox One S رو به اوبونتو وصل کنم، متصل کردن دسته با کمک کابل و از طریق پورت usb خیلی کار راحتی بود، کافی بود دسته رو با کابل به کامپیوتر وصل کنم و بدون هیچ مشکلی، اوبونتو دسته بازی رو تشخیص میداد و خیلی راحت از کنترلر استفاده میکردم، اما مشکل از جایی شروع میشد که میخواستم بدون سیم و از طریق بلوتوث دسته رو به کامپیوتر وصل کنم، با وجودی که توی تنظیمات بلوتوث نشون میداد که دسته رو شناخته و توی منو هم کلید connect فعال بود، اما بعد از سعی برای کانکت کردنش، در عرض یکی دو ثانیه، اتصال قطع میشد!

connect, disconnect

خوب از اونجایی که اوبونتو دسته رو بدون مشکل پیدا میکنه و حتی برای چند ثانیه کوتاه هم بهش کانکت میشه، کاملا مشخصه که یه چیزی این وسط هست که داره اتصال رو بلاک میکنه و باعث قطع شدنش میشه. اعتراف میکنم بعد از بارها جستجو و تلاش برای پیدا کردن راه‌حل این مشکل، از اتصال بلوتوث دسته برای چند سال ناامید شدم و کلا بی‌خیال اموضوع شده بودم تا اینکه بالاخره، خیلی اتفاقی فهمیدم این مردم آزار چیزی نیست به جز یک پروتوکل بلوتوث توی لینوکس که به اسم Enhanced Re-Transmission Mode یا حالت انتقال مجدد بهبود یافته شناخته میشه. توی ادامه متن به این پروتکل به شکل خلاصه میگم ertm.


راه حل‌ها

راه حل اول

قبل از توضیح دادن، باید بگم که خودم از این راه حل استفاده نمیکنم و راه حل دوم رو پیشنهاد میکنم.

ترمینال رو باز می‌کنیم و این دستور رو تایپ میکنیم:

sudo sh -c 'echo 1 > /sys/module/bluetooth/parameters/disable_ertm'

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

sudo nano /etc/modprobe.d/bluetooth.conf

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

options bluetooth disable_ertm=1

با کلیدهای ترکیبی ctrl+O و بعدش زدن کلید اینتر برای تایید اسم فایل، فایل رو ذخیره میکنیم و با کلیدهای ترکیبی Ctrl+X از ویرایشگر خارج میشیم.


اگر استفاده کردن از nano رو دوست ندارید میتونید از هر ویرایشگر دیگه‌ای که نصب دارید، استفاده کنید، برای مثال دستور زیر فایل تنظیمات رو با ویرایشگر پیش‌فرض Gnome یعنی برنامه gedit باز میکنه که یه ویرایشگر گرافیکیه و کار باهاش راحت‌تره.

sudo gedit /etc/modprobe.d/bluetooth.conf

توی این حالت بعد از ویرایش کردن فایل، خیلی راحت با زدن کلید save فایل رو ذخیره کنید و برنامه رو ببندید.


کامپیوتر رو یک بار ری‌استارت کنید و تمام، با خیال راحت از این به بعد کنترلرهای بازیتون رو بدون مشکل از طریق اتصال بلوتوث وصل کنید و بازی کنید.

توضیح این دستورات و تنظیمات هم به شکل ساده میشه اینکه، داریم به سیستم عامل میگیم موقع بوت شدن ertm رو غیر فعال کنه.

نکته مهم: این راه حل در صورت فعال بودن ممکنه باعث ایجاد مشکل در سایر دستگاه های بلوتوث مانند هدفون بشه. اگر بعد از اجرای این راه حل در اتصال بلوتوث سایر دستگاه‌هاتون مشکلی داشتید، کافیه فایل بالا رو دوباره برای ویراش باز کنید و مقدار 1 رو به 0 تغییر بدید.

connected


راه حل دوم

یه راه حل دیگه که برای حل کردن این مشکل داریم و من خودم از این راه استفاده کردم و به نظرم راه حل بهتری هست، استفاده از sysfs هست. به شکل خلاصه بزارید اول بگم sysfs چی هست.

‫sysfs یک فایل سیستم مجازیه که در هسته‌های لینوکس بعد از نسخه 2.5 اصافه شده و درخت(tree) دستگاه‌های متصل به سیستم رو در اختیار کاربر قرار میده... علاوه بر این، این بسته یک پرونده پیکربندی(فایل تنظیمات) رو در آدرس /etc/sysfs.conf ایجاد میکنه که به کاربر امکان میده به راحتی تنظیمات sysfs را در بوت سیستم (از طریق یک اسکریپت init) تنظیم کنه. توضیحات بیشتر رو میتونید توی صفحه پروژه بخونید

خوب الان که فهمیدیم sysfs چی هست و چه کار میکنه، بریم برای نصبش.

sudo apt install sysfsutils

و بعداز نصب، فایل تنظیماتش رو ویرایش میکنیم، این فایل توی آدرس /etc/sysfs.conf قرار داره، پس برای ویرایش کردنش دستور زیر رو تایپ میکنیم:

sudo nano /etc/sysfs.conf

آخر فایل یک خط جدید ایجاد میکنیم و این تنظیمات رو توی اون خط جدید تایپ میکنیم:

/module/bluetooth/parameters/disable_ertm=1

با کلیدهای ترکیبی ctrl+O و بعدش زدن کلید اینتر برای تایید اسم فایل، فایل رو ذخیره میکنیم و با کلیدهای ترکیبی Ctrl+X از ویرایشگر خارج میشیم.


یک بار دیگه باید یادآوری کنم که اگر استفاده کردن از nano رو دوست ندارید میتونید از هر ویرایشگر دیگه‌ای که نصب دارید، استفاده کنید، برای مثال دستور زیر فایل تنظیمات رو با ویرایشگر پیش‌فرض Gnome یعنی برنامه gedit باز میکنه:

sudo gedit /etc/sysfs.conf

توی این حالت بعد از ویرایش کردن فایل، خیلی راحت با زدن کلید save فایل رو ذخیره کنید و برنامه رو ببندید.


همونطوری که توی توضیحات بالا نوشته بودم، sysfs از init استفاده میکنه، پس به جای بوت کردن مجدد سیستم عامل، فقط اسکریپت مورد نظر رو ری‌استارت میکنیم، دستور زیر رو توی ترمینال اجرا کنید:

sudo systemctl restart sysfsutils.service 

تمام شد، از این به بعد خیلی راحت و بدون دردسر کنترلرهای Xbox یا Nintendo رو از طریق اتصال بلوتوث به کامپیوتر وصل کنید.

نکته مهم: این راه حل هم در صورت فعال بودن ممکنه باعث ایجاد مشکل در سایر دستگاه های بلوتوث مانند هدفون بشه. به هر حال این راه حل هم داره ertm رو غیرفعال میکنه، اما اگه از sysfs به عنوان راه حل دارید استفاده میکنید، فقط کافیه که با تایپ کردن دستور زیر توی ترمینال، اجراش رو متوقف کنید:

sudo systemctl stop sysfsutils.service

و هر وقت که نیاز داشتید، خیلی راحت با دستور زیر، مجددا راه اندازیش کنید

sudo systemctl start sysfsutils.service 

connected

دسته بندی: گنو/لینوکس برچسب‌ها: گنو/لینوکس،  اوبونتو،  بازی
در صورتیکه بعد از خواندن این یادداشت بخواهید به هر شکلی در تکمیلش مشارکت کنید، مثلا آن را اصلاح کنید یا مطلبی به آن اضافه کنید، منبع این یادداشت روی گیت‌هاب در این آدرس در دسترس است:
https://github.com/kiamazi/kiavash.one/blob/master/content/blog/2020-06-03-gnu-linux-gaming-tip-how-to-pair-xbox-one-S-controller-via-bluetooth.md
میتوانید آن‌را ویرایش کنید. البته باید یادآوری کنم که هر ویرایشی قبل از اتشار نیاز به تایید دارد.
این وبلاگ از disqus برای سیستم نظردهی استفاده می‌کند، اگر فرم نظردادن را نمی‌بینید احتمالا کسی به جای شما تشخیص داده که این سرویس مناسبتان نیست و آن را از دسترس شما خارج کرده، برای نظردادن در این شرایط از ابزار رفع فیلتر استفاده کنید