Как завести блютуз адаптер на андроид приставки
Перейти к содержимому

Как завести блютуз адаптер на андроид приставки

  • автор:

Bluetooth адаптер

Изображение темы

Здравствуйте. Подскажите, пожалуйста. Вставляю в USB Bluetooth адаптер, чтоб смотреть тв в беспроводных наушниках, но ничего не происходит (адаптер и наушники были сопряжены до этого на пк). Вообще возможно ли организовать беспроводное аудио на этом телевизоре?

Комментарии 11

Аватар пользователя

Dangler2013
2 года назад
Изменено модератором

Добрый день. Вы можете попробовать подключить Bluetooth адаптер к тв приставке. Звук должен работать. Во всяком случае у меня все работает и не нужно заморачиваться покупать дорогостоящее доп. оборудование. Как вариант, возьмите у друзей приставку для проверки.

Свернуть ответы 1

Аватар пользователя

Dangler2013
2 года назад

И кстати, если у вас тв со смартом от Samsung или LG, то у них своя ОС и работать адаптер на них не будет. Во всяком случае проверил на своем втором тв от LG, у которого смарт встроенный. У Sony, как и на моей отдельной приставке X2 Cube, стоит Android, т.к. сам Android разработан на ядре Linux и написан на языке С, то такой вариант работает. Но относительно Sony нужно проверять.

Возможна ли работа с bluetooth в Android без местоположения?

Типовой отзыв для андроид приложения, работающего с блютуз устройством.

Статья построена в виде спора с воображаемым пользователем. Для андроид разработчиков рассмотрены как классические способы, так и рекомендумые альтернативы.

От вашей программы требуется только отправить данные на устройство!

Минимально необходимый код (далее МНК) для отправки данных на классическое блютуз устройство с реализаций SPP (Serial Port Protocol)

UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothDevice remoteDevice = defaultAdapter.getRemoteDevice("DC:0D:30:8A:AD:C8"); BluetoothSocket socketToServiceRecord = remoteDevice.createRfcommSocketToServiceRecord(myUUID); socketToServiceRecord.connect(); DataOutputStream dataOutputStream = new DataOutputStream(socketToServiceRecord.getOutputStream()); dataOutputStream.write("Hello mir!\n\n".getBytes(StandardCharsets.UTF_8)); dataOutputStream.flush(); Thread.sleep(1000); dataOutputStream.close(); socketToServiceRecord.close();

Если мы запустим МНК, то получим:

java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10632 nor current process has android.permission.BLUETOOTH.

Необходимо добавить для работоспособности этого кода в манифесте приложения:

До апи 31 существовали только 2 разрешения:

android.permission.BLUETOOTH и android.permission.BLUETOOTH_ADMIN

В андроид 12 переработали набор пермишенов. Ознакомиться подробнее можно по ссылке.

Главное отличие новых разрешений в том, что их нужно не только добавить в манифест, но и запросить у пользователя явно.

Вот. Сами пишете, что доступ к местоположению не нужен.

Обратите внимание на следующую строку

defaultAdapter.getRemoteDevice("DC:0D:30:8A:AD:C8");

Видите строку с двоеточиями ? Это mac адрес устройства. У каждого устройства он должен быть своим и уникальным. Вы знаете адрес например своего принтера ? Устроит ли вас просто поле ввода для этого значения ?

На моем принтере есть наклейка с QR. Считайте ее.

Это исключения, кроме того нет единого формата для кодирования информации о параметрах подключения.

Я буду сам сопрягать устройства через системные настройки. Дайте мне выбрать нужное из них.

Я могу помочь Вам попасть сразу в нужное место системных настроек:

Intent intentOpenBluetoothSettings = new Intent(); intentOpenBluetoothSettings.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); startActivity(intentOpenBluetoothSettings); 

и вам не придется долго добираться до него.

Получить список сопряженных:

Set btDevices = mBtAdapter.getBondedDevices();

Казалось бы одна строчка кода, что тут может не работать?

Во первых, всё таки встречаются устройства без BT. Подстраховаться можно строкой в манифесте.

В этом случае приложение нельзя будет поставить на андроид устройство без блютуз адаптера. Если с перефирийным устройством можно общаться еще через USB или сеть, то меняем на required=»false».

