web-dev-qa-db-ja.com

端末からbluetooth経由で2台のコンピューター間でファイルを共有する

コンソールモードでLinuxを実行し、Windows 10で1つを実行している2台のコンピューターを隣接しています。最初は、USBを接続して次の手順を実行することを考えました。

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

そして、USBデバイスを取り外して他のコンピューターに接続し、ファイルを転送します。しかし、なぜBluetoothを使用してファイルを直接共有しないのでしょうか?

そのコンピューターにGUIがないため、ターミナルからbluetoothを使用できますか?私はこれについての経験がありませんので、可能であれば詳細な回答が必要です。

8
user608410

まず、apt install bluez-tools obexpushdが必要です。

ファイルを送受信するには、最初にデバイスをセットアップしてペアリングする必要があります。

セットアップ


Arch Wiki-bluetoothから

Bluetoothctl

bluetoothctl対話型コマンドを開始します。 helpを入力して、使用可能なコマンドのリストを取得できます。

  • power onと入力して、コントローラーの電源を入れます。デフォルトではオフです。
  • devicesと入力して、ペアリングするデバイスのMACアドレスを取得します。
  • デバイスがまだリストにない場合は、scan onコマンドでデバイス検出モードに入ります。
  • agent onでエージェントをオンにします。
  • pair MAC Addressを入力してペアリングを行います(タブ補完が機能します)。
  • PINなしでデバイスを使用している場合、デバイスが正常に再接続するには、デバイスを手動で信頼する必要があります。 trust MAC Addressと入力してください。
  • 最後に、connect MAC_addressを使用して接続を確立します。

ファイル転送の送信部分には最後の2つの箇条書きは必要ありませんが、受信部分には後で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"

TipKERNEL=="hci0"KERNEL=="hci[0-9]*"に置き換えて、すべてのBTインターフェイスに一致させます。

サスペンド/レジュームサイクルの後、カスタムsystemdサービスを使用してデバイスの電源を自動的にオンにできます。

/etc/systemd/system/[email protected]

[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

[email protected]などのBluetoothデバイス名を使用して、ユニットのインスタンスを有効にします。


これでデバイスがペアリングされました。 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%でハングした場合、 ctrlc ファイナライズします(またはより早く中止します)。

デバイス名(12:34:56:78:9A:BC)を知るには、bt-device -lを発行します。

受信する


Raspberry Piフォーラムから

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

obexpushdがデフォルトで使用するrfcommチャネル9を占有する別のデーモンまたはプログラムが実行されていることが原因の可能性があります。この場合、次のようにチャネルを23に変更します。

Sudo obexpushd -B23 -o /bluetooth -n

チャネル23を使用します。

obexpushdを実行したら、2番目のターミナルウィンドウを開きます。 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ディレクトリに表示されます。これらはルートによって所有されることに注意してください。したがって、アクセスするにはSudoが必要です。または、ブルートゥース認証はユーザーベースではなくデバイスベースであるため、パブリック交換ディレクトリに対してchmod 0777 /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を使用してサービスを再起動または再起動すると、両方向でファイルを送受信できるようになります。

ファイルを受信しようとするときは、デバイスを接続することを忘れないでください。

3
emk2203