Як підключити та надіслати дані до послідовного порту Bluetooth в Linux?


30

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

Для налаштування послідовного порту я спершу додаю канал до профілю SP:

sdptool add --channel=22 SP

Тоді я закликаю "послухати" за допомогою rfcomm:

rfcomm listen /dev/rfcomm0 22

який блокує на

Waiting for connection on channel 22

Очевидно, rfcomm створить / dev / rfcomm0 після успішного з'єднання. Як тільки це станеться, я хотів би використати щось на зразок cutecom для надсилання повідомлень на підключений пристрій.

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

З огляду на те, що я можу успішно поєднуватися та надсилати файли без жодних проблем, я знаю, що з'єднання Bluetooth та зв’язок працює.

Я не надто впевнений, що ще можу спробувати. Я використовував "перегляд sdptool" на своєму локальному пристрої та пристрої Android, щоб переконатися у відсутності конфліктів каналів RFCOMM.

Відповіді:


21

Я, здається, зараз це почав працювати. Bluetooth здається трохи вибагливим. Я резюмую свої кроки повністю, якщо хтось вважає це корисним (хоча це майже все, що я спробував спочатку). Це для Android JB (4.2.2) на Nexus 4 та Arch Linux 3.6.7-1, з bluez 4.101 на Gnome 3.6 (з / гном-Bluetooth).

(Цей крок може не принести нічого корисного) Увімкніть Bluetooth на Android та від'єднайте адаптер USB / Bluetooth від вашої машини Linux (або якщо у вас є вбудований, скиньте його за допомогою скидання hcitool devname)

Підключіть / увімкніть адаптер 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 Store), хоча будь-який подібний додаток повинен працювати. Відкрийте 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

Нижче описані кроки:

По-перше, ви повинні з'єднати пристрої. Спарювання відносно просто. Я зателефоную клієнту (хто починає розмову) та серверу (хто відповість)

Ви повинні налаштувати сервер раніше: Сторона сервера (як корінь):

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

Сторона клієнта (як корінь):

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

Тепер відкрити послідовний термінал для клієнта:

screen /dev/rfcomm0 115200

Коментарі:

Коли ви викликаєте останню команду rfcomm connect ... в клієнті, /dev/rfcomm0буде створено пристрій і пов'язаний з сервером /dev/recomm0. Це являє собою послідовний зв'язок між обома

Остання команда сервера: rfcomm watch.... буде "слухати" для вхідних з'єднань. У зв'язку із втраченим з'єднанням команда перезапустить новий стан «прослуховування».


1
Відповідь, надана ismaia, майже не потрапляє туди. Потрібно пам’ятати, що хоча новіший стек bluez потребує спеціальної --compatопції, інакше додавання SP може не вдатися. Дивіться тут . Тож відрегулюйте / змініть свої сценарії запуску systemd / initd так, щоб --compatце було.
Блектофу

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_#>

ПРИМІТКА: MAC-адреса bt у /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 і зберігайте конфігурацію, в якій ви вказуєте баудрат і порт. Ви можете знайти більше інформації тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.