Как создать сокет Android RFCOMM без участия пользователя?

Вот сценарий:

Мне нужно написать приложение для Android, чтобы создать сокет RFCOMM для ПК с Bluetooth-ключом (сервер я тоже собираюсь написать).

Мое требование состоит в том, что пользователю не нужно связывать устройство вручную.

На самом деле, с большим взломом, я использую createInsecureRfcommSocket.

Небольшой сценарий: у меня есть приложение для Android, которое обменивается информацией с устройством Linux с открытым сокетом RFCOMM. Я могу вручную установить PIN-код на устройствах (жесткое кодирование - это вариант)

Я ищу разные дороги:

Написать оболочку JNI

Как это было сделано здесь Максом Келлерманном, я могу написать слой JNI, чтобы сделать весь этап сопряжения. Это должно быть хорошим вариантом, но есть проблема:

В NDK 4b нет библиотек libbluetooth, поэтому параметр -lbluetooth не работает, как и NDK v.3.

Опции:

  1. Найдите NDK 1.5 (который включает библиотеку Bluetooth). После нескольких дней поиска в Интернете я не смог узнать. Может у кого есть или знает где найти?
  2. Скомпилируйте libbluetooth для Android самостоятельно и используйте их для -lbluetooth. Не повезло там, я не в состоянии построить их. Любой намек?

Используйте что-то, доступное через API

Кто-нибудь знает, как я могу использовать createRfcommSocketToServiceRecord и заставить пользователя не сопрягать устройство вручную? Является ли это возможным? Как мне написать сервер?

Что-то, чего я не знаю

Может быть (конечно!) есть что-то, чего я не знаю. Может быть, я могу использовать что-то еще? Не RFCOMM? СДП?

Может быть, я могу вручную выполнить сопряжение с Android API?

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

Спасибо всем за поддержку, ребята!


person Enrico Carlesso    schedule 17.11.2010    source источник
comment
Предположения, но я не удивлюсь, если он намеренно разработан так, что для сопряжения требуется участие (одобрение) пользователя. По крайней мере, это соответствовало бы другим местам, где дизайн Android требует взаимодействия с пользователем по соображениям безопасности.   -  person Chris Stratton    schedule 17.11.2010
comment
Да, но официальные апи не единственный способ. Для этого я спрашиваю о ndk 1.5, сборке libbluetooth или других функциях @hide.   -  person Enrico Carlesso    schedule 18.11.2010
comment
Если libbluetooth был удален, скорее всего, старая версия не будет работать на более новой версии Android, даже если вы ее найдете. Это постоянное предупреждение против использования непубличных API — будущие изменения могут их сломать.   -  person Chris Stratton    schedule 23.11.2010
comment
Я не уверен, что понимаю, почему вы хотите, чтобы это работало без необходимости сопряжения вручную (что является довольно тривиальной задачей для пользователя и является одноразовой процедурой).   -  person Squonk    schedule 24.11.2010
comment
Я понимаю вашу точку зрения, и я согласен. Но это требование для проекта, в котором я участвую. И объяснение довольно тривиальное, давайте подумаем о какой-то работе, в которой нужно проверить много разных вещей, которые выставляют какие-то bluetooth-сервисы. Сопряжение каждый раз с устройством просто пустая трата времени.   -  person Enrico Carlesso    schedule 24.11.2010
comment
Это то, что вам нужно code.google.com/p/androidobex /загрузки/ ?   -  person techiServices    schedule 25.11.2010
comment
Энрико, я уверен, что это не ответ на ваш вопрос, но, может быть, стоит спросить - есть ли какие-либо другие механизмы связи, которые вы можете использовать для выполнения этой работы? БТ немного раздражает. Одна вещь, которую вы можете сделать, это закодировать ваши данные в имя устройства BT, которое транслирует ваш телефон, а затем сканирование устройств получит это имя (которое представляет собой несколько байтов данных).   -  person mchang    schedule 28.11.2010
comment
Каков ваш прецедент здесь? Если вы спрашиваете, доступна ли служба на устройстве, не будет ли SDP лучшим вариантом? Я почти уверен, что вам не нужно связываться для обнаружения службы.   -  person Gareth Davidson    schedule 28.11.2010
comment
Спасибо всем за подсказки. По порядку: @sugarynugs спасибо, я смог скомпилировать сам, но этого недостаточно. У самого Android очень странный способ использования bluez... @mchang В настоящее время мы используем соединение BT и Wi-Fi, но в некоторых сценариях BT является обязательным. @Gaz да, но с помощью sdp я могу найти только службы, но мне нужен канал, по которому можно общаться ... Как только я найду сокет rfcomm, транслируемый sdp, я должен подключиться к нему, поэтому необходимо сопряжение ...   -  person Enrico Carlesso    schedule 30.11.2010


Ответы (3)


В конце я могу сказать, что вы не можете.

Даже если вы найдете способ, используя обертки, написав модули C и т. д., эволюция Android, вероятно, изменит то, что вы используете.

А так, без вариантов. Грустно.

Посмотрим, как Android Bluetooth API изменится в будущем.

person Enrico Carlesso    schedule 20.02.2011

Да, мы можем создать его Rfcomsocket и прослушивать сокет без беспокойства пользователя, а также без сопряжения устройств. https://code.tutsplus.com/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084

Следить за этим !!

person Parvesh Khan    schedule 06.11.2019
comment
Спасибо за ответ: D Я должен указать, что вопрос был с ноября 2010 года: D - person Enrico Carlesso; 05.05.2021

Android Bluetooth API еще не доработан и будет изменяться. Используйте на свой риск. Этот класс реализует API для уровня Bluetooth RFCOMM. Сокет RFCOMM подобен обычному сокету тем, что он принимает адрес и номер порта. Разница конечно в том, что адрес это адрес Bluetooth-устройства, а номер порта это RFCOMM канал. API позволяет устанавливать прослушивающие сокеты с помощью методов bind, listen и accept, а также устанавливать исходящие соединения с помощью connect, connectAsync и waitForAsyncConnect. После создания сокета вам нужно создать его, а затем уничтожить, когда вы закончите его использовать. И create, и accept возвращают FileDescriptor для фактических данных. В качестве альтернативы вы можете вызвать getInputStream и getOutputStream для извлечения соответствующих потоков, минуя FileDescriptor.

person Shahid Karimi    schedule 21.01.2011
comment
Вы читали вопрос? Потому что я не могу понять ответ... Он вообще не подходит. - person Enrico Carlesso; 22.01.2011