Если адаптера нет, то BluetoothAdapter.getDefaultAdapter() вернет null.

Попутно пожалуюсь. Ну зачем ее сделали депрекайтед? Альтернатива ужасно не удобная. Теперь еще контекст в фоновые потоки протаскивать для получения адаптера или сам адаптер. А за столько лет существования андроида так и не сделали, чтобы два и более адаптера поддерживалось одновременно. А еще проблем добавляют .

Во вторых, опять головная боль в 12м андроиде. Нужно учесть, что пермишен BLUETOOTH_CONNECT предоставлен.

Ворчание. Раньше было проще. Автоматом давался по факту наличия в манифесте. Теперь придется аналогично критичными. А еще нельзя попросить один раз и запомнить, что получил. Механизм автоматического отзыва у неиспользуемых приложений появился. Так что здравствуй куча проверок начиная с того, на какой версии андроида запущено.

Совет вместо проверок, лучше обернуть SecurityException в кастомное исключение и обработать его там, где есть возможность позвать запрос на предоставление разрещения иначе там получается большая лапша проверок начиная с того, что версия андроида 12 и выше и далее а дано ли разрешение.

В третьих, getBondedDevices() вернет null при выключенном адаптере.

Действия с получением списка сопряженных и их обработкой вынесем в функцию getBonded() . Вместо тривиального уведомления «Включите» реализуем включение.

if (!mBtAdapter.isEnabled()) < Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); btActivityResultLauncher.launch(enableIntent); >else
btActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> < if (result.getResultCode() == Activity.RESULT_OK) < getBonded(); >>); 

Тут вопрос от знатока. Можно же mBtAdapter.enable() использовать, почему так сложно ?

Вариант выше не требует дополнительных разрешений. Метод enabled() становиться депрекайтед в 13-м андроиде. Пример выше основан на рекомендованной альтернативе. Для предыдущих версий в манифесте должен быть еще пермишен BLUETOOTH_ADMIN. Но главное из-за выделенного жирным в документации

Bluetooth should never be enabled without direct user consent.

легко попасть под reject (отклонение обновления или нового приложения) или словить снятие с публикации.

Вернемся к выбору из списка сопряженных.

Мы получили список объектов типа BluetoothDevice, а нам нужно показать имя и узнать mac:

BluetoothDevice d = getItem(position); String name = d.getName(); // требует BLUETOOH_CONNECT String mac = d.getAddress(); // а это удивительно нет

Получается ли , что мы обошлись без необходимости в геолокации?

Так выглядит запрос BLUETOOH_CONNECT в Android 12.

Единственное чего мы достигли, пользователи более ранних версий останутся в неведении. Напомню, что пермишен нужен и для работы МНК ( .getRemoteDevice(), .connect() ).

Почему же так?

У вас сопряжен с телефоном телевизор, колонки . Программа это увидела и если у нее есть биг дата по пользователям, то как минимум она вычислит Ваш город. Если мало мобильное устройство в зоне досягаемости (удалось к нему подключиться), то можно местоположение сузить до 100 метров.

Именно о таком теоретическом возможном риске Вас предупреждают.

У меня Android 6-11. Почему же я вижу запрос к местоположению?

Мы рассмотрели вариант, когда Вы предварительно сделали сопряжение, не все пользователи могут сделать этот шаг самостоятельно. Часто для простоты даже не смотрят в список сопряженных, а начинают опрос эфира.

До 6-го андроида разрешения предоставлялись автоматически по факту упоминания в манифесте. Потом разрешения решили поделить, условно безопасные так и остались, а остальные стало требоваться запрашивать явно. В коде программ появился костыль вида:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) < if (checkSelfPermission(Manifest.permission. …) != PackageManager.PERMISSION_GRANTED )< … >> 

Пользователи стали видеть запросы.

Процесс опроса эфира асинхронный.

1) Создаем слушателя

private final BroadcastReceiver mReceiver = new BroadcastReceiver() < public void onReceive(Context context, Intent intent) < String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) < // Найдено BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); …… делаем с ним что нужно >else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) < // процесс поиска завершен >> >; 

2) Регистрируем слушателя сообщений.

IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, filter);

3) Запускаем процесс

mBtAdapter.startDiscovery();

Прочитать документацию Вы можете самостоятельно.

Выскажу свое мнение почему там сбоку прикрутили геолокацию. Так у нас два пермишена BLUETOOTH слишком общий, BLUETOOTH_ADMIN нужен для изменения статуса и позволяет сканировать. Сделать его явно запрашиваемым, поломается много программ. У нас тут еще есть ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, которые нужно явно запрашивать. Так может скрестим и по смыслу подходят.

И вот пошли шатания от версии к версии. Нужно ли именно FINE или хватит COARSE.

В 12м нужна связка BLUETOOTH_SCAN & ACCESS_FINE_LOCATION.

В андроиде есть неудобная для программистов практика без ошибки игнорировать действия, которые потом решили запретить и/или возвращать пустой/фиктивный результат. Делается это для того, чтобы устаревшие программы не завершились аварийно с ошибкой. Да еще вендоры могут внести свое видение того как правильно.

Кроме того в момент первоначальной настройки нового телефона/приставки можно запретить всем приложениям доступ к местоположению. После этого узнать, что всем или конкретно нам запрещено нет возможности. Все методы отрабатывают без ошибок, а бродкаст не приходит ;(

Вопрос от знатока. А почему не написали про Companion Device Manager (CDM)?

Когда я про неё прочитал, тоже подумал, что вот оно. Именно это решит проблему с пользователями. А вот реальность подкачала.

К сожалению документация, а конкретно примеры для java немного устарели (использованы депрекейтед StartIntentSenderForResult и onActivityResult), поэтому приведу уже поправленные коды.

Код поправлен на поиск всех устройств поблизости. Не важно есть у них имя или нет и какие типы интерфейсов поддерживают. В данном случае нас интересуют только само поведение «подружить» . Также для простоты minSDK поставлен от 8.0.

Если мы посмотрим в исходные коды операционной системы (Android SDK), то увидем:

public final class CompanionDeviceManager

так нелюбимое мною умирание молча . Что мешало сперва проверить callback, и если не работает вызвать failure ? Даже если это исправят, в предыдущих версиях андроида проблема останется 🙁

А причина ? В функции проверяется, что внутренняя переменная mService не null.

Конструктор принимает параметр службы как @Nullable. Получаем мы этот объект уже готовым:

CompanionDeviceManager deviceManager = context.getSystemService(CompanionDeviceManager.class);

Наш объект существует, но на практике часто приходит не работоспособным. И получается нажали на кнопку «подружить с новым» и никакой реакции. Это первое мое разочарование.

Failure вообще оказался неинформативным. Вызывается только при отказе выбора. Текст ошибки всегда один и тот же.

Запустите предложенный демо пример.

Работает правильно, только если определение местоположения включено .

Если что-то из показанных стрелками выключено, диалог просто не показывается. Никаких ошибок в callback не передается.

И пришли мы к тому, что должны пользователю показать диалог

Включи! Определение местоположения.

Это меня окончательно разочаровало.

Выводы

Блютуз не может работать без геолокации. Ничего не поменялось с появлением альтернатив.

Внедрять их все же придется, чтобы приложение соответствовало правилам Google Play.

Как минимум учесть новые разрешения для работы с блуютуз.

Как из простого телевизора сделать телевизор Smart TV?

Достаточно часто решение о смене техники принимается из-за того, что на телевизоре нет поддержки Smart TV. Совершенно необязательно тратить денежные средства на такое обновление. Можно обычный телевизор превратить в «умное» устройство.

Технология Smart TV позволяет пользоваться интернетом посредством телевизора. Благодаря ей становится доступным просмотр любых фильмов из сети, онлайн-игры и другой контент. Новые модели цифровой техники выпускаются уже с внедренной технологией, однако, и пользователи более старых моделей телевизоров имеют шанс получить доступ к инновационной разработке. Поэтому, если у вас старая модель телевизора без Смарт-функций, не расстраивайтесь – идти в магазин за дорогой Smart 4K панелью не придется. «Умное» телевидение вполне может уместиться на маленькой флешке или даже консоли. Сделать телевизор «умным»довольно просто.

Существует несколько способов, как из простого телевизора сделать телевизор Smart TV:

  • Через приставку Smart TV Box.
  • Через приставку Smart TV Stick.
  • С помощью телефона через Miracast адаптер.
  • С помощью смартфона и ноутбука.
  • Подключить игровую консоль.

Smart TV Box. Самый оптимальный вариант – приобрести отдельную Смарт ТВ приставку для телевизора. Они работают на операционной системе Android и разработанной Apple, а, значит, ее установка позволит превратить любую, даже самую старую модель телевизора, в полноценный медиацентр со всеми функциями «умных» аналогов.

Существует большое количество моделей и разновидностей Смарт приставок для телевизора. Исходить нужно из поставленных перед ней задач, что именно вы хотите делать на своем устройстве:

  • Воспроизводить потоковое видео или онлайн фильмы.
  • Смотреть электронную почту.
  • Общаться с друзьями в социальных сетях по видеосвязи.
  • Загружать игры и приложения через сервисы Play Market, App Store или Google Play.
  • Играть в онлайн-игры.
  • Слушать музыку и многое другое.

Поскольку Smart TV Box представляет собой мини-компьютер со встроенной операционной системой, Wi-Fi-модулем и рядом других компонентов, к нему можно подключить внешний диск, клавиатуру, мышь, пульт управления, интернет-кабель. Такая приставка легко заменит персональный компьютер, его возможностей хватит для работы с приложениями и воспроизведения качественного видео в разрешении 4К.

Также перед приобретением необходимо понять, какие разъёмы присутствуют на вашем телевизоре, чтобы Смарт приставка имела возможность к нему подключиться. Лучше всего, если есть обычный разъём HDMI, так как с этим портом работает большинство приставок. Если же телевизор совсем старый, тогда необходимо искать такую Смарт ТВ приставку, у которой есть разъём RCA.

Стоимость приставок Smart TV может быть значительной: у самых навороченных моделей она может доходить до нескольких тысяч рублей. Однако даже среди бюджетных китайских моделей можно подобрать что-то стоящее.

Самые популярные модели Смарт приставки – это Xiaomi Mi Box и Apple TV 4. Устройство от Apple стоит дороже, но и обладает самой большой производительностью. Его пульт управления имеет встроенный гироскоп, что позволяет использовать его в качестве контроллера для компьютерных игр. А плюсом устройства Xiaomi Mi является то, что платформа Android очень гибкая и регулярно получает обновления, а значит, обычный телевизор сможет работать как Smart TV без замены приставки в течение продолжительного времени.

TV Stick. Smart TV Stick является немного упрощенной версией приставки для телевизора. Главное отличие Smart TV Stick от TV Box – ее размер и функциональность. Выглядит она как флешка, которая подключается к HDMI разъёму. Из-за небольшого размера в TV Stick есть ряд ограничений: на ней невозможно разместить порты для подключения других устройств. То есть совместно с ней можно будет использовать только беспроводные устройства – мышь, клавиатуру, наушники или колонку, которые возможно соединить по Bluetooth.

В таких устройствах устанавливают 1 Гигабайт операционной памяти. Такого объема будет хватать только для выполнения не слишком сложных задач по просмотру видео через интернет приложения для Android. Smart TV Stick работает с разрешениями 2К/4К.

Miracast адаптер. Чтобы превратить простой телевизор в Смарт, необходимо установить беспроводный Миракаст адаптер при помощи телефона или ноутбука. Это дополнительное устройство, напоминающее флешку, которое подключается в USB-порт на телевизоре, однако со значительно меньшими способностями. По сути, все его предназначение заключается в том, чтобы обеспечить телевизор функцией приема Wi-Fi сигнала от роутера и других устройств. После подключения у пользователя появляется возможность транслировать видео или целый экран ноутбука, компьютера или телефона на экран телевизора.

Данный способ полностью зависит от подключения к телевизору другого устройства, что не совсем удобно. Во-первых, ноутбук или смартфон может быть разряжен или в любой момент понадобиться, в результате чего экран телевизора со Смарт функциями перестанет работать. Во-вторых, процессор смартфона не всегда настолько мощный, чтобы «потянуть» такой тип связи. В результате чего могут быть зависания, и просмотр видео не будет таким удобным.

Смартфон или ноутбук. Если нет желания тратить деньги на покупку дополнительных устройств, тогда превратить обычный телевизор в Смарт поможет смартфон или планшет. Но они должны быть достаточно мощными, чтобы не «подвисать» при воспроизведении контента и обладать емким аккумулятором.Подсоединить смартфон или планшет к телевизору можно несколькими способами:

  • С помощью разъёма USB.
  • Используя порт HDMI. Для этого нужен специальный кабель HDMI. При подключении кабеля необходимо выбрать на телевизоре тип сигнала HDMI.
  • Используя разъём VGA. Для этого также нужен кабель. Плюс такого решения заключается в том, что можно подключить смартфон к любым телевизорам и мониторам. Минус – невозможность воспроизводить через телевизор звук – к смартфону придется подключать колонки.
  • С помощью Wi-Fi. Подходит только для тех телевизоров, которые оборудованы таким модулем.

Игровая консоль для игр. Производители современных игровых устройств значительно расширили функции техники. Теперь на консолях можно не только играть, но и пользоваться большинством сервисов, которые разработаны под Android. На некоторых моделях возможно даже подключение пульта управления, чтобы управлять не джойстиком.

Вариант с игровой консолью не самый удачный из-за специфики самого устройства. Основная задача такого устройства — это игровые действия.

Bluetooth для андроида. Портируем с Linux на Android драйвер USB-адаптера

Не все USB-устрой­ства начина­ют работать на Android сра­зу пос­ле под­клю­чения. В этой статье я покажу, как решить проб­лему, на при­мере широко рас­простра­нен­ного Bluetooth-адап­тера CSR 4.0. Нам понадо­бит­ся соб­рать из исходни­ков ядро Linux и покопать­ся в интерфей­сной биб­лиоте­ке Android.

Сов­ремен­ное железо ред­ко пред­полага­ет что‑то доделы­вать руками или допили­вать в про­шив­ках. Одна­ко есть целый класс устрой­ств «ноунейм», которые прос­то‑таки взы­вают к уме­лым рукам и пыт­ливым умам. Нем­ного сме­кал­ки, и мож­но зас­тавить их работать не хуже име­нитых ана­логов.

Вот, нап­ример, ничем не при­меча­тель­ная ТВ‑прис­тавка в виде чер­ной квад­ратной плас­тиковой короб­ки с над­писью «MXQ Pro 4K» на крыш­ке и бюд­жетной начин­кой: SOC RK3229, 1 Гбайт RAM и 8 Гбайт NAND. У меня она уже око­ло года поч­ти бес­перебой­но тран­сли­рова­ла на телеви­зор YouTube и каналы интернет‑телеви­дения, музици­рова­ла и сооб­щала све­жие новос­ти.

В самом начале ее муль­тимедий­ной жиз­ни харак­тер у прис­тавки был строп­тивый, и при каж­дом удоб­ном слу­чае она норови­ла завис­нуть или перезаг­рузить­ся. Эту проб­лему уда­лось решить, уста­новив сгла­жива­ющий филь­тр в цепи питания и заменив ком­плектный блок питания более качес­твен­ным.

В какой‑то момент я подумал, не исполь­зовать ли мне эту прис­тавку еще и для игр. Бес­про­вод­ной кон­трол­лер подошел бы для это­го как нель­зя луч­ше.

В целом кон­трол­леры мож­но раз­делить на две катего­рии: RF (Radio Frequency, ради­очас­тотные) и BT (Bluetooth), оба в ито­ге работа­ют по ради­ока­налу. Вари­ант с RF тре­бует исполь­зовать проп­риетар­ный донгл (и занимать им порт USB), а Bluetooth дол­жен под­держи­вать­ся на сто­роне прис­тавки.

За­то Bluetooth уни­вер­сален и, помимо под­клю­чения устрой­ств вво­да, может быть исполь­зован для вывода зву­ка на бес­про­вод­ные колон­ки, фай­лового обме­на со смар­тфо­ном и так далее. Мой выбор был пре­доп­ределен тем, что в бли­жай­шем магази­не нашел­ся лишь BT-кон­трол­лер VR-PARK. Не обра­зец изящ­ного дизай­на, но не любовать­ся же на него!

К сожале­нию, на пла­те ТВ‑прис­тавки отсутс­тву­ет аппа­рат­ный BT-модуль, одна­ко в нас­трой­ках ее опе­раци­онной сис­темы Android 7.1.2 я видел пункт вклю­чения Bluetooth, что вро­де бы поз­воляло наде­ять­ся на под­дер­жку сте­ка про­токо­лов. Воз­можно, пос­ле под­клю­чения модуля Bluetooth в USB сра­бота­ет магия и сра­зу пред­ста­вит­ся воз­можность нас­ладить­ся игрой?

С эти­ми мыс­лями я при­купил USB-адап­тер Bluetooth с лаконич­ной над­писью «CSR 4.0» на кор­пусе. Вер­нувшись домой, я вста­вил его в порт прис­тавки, и тот весело замигал све­тоди­одом. А пос­ле вклю­чения Bluetooth в нас­трой­ках. ничего не про­изош­ло. То есть поч­ти ничего, если не счи­тать воз­никно­вения задачи, решению которой пос­вящена эта статья: нас­тро­ить ТВ‑прис­тавку на исполь­зование адап­тера USB Bluetooth.

Ког­да воз­ника­ет проб­лема, иссле­дова­тель пер­вым делом идет в интернет, что­бы соб­рать све­дения о ней. На удив­ление, матери­алов ока­залось нем­ного. То ли ник­то не под­клю­чал USB-адап­тер к прис­тавке, то ли у всех он работал из короб­ки, но пос­ледние содер­жатель­ные обсужде­ния датиро­вались 2013 годом и отно­сились к авто­мобиль­ной сис­теме муль­тимедиа.

Ре­зуль­тат бес­систем­ных попыток отыс­кать работа­ющие нас­трой­ки не порадо­вал: я толь­ко потерял нес­коль­ко часов и осоз­нал, что при­дет­ся искать собс­твен­ный путь. А для это­го необ­ходимо понимать, как под­систе­ма Bluetooth встро­ена в Android.

Архитектура подсистемы Bluetooth в Android

С точ­ки зре­ния прог­раммис­та, цен­траль­ный ком­понент под­систе­мы Bluetooth в Android — сис­темная служ­ба Bluetooth (пред­став­ляющая собой при­ложе­ние для Android), которая через Binder IPC дает при­ложе­ниям дос­туп к услу­гам Bluetooth-про­филей, а сама исполь­зует при этом JNI-интерфей­сы, реали­зован­ные на уров­не HAL и ведущие к ком­понен­там сте­ка Bluetooth и рас­ширени­ям пос­тавщи­ка (в дво­ичных биб­лиоте­ках).

Архитектура подсистемы Bluetooth в Android 7

Эту схе­му мож­но про­дол­жить вниз по сис­темной иерар­хии, и тог­да ста­нет вид­но, что биб­лиоте­ки HAL исполь­зуют интерфейс hci0 для дос­тупа к HCI-сокетам ядра опе­раци­онной сис­темы, которые через драй­вер поз­воля­ют вза­имо­дей­ство­вать с аппа­рат­ным Bluetooth-модулем, под­клю­чен­ным к сис­темной пла­те шиной SDIO, UART или USB.

Нижний уровень подсистемы Bluetooth в Android

Ос­талось выяс­нить, на каком имен­но уров­не у нас проб­лема, которая меша­ет адап­теру взять и зарабо­тать.

Опе­раци­онная сис­тема Android — это ядро Linux, поверх которо­го работа­ет гипер­визор вир­туаль­ных машин Dalvik. Начинать ана­лиз разум­но с ниж­него уров­ня, пос­ледова­тель­но убеж­даясь в том, что есть физичес­кое под­клю­чение, опе­раци­онная сис­тема и драй­вер видят адап­тер, он дос­тупен на уров­не HAL и так далее — до момен­та, ког­да он дол­жен работать.

Что­бы иссле­довать ОС и вно­сить в нее изме­нения, нужен дос­туп к коман­дной обо­лоч­ке с пра­вами супер­поль­зовате­ля. Об осно­вах исполь­зования кон­соли Android мож­но про­читать в статье «Кон­соль­ный Android».

warning

Вме­шатель­ство в опе­раци­онную сис­тему с пра­вами супер­поль­зовате­ля может нарушить работос­пособ­ность устрой­ства и вывес­ти его из строя. При­нимая решение выпол­нить опи­сан­ные в статье рекомен­дации, иссле­дова­тель берет на себя пол­ную ответс­твен­ность за воз­можные негатив­ные пос­ледс­твия сво­их дей­ствий.

Рекогносцировка

В сис­темных сооб­щени­ях dmesg упо­мина­ния о Bluetooth встре­чают­ся в сле­дующих кон­тек­стах:

[ 1] Bluetooth: Core ver 2. 16
[ 2] NET: Registered protocol family 31
[ 3] Bluetooth: HCI device and connection manager initialized
[ 4] Bluetooth: HCI socket layer initialized
[ 5] Bluetooth: L2CAP socket layer initialized
[ 6] Bluetooth: SCO socket layer initialized
. . .
[ 7] Bluetooth: HCI UART driver ver 2. 2
[ 8] Bluetooth: HCI H4 protocol initialized
[ 9] Bluetooth: HCILL protocol initialized
[ 10] rtk_btusb: RTKBT_RELEASE_NAME: 20170109_TV_ANDROID_6. x
[ 11] rtk_btusb: Realtek Bluetooth USB driver module init, version 4. 1. 2
[ 12] rtk_btusb: Register usb char device interface for BT driver
[ 13] usbcore: registered new interface driver rtk_btusb
. . .
[ 14] Bluetooth: RFCOMM TTY layer initialized
[ 15] Bluetooth: RFCOMM socket layer initialized
[ 16] Bluetooth: RFCOMM ver 1. 11
[ 17] Bluetooth: BNEP ( Ethernet Emulation) ver 1. 3
[ 18] Bluetooth: BNEP filters: protocol multicast
[ 19] Bluetooth: BNEP socket layer initialized
[ 20] Bluetooth: HIDP ( Human Interface Emulation) ver 1. 2
[ 21] Bluetooth: HIDP socket layer initialized
. . .
[ 23] usb 5-1: New USB device found, idVendor=0a12, idProduct=0001
[ 24] usb 5-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 25] usb 5-1: Product: CSR8510 A10

Стро­ка 1 говорит о том, что ядро Linux соб­рано с под­дер­жкой сте­ка Bluetooth, стро­ка 2 сооб­щает о регис­тра­ции в ядре семей­ства про­токо­лов Bluetooth. Сра­зу пос­ле это­го ини­циали­зиру­ются слои сокетов HCI, L2CAP и SCO (3–6).

За­тем акти­виру­ются драй­веры, пред­назна­чен­ные для вза­имо­дей­ствия с адап­терами Bluetooth, под­клю­чаемы­ми по шинам UART и USB (7–13). К сожале­нию, пос­ледний «понима­ет» толь­ко кон­трол­леры Realtek, а наш адап­тер CSR этим драй­вером не под­держи­вает­ся.

Пос­ледний блок сооб­щений (14–21) информи­рует об ини­циали­зации высоко­уров­невых про­токо­лов RFCOMM, BNEP и HIDP сте­ка Bluetooth. Стро­ки 23–25 соот­ветс­тву­ют реак­ции опе­раци­онной сис­темы на под­клю­чение USB-адап­тера и говорят о том, что на физичес­ком уров­не он опоз­нает­ся шиной USB.

Ин­терес­но, где же находит­ся драй­вер адап­тера? Коман­да lsmod выдала спи­сок из двух модулей, сре­ди которых rtk_btusb не ока­залось. Зна­чит, он интегри­рован в ядро Linux. Но спи­сок непус­той, а зна­чит, ядро соб­рано с под­дер­жкой модулей. Запом­ним это на будущее.

Я изу­чил фай­ловую сис­тему ТВ‑прис­тавки и нашел сле­дующие ком­понен­ты, име­ющие отно­шение к под­систе­ме Bluetooth:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *