RaspberryPiにbluetoothでログインする方法

こんにちは、Kanazawa.IoTの井澤です。

前回、Raspberry Pi(以下 RPi)のインストールイメージを事前に書き換えるこ
とで、沢山のRPiノードを運用することを容易にしました。

今回はRPiのBluetoothを利用してログインできるようにしてみたいと思います。

RPiを操作しようと思うと大体以下のような選択肢があるのではないでしょうか。

1. USBキーボードとHDMIディスプレイを接続する
2. IPネットワーク越しにsshなどを使ってリモートログインする
3. TTL-USBシリアルケーブルを接続して、別のPCからUSBシリアルログインする

もちろん上記3つのどれでも利用できますし、それで不満がないのであれば良いでしょう。
私の場合、
1.はキーボードやディスプレイを設置する広さが必要なのが不満でした。
2.はリモートから接続できて便利なのですが、IPアドレスが事前に分かっていないと接続できない(宅内のdhcpを使っているので)のが不満でした。
3.はかなり理想に近いのですが、有線でいちいち物理接続する必要があるのが大変面倒です。また誤ったピンに挿す可能性も排除したいです。

そこで、最新のRPiにはBluetoothが搭載されており、これをシリアルコンソールとして利用できることが分かったので紹介したいと思います。

今回対象としたRPiは、RPi3 Model B です。また利用したOSは Raspbian stretch lite の 2018-04-18 です。
またリモートログイン元として macOS を利用しました。

RPi側の設定

まずはBluetoothでログイン出来るようにしたいRPiにログインします。

以下のコマンドを実行します。

> sudo sdptool add SP
Serial Port service registered

これで、Service Discovery Protocol で Serial Profile をアドバタイズするようになります。

PRiに名前をつける

ペアリングをする前に RPiに名前をつけてやりましょう。

デフォルトでは「raspberrypi」という名前になっていますが、複数のRPiを運用するときにどれがどれだかわからなくなってしまいます。

まず、bluetoothd を停めます。

> sudo systemctl stop bluetooth

次に設定ファイルに追記します。

設定ファイルは、RPiの初回起動時に作成されます。

また、ディレクトリ名がRPiのBluetoothに搭載されているMacアドレスになるため、以下の「aa:bb:cc:dd:ee:ff」の部分は皆さんそれぞれの環境に読み替えてください。

設定ファイルにAliasの行を追加します。

> sudo vi /var/lib/bluetooth/aa:bb:cc:dd:ee:ff/settings
[General]
Discoverable=false
Alias=MyPi3  ←好きな名前をいれる

書き換えたらbluetoothdを再度立ち上げておきます。

>sudo systemctl start bluetooth

ペアリングする

次に、PRiとmacの間で bluetooth のペアリングをしていきます。

> sudo bluetoothctl -a
[NEW] Controller B8:27:xx:xx:xx:xx MyPi3 [default]
[bluetooth]# discoverable on ←入力する
Changing discoverable on succeeded

この状態で、mac の 「システム環境設定」> 「bluetooth」を開くと、「MyPi3」(例の場合)が見えると思います。

「ペアリング」ボタンを押すとペアリングが成功します。

一瞬「接続中」になったあと、すぐに「未接続」になります。

この際、mac側には
/dev/tty.MyPi3-SerialPort
というシリアルデバイスが生えていればOkです。

ログイン用の設定

次に、RPi側でこのBluetoothのシリアルにgettyを上げてあげればログインできるようになります。

まずは、
/etc/systemd/system/rfcomm.service
というファイルを新規作成します。

> sudo vi /etc/systemd/system/rfcomm.service

内容は以下です。

[Unit]
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service

[Service]
ExecStart=/usr/bin/rfcomm watch 0 1 /usr/bin/setsid /sbin/agetty rfcomm0 115200 linux

[Install]
WantedBy=multi-user.target

ファイルを作成したらシステムに登録して再起動します。

> sudo systemctl enable rfcomm
> sudo reboot

これでRPiが立ち上がってきたら、bluetoothでシリアル接続できます。

接続してみる

接続方法は、mac 側から

> sudo cu -l /dev/tty.MyPi3-SerialPort -s 115200

で接続できます。ログインプロンプトが表示されるはずです。