bt-panがない (Raspberry PiでBluetoothテザリング)

Raspberry PiでBluetoothテザリングをしたいものの、巷の解説記事によくあるbt-panがダウンロードできない！ということでお困りの方へ。


# TL;DR (bookworm以降)

## コマンドラインで行うBluetoothテザリング

Network Managerの導入により、bt-panを用いた以前の方法だとネットワークデバイス(bnep0)は作られるものの、追加の操作(`sudo dhclient bnep0`)をしないとIPアドレスが割り振られないため、おとなしくNetwork Managerのお作法に従う方がよいです。

```console
# 接続
$ sudo nmcli d connect (接続先の機器のMACアドレス)
or
$ sudo nmcli con up (プロファイル名)

# 切断
$ sudo nmcli d disconnect (接続先の機器のMACアドレス)
or
$ sudo nmcli con down (プロファイル名)
```

- 接続先の機器のMACアドレス(例:12:34:56:78:9A:BC)は事前にペアリングをして、アドレスを取得してください。
  - Bluetoothペアリングは、[Raspberry Pi Zero(W, WH, 2 W)のセットアップの「(オプション)Bluetoothテザリングによるネットワーク設定」](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573#オプションbluetoothテザリングによるネットワーク設定)等を参照ください。
- プロファイル名は、`nmcli connection` コマンドで表示される3つ目の項目 `TYPE` が `bluetooth` の行の1つ目の項目 `NAME` の値を入れます。下の例だと `"XXX Network"`(XXXはペアリング先の携帯電話のBluetooth表示名が入る)になります。

```
NAME           UUID   TYPE       DEVICE
preconfigured  (省略)  wifi       wlan0
lo             (省略)  loopback   lo
XXX Network    (省略)  bluetooth  --
```

- Network Manager経由の操作だと`sudo`が必須なので、以前の方法のようにユーザー権限のプログラムでdbus経由で叩いて完結、ということができなくなりました。

## 起動時に行うBluetoothテザリング

nmcliコマンドで設定を変更します。/etc/rc.localやsystemdに頼る必要はありません。

```console
$ sudo nmcli c modify (プロファイル名) connection.autoconnect yes
```

確認方法

```console
$ nmcli c show (プロファイル名)

connection.id: ~
(中略)

(変更前)
connection.autoconnect:                 no
(変更後)
connection.autoconnect:                 yes
```


## デスクトップ環境で行うBluetoothテザリング

まず、デスクトップ右上にあるBluetoothのアイコンからペアリングを行います。(特に手順は示しません)

さらに以下の手順でBluetoothテザリングを実施します。

- Wifiのアイコンをクリック
- 「高度なオプション」＞「接続を編集する」
- Bluetoothの接続をダブルクリックで編集
- 何も更新せずに「保存」を押すと、接続が始まります。
  - 正確には"Connect automatically with priority"にチェックがついている必要あり


# TL;DR (bullseye以前)

bt-panの代わりが欲しい方はこちらをお使いください。

```console
$ wget https://gist.githubusercontent.com/hishizuka/d66189ec81316945c33531f7d4ddc68d/raw/319621b045254002beb774c701eafe0fc21c0f02/bt-pan
```

本家 (https://github.com/mk-fg/fgtk) では[2022/12にpython2系スクリプトは削除](https://github.com/mk-fg/fgtk/commit/13c6db9c828b3cb3c7c65867641f98dddc38f3d2)ということで、配布終了してしまったようです。
ただ、有名なスクリプトであり、ライセンスが[WTFPL(どうとでも勝手にしやがれクソッタレ・公衆利用許諾(契約)書）)](https://ja.wikipedia.org/wiki/WTFPL)であるため、python3に対応した版を[Github Gist](https://gist.github.com/hishizuka/d66189ec81316945c33531f7d4ddc68d)で公開しました。

Bluetoothテザリングはここに示すコマンドだけではできず、事前にペアリングが必要です。
[Raspberry Pi Zero(W, WH, 2 W)のセットアップの「(オプション)Bluetoothテザリングによるネットワーク設定」](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573#オプションbluetoothテザリングによるネットワーク設定)等を参照ください。

## コマンド1発でもできます(dbus-send)

bt-panの中身を紐解くと、Linuxの[BluezのNetwork API](https://github.com/bluez/bluez/blob/master/doc/network-api.txt)をD-Bus経由で叩いているだけで、接続はConnectメソッドを、切断はDisconnectメソッドを実行します。
D-Busをコマンドで操作できる`dbus-send`を使い、コマンド1発でもできます。

接続
```console
$ dbus-send --system --print-reply --type=method_call --dest=org.bluez /org/bluez/hci0/dev_12_34_56_78_9A_BC org.bluez.Network1.Connect string:"nap"
```

Bookwormの場合、IPアドレスが取得できないので、以下を追加で実行。

```console
$ sudo dhclient bnep0
```

切断
```console
$ dbus-send --system --print-reply --type=method_call --dest=org.bluez /org/bluez/hci0/dev_12_34_56_78_9A_BC org.bluez.Network1.Disconnect
```

コマンドの途中にある /org/bluez/hci0/dev_12_34_56_78_9A_BC について、

- hci0 をお使いのbluetoothアダプタに変更(通常はそのまま。USBドングルを使う場合は`hciconfig`で確認)
- dev_12_34_56_78_9A_BC は接続先の機器のMACアドレス 12:34:56:78:9A:BC の区切り文字をアンダーバーに変換したものにしてください。