Обмен файлами между двумя компьютерами через Bluetooth с терминала

8

У меня есть два смежных компьютера, один из которых работает под управлением Linux с консольным режимом, а другой - с Windows 10. Я хочу передавать файлы между ними, и оба они имеют возможности Bluetooth. Сначала я подумал о подключении USB и выполнить следующую процедуру:

fdisk -l
mount /dev/sdc1 /media
mkdir /media/myfiles01
cp ~/file1 ~/file2 /media/myfiles01
cd ~
umount /dev/sdc1

Затем я бы удалил USB-устройство, подключил его к другому компьютеру и перенес на него файлы; Но я подумал, почему я не использую Bluetooth для обмена файлами напрямую?

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


источник

Ответы:

5

Во-первых, вам нужно apt install bluez-tools obexpushd.

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

НАСТРОИТЬ


из Arch Wiki - блютус :

Bluetoothctl

Запустите bluetoothctlинтерактивную команду. Там можно ввести, helpчтобы получить список доступных команд.

  • Включите питание контроллера, введя power on. По умолчанию он выключен.
  • Введите, devicesчтобы получить MAC-адрес устройства для сопряжения.
  • Войдите в режим обнаружения устройства с помощью scan onкоманды, если устройства еще нет в списке.
  • Включите агента с помощью agent on.
  • Введите, pair MAC Addressчтобы выполнить сопряжение (вкладка завершает работу).
  • При использовании устройства без PIN-кода может потребоваться вручную доверить устройство, прежде чем оно сможет успешно восстановить соединение. Введите trust MAC Address для этого.
  • Наконец, используйте connect MAC_addressдля установления соединения.

Последние два пункта не нужны для отправки части передачи файла, но вам нужно connectпозже для получения части.

Пример сеанса может выглядеть так:

# bluetoothctl 
[NEW] Controller 00:10:20:30:40:50 pi [default]
[bluetooth]# agent KeyboardOnly 
Agent registered
[bluetooth]# default-agent 
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:20:30:40:50 Discovering: yes
[NEW] Device 00:12:34:56:78:90 myLino
[CHG] Device 00:12:34:56:78:90 LegacyPairing: yes
[bluetooth]# pair 00:12:34:56:78:90
Attempting to pair with 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
[CHG] Device 00:12:34:56:78:90 Connected: no
[CHG] Device 00:12:34:56:78:90 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:34:56:78:90 Paired: yes
Pairing successful
[CHG] Device 00:12:34:56:78:90 Connected: no
[bluetooth]# connect 00:12:34:56:78:90
Attempting to connect to 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
Connection successful

Чтобы сделать изменения постоянными и чтобы устройство было активным после перезагрузки, необходимо udevправило:

/etc/udev/rules.d/10-local.rules

# Set bluetooth power up
ACTION=="add", KERNEL=="hci0", RUN+="/usr/bin/hciconfig %k up"

Совет : Замените KERNEL=="hci0"на, KERNEL=="hci[0-9]*"чтобы соответствовать всем интерфейсам BT.

После цикла приостановки / возобновления устройство может автоматически включаться с помощью специальной службы systemd:

/etc/systemd/system/bluetooth-auto-power@.service

[Unit]
Description=Bluetooth auto power on
After=bluetooth.service sys-subsystem-bluetooth-devices-%i.device suspend.target

[Service]
Type=oneshot
ExecStart=/usr/bin/hciconfig %i up

[Install]
WantedBy=suspend.target

Например, включите экземпляр устройства, используя имя вашего устройства Bluetooth bluetooth-auto-power@hci0.service.


Теперь ваши устройства сопряжены. Проверьте, что вы можете видеть другой с bt-device -l.

ОТПРАВИТЬ

Затем вы должны отправить свою systemdинфраструктуру для отправки на работу, в противном случае вы получите следующую ошибку:

Acquiring proxy failed: Error calling StartServiceByName for org.bluez.obex: GDBus.Error:org.freedesktop.systemd1.LoadFailed: Unit dbus-org.bluez.obex.service failed to load: No such file or directory.

Внесите необходимые systemdизменения с

systemctl --user start obex
sudo systemctl --global enable obex

Это гарантирует, что вы можете отправлять файлы. А sudoтакже в первой строке не получится !

Вы можете отправлять файлы сейчас bluetooth-sendto --device=12:34:56:78:9A:BC filename filename2. Если перевод зависает на 100%, a ctrlcзавершает его (или отменяет ранее).

Чтобы узнать имя вашего устройства (12: 34: 56: 78: 9A: BC), вы можете выдать bt-device -l.

ПОЛУЧАТЬ


с форума Raspberry Pi :

Мы хотим настроить push-сервер OBEX, поэтому он obexpushdбыл необходим.

Требуется флаг совместимости на демоне Bluetooth, вы должны отредактировать его /etc/systemd/system/dbus-org.bluez.serviceс помощью редактора по вашему выбору, добавив -Cфлаг в конец ExecStart=строки. Это должно выглядеть так:

ExecStart=/usr/lib/bluetooth/bluetoothd -C

Перезагрузите или перезапустите сервис sudo systemctl daemon-reloadпосле редактирования. Выберите конкретный каталог, в который будут помещены полученные файлы, например, с помощью sudo mkdir /bluetooth.

Запустите сервер sudo obexpushd -B -o /bluetooth -n, он должен ответить:

obexpushd 0.11.2 Copyright (C) 2006-2010 Hendrik Sattler
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
Listening on bluetooth/[00:00:00:00:00:00]:9

Если это не работает, и вы получите:

obexpushd 0.11.2 Copyright (C) 2006-2010 Hendrik Sattler
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
BtOBEX_ServerRegister: Address already in use
net_init() failed

это может быть связано с тем, что у вас запущен другой демон или программа, которая занимает канал 9 rfcomm, который obexpushdиспользует по умолчанию. В этом случае измените канал на 23 следующим образом:

sudo obexpushd -B23 -o /bluetooth -n

использовать канал 23.

После obexpushdзапуска откройте второе окно терминала. Вы можете убедиться, что сервис OBEX зарегистрирован в

sudo sdptool browse local

Он должен перечислить (на канале 23 в этом случае), среди прочего, это:

Service Name: OBEX Object Push
Service Description: a free OBEX server
Service Provider: obexpushd
Service RecHandle: 0x10005
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 23
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

В этом окне, пока obexpushdвсе еще работает, используйте bluetoothctlдля установки discoverable on. Теперь подключитесь к другому устройству. Сопряжение ДОЛЖНО быть выполнено во время obexpushdработы, иначе другое устройство не распознает доступную услугу. Если телефон уже подключен, удалите его с другого устройства, используйте его bluetoothctlдля удаления с компьютера Ubuntu и выполните повторное сопряжение.

После подключения (последний пункт в списке выше) вы сможете получать файлы. Они появятся в /bluetoothкаталоге. Обратите внимание, что они будут принадлежать пользователю root, поэтому вам потребуется sudo для доступа к ним. Или вы можете сделать chmod 0777 /bluetoothдля общедоступного каталога обмена, так как аутентификация Bluetooth основана на устройстве, а не на пользователе.

Чтобы автоматизировать команду obexpushd, создайте файл /etc/systemd/system/obexpush.service

[Unit]
Description=OBEX Push service
After=bluetooth.service
Requires=bluetooth.service

[Service]
ExecStart=/usr/bin/obexpushd -B23 -o /bluetooth -n

[Install]
WantedBy=multi-user.target

Затем установите его для автозапуска с

sudo systemctl enable obexpush

После перезагрузки или перезапуска службы sudo systemctl daemon-reloadвы сможете отправлять и получать файлы в обоих направлениях.

Не забудьте подключить устройства при попытке получения файлов.

emk2203
источник
Эти инструкции были дважды проверены с помощью телефона Android и ноутбука Ubuntu. Настройка, отправка и получение подтверждено для работы.
emk2203
Осторожно: /etc/systemd/system/dbus-org.bluez.serviceэто, скорее всего, символическая ссылка /lib/systemd/..., и вы не хотите изменять эту. Вы должны использовать переопределение: создайте /etc/systemd/system/dbus-org.bluez.service.dкаталог и поместите туда файл, оканчивающийся .conf(вроде add-compat-flag.conf), содержащий только: [Service] ExecStart= ExecStart=/usr/lib/bluetooth/bluetoothd -C(с правильными
переводами строк,