Как подключить и отправить данные на последовательный порт Bluetooth в Linux?

30

Я пытаюсь настроить виртуальный последовательный порт через адаптер USB-Bluetooth в Linux и отправить ему сообщение через устройство Android. Я на ядре 3.6. Я могу подключиться к устройству успешно используя gnome-bluetooth, а также могу отправлять на него файлы.

Для настройки последовательного порта я сначала добавляю канал с профилем SP в мой адаптер:

sdptool add --channel=22 SP

Затем я вызываю 'listen' с помощью rfcomm:

rfcomm listen /dev/rfcomm0 22

какие блоки на

Waiting for connection on channel 22

Очевидно, rfcomm создаст / dev / rfcomm0 при успешном соединении. Как только это произойдет, я бы хотел использовать что-то вроде cutecom для отправки сообщений туда и обратно на подключенное устройство.

На моем устройстве Android я открываю Bluetooth SPP-терминал (их там несколько, я пробовал несколько разных) и пытаюсь подключиться. Все они терпят неудачу.

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

Я не слишком уверен, что еще я могу попробовать. Я использовал «sdptool browse» на своем локальном устройстве и устройстве Android, чтобы убедиться в отсутствии конфликтов каналов RFCOMM.

Прис
источник

Ответы:

21

Я, кажется, получил это работает сейчас. Bluetooth кажется немного привередливым. Я повторяю свои шаги полностью на случай, если кто-то найдет это полезным (хотя в значительной степени это то, что я пробовал изначально). Это для Android JB (4.2.2) на Nexus 4 и Arch Linux 3.6.7-1, с bluez 4.101 на Gnome 3.6 (w / gnome-bluetooth).

(этот шаг может оказаться бесполезным). Выключите Bluetooth на Android и отсоедините ваш USB / Bluetooth-адаптер от вашего Linux-компьютера (или, если у вас встроенный, сбросьте его с помощью hcitool devname reset)

Подключите / включите адаптер Bluetooth в Linux. Убедитесь, что ваш адаптер виден (его можно установить в gnome-bluetooth - вы должны увидеть иконку в системном трее bluetooth).

Включите Bluetooth на вашем Android-устройстве. Используйте Android для сопряжения с адаптером (я не смог выполнить сопряжение с Linux). Появится диалоговое окно с запросом ключа. Введите любой PIN-код, который вы хотите. Gnome должен вывести уведомление с запросом ключа; введите тот же PIN-код, который вы ввели ранее. На этом этапе ваше устройство Android и ключ должны быть согласованы.

В Linux откройте терминал и проверьте, какие службы Bluetooth доступны, набрав

sdptool browse local

Если у вас уже есть служба последовательного порта, запишите, какой это канал. Если вы этого не сделаете, вы можете добавить услугу:

sdptool add --channel=22 SP

Теперь слушайте на этом канале, используя rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm заблокирует, прослушивая соединение с таким сообщением, как

Waiting for connection on channel 22

Вернувшись на Android, я использовал приложение BlueTerm ( http://pymasde.es/blueterm/ , также бесплатно доступное в магазине Google Play), хотя любое подобное приложение должно работать. Откройте BlueTerm, выберите «Параметры»> «Подключить устройство»: выберите сопряженный адаптер.

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

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

Все, что вы вводите в приложение BlueTerm, должно идти в / dev / rfcomm0. Вы можете видеть, как вещи отображаются при вводе, открыв новый терминал и выполнив что-то вроде:

cat /dev/rfcomm0
Прис
источник
1
Хороший ответ. Я начал работать с Ubuntu 16 / Bluez 5 и этой информацией: bbs.archlinux.org/viewtopic.php?id=201672 .
Wojciii
10

Следующие шаги работали на меня:

Во-первых, вы должны выполнить сопряжение устройств. Сопряжение относительно легко. Я позвоню клиенту (который начинает говорить) и серверу (который отвечает)

Вы должны настроить сервер до: Серверная сторона (от имени root):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

Клиентская сторона (как root):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

Теперь, чтобы открыть последовательный терминал на клиенте:

screen /dev/rfcomm0 115200

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

Когда вы вызываете последнюю команду rfcomm connect ... на клиенте, устройство /dev/rfcomm0будет создано и связано с сервером /dev/recomm0. Это представляет собой последовательную связь между обоими

Последняя серверная команда: rfcomm watch.... будет прослушивать входящие соединения. В случае потери соединения команда перезапустит новое состояние прослушивания.

ismaia
источник
1
Ответ, предоставленный Исмаией, почти доставит вас туда. Однако вы должны помнить, что для нового стека bluez нужна специальная --compatопция, иначе добавление SP может завершиться неудачно. Смотрите здесь . Так что настройте / исправьте ваши сценарии запуска systemd / initd, чтобы они --compatтам были.
blacktofu
5

Я решил это с небольшим изменением команд Приса. Сделайте это, если у кого-то все еще есть проблемы с установлением соединения rfcomm.

sudo service bluetooth restart

Это ^ гарантирует, что вы начинаете с чистого листа при каждой попытке установить соединение.

rfcomm add --channel=<a_channel_#> SP

Этот номер канала должен отличаться от любого назначенного канала.

(НЕОБЯЗАТЕЛЬНО) Чтобы проверить каналы:

sdptool browse local | grep Channel

Я не уверен, зачем нужна следующая команда, но она сработала для меня.

rfcomm release 0

Затем прослушать входящие соединения:

rfcomm watch 0 <a_channel_#>

ПРИМЕЧАНИЕ: bt MAC-адрес в /etc/bluetooth/rfcomm.conf, но быть bt MAC вашего телефона. Также канал в этом файле должен быть таким же, как канал, выбранный для a_channel_ #.

Как только я сделал все это, я использовал эмулятор терминала BT на своем телефоне, чтобы проверить все это.

Этан Пламмер
источник
0

Я пробовал разные инструменты Bluetooth, и было трудно найти правильную последовательность команд для подключения и обмена данными с модулем Bluetooth. Попробуйте использовать rfcomm и minicom:

Это мой /etc/bluetooth/rfcomm.conf

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

Сканирование для устройств Bluetooth:

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

Привязка с использованием rfcomm

sudo rfcomm bind 0 20:15:12:08:62:95 1

Примечание: привязка 0 относится к устройству номер 0 (rfcomm0), а 1 - канал.

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

UserK
источник