Подключение к определенному порту Bluetooth на устройстве Bluetooth с помощью Android - PullRequest
3 голосов
/ 14 марта 2012

Есть ли способ для Android подключиться к устройству Bluetooth через определенный порт вместо использования UUID службы? Я знаю, что эта опция доступна на других платформах, которые предоставляют поддержку Bluetooth (например, Java ME, указав URL-адрес в стиле "btspp: //").

Спасибо!

Ответы [ 3 ]

8 голосов
/ 28 апреля 2012

Хорошо, это было давно, но я нашел решение проблемы. На самом деле я намеревался отказаться от UUID и использовать его, но я продолжал получать исключение Service Discovery Failed (IO), и когда я пытался найти решение проблемы обнаружения службы, я нашел решение моего первоначального вопроса ... t жизнь что-то? :))

В любом случае, это ссылка, на которую я наткнулся , хотя следует отметить, что в ответе есть ошибка (на самом деле они просто подключаются к порту 1 вместо использования UUID службы).

И после этого короткого урока истории вот решение:

Используя отражение, можно создать сокет Rfcomm, соединяющийся с номером порта вместо UUID:

int bt_port_to_connect = 5; // just an example, could be any port number you wish
BluetoothDevice device = ... ; // get the bluetooth device (e.g., using bt discovery)
BluetoothSocket deviceSocket = null;
...
// IMPORTANT: we create a reference to the 'createInsecureRfcommSocket' method
// and not(!) to the 'createInsecureRfcommSocketToServiceRecord' (which is what the 
// android SDK documentation publishes
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});

deviceSocket = (BluetoothSocket) m.invoke(device,bt_port_to_connect);

Несколько замечаний:

  1. поскольку мы используем Invoke, первый параметр - это объект, для которого мы вызываем метод, второй параметр invoke - это фактически первый параметр функции)
  2. Существует также безопасная версия ('createRfcommSocket'), которая принимает номер канала Bluetooth в качестве единственного параметра (опять же, поскольку это стиль вызова, вам нужно передать объект для вызова метода, так как упоминается в -1-)
  3. Я нашел ссылку на прототипы этих функций

Удачи всем.

0 голосов
/ 23 мая 2018

Я использую bluecove , что позволяет мне делать это с помощью функции Connector.open().

Я использую следующий URL: btspp://" + phoneID + ":" + phonePort

Nb:Некоторые опции могут быть добавлены (например: authenticate=false; или encrypt=false;).

Если phoneID является адресом Bluetooth, а phonePort номер порта.

Как найти адрес Bluetooth? Из этой ссылки :

  1. На главном экране откройте панель приложений, затем откройте «Настройки».
  2. Выберите «Система».(Пропустите этот шаг на некоторых моделях)
  3. Прокрутите вниз и нажмите «О телефоне», «Об устройстве» или «О планшете».
  4. Прокрутите вниз и нажмите«Статус».
  5. Прокрутите вниз, и в списке отобразится «Bluetooth-адрес».

Как найти номер порта? Я не смог найти, какой порт должен использоваться ... Я использовал 5, и он работает, но мне нужно выяснить, почему и если я хочу сменить телефон, мне нужно будет знать, нужно ли мне тоже менятьпорт.

0 голосов
/ 27 апреля 2012

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

Вы просто даете Android UUID для отслеживания, и в режиме клиента он найдет сокет для автоматического подключения (включая порт).).В режиме сервера он будет ожидать, пока указанное устройство установит соединение, используя указанный UUID.Объект BluetoothSocket также действителен при установлении соединения (используйте getInput / Output Stream). См. Документация по сокету сервера и Документация по сокету клиента .


Если вы действительноЕсли вы хотите проверить все, вы можете увидеть, что Android декодирует из SDP другого устройства и предоставленного вами UUID.

Используйте это руководство , чтобы получить интерфейс Bluetooth (очень легко сделать).Тогда код должен выглядеть примерно так:

IBluetooth ib =getIBluetooth();
Int otherDevicePort = ib.getRemoteServiceChannel(otherDeviceAddress, UUID);
...