最短翌日発送!高速大容量のモバイルWi-Fiルーターの詳細はこちら
DIY・電子工作

Raspberry PiをBluetoothテザリングでスマートフォンと接続する方法

Bluetoothテザリングで接続したRaspberry Pi Zero WH DIY・電子工作

※この記事には広告(アフィリエイトリンク)が含まれますのであらかじめご了承ください。

ラズパイに限らず、無線でインターネットを利用する方法と言えばWi-Fiを思い浮かべる方が大半かと思いますが、双方の端末が対応していればBluetoothでインターネットに繋ぐことも可能です。

Bluetoothで通信するメリットは省電力であるということ。Wi-Fiと比較すると通信時の消費電力はもちろん待機電力も少ないので、テザリング親機を常時待機状態にしておいて子機であるラズパイの起動時にすぐインターネットに繋げられるようにしたいなら、Wi-FiよりもBluetoothのほうが向いています。

逆にデメリットは通信速度がかなり遅いということ。Bluetoothは大量に通信するような使い方には向いていません。しかしSSH接続してコマンドラインで操作するくらいならBluetoothでもまったく問題ないでしょう。

そこでAndroidスマートフォンやiPhoneなどを親機として、ラズパイをBluetoothテザリングでインターネットに接続する方法についてまとめておきます。

車内や屋外などWi-Fiがない環境で、ラズパイをインターネットに繋いだりスマートフォンからSSH接続したいなら、Wi-FiテザリングよりもBluetoothテザリングがおすすめです。

スポンサーリンク
スポンサーリンク

ラズパイでBluetoothテザリングを利用するための条件

ラズパイをBluetoothテザリングでインターネットに接続するためには、ラズパイとスマートフォンの両方がBluetooth PANに対応している必要があります。

ラズパイとスマートフォンがBluetooth PANに対応している

PANとはPersonal Area Networkの略で、Bluetoothプロファイルの一種です。PANをサポートしているBluetooth機器でなければ、Bluetoothテザリングを利用することはできません。

無線機能が搭載されているRaspberry Pi Zero W/WHなら後述するbt-panを導入することで対応させることが可能ですが、無線機能が搭載されていないモデルでUSB接続のBluetoothアダプターを使用する場合は、USBアダプターがPANをサポートしていなければBluetoothテザリングは利用できないということになります。

USBアダプター、USBドングル等でBluetoothテザリングに対応させるなら、サポートしているプロファイルに注意してください。LBT-UAN05C2のようなPANに対応している製品を購入しましょう。

スマートフォンの場合はわざわざ対応プロファイルを調べなくても、Bluetoothテザリングが可能かどうかで調べればOKです。まあ最近の機種なら概ね対応しているでしょう。

Aterm MR05LNやSpeed Wi-Fi NEXT W06などのモバイルWi-Fiルーターについても、Bluetoothテザリングに対応している機種なら同じように使用することが可能です。

ラズパイをBluetoothテザリングでインターネットに接続する

ここではRaspberry Pi OS LiteをインストールしたRaspberry Pi Zero WHを用いて、Bluetoothテザリングを利用するための手順を具体的に解説していきます。

Raspberry Pi OSのインストール方法や初期設定についてはこちらの記事を参照してください。

Raspberry Pi OS、旧Raspbianのインストールと初期設定
新型コロナウイルスにかかる緊急事態宣言で外出を自粛していた頃、唐突にRaspberry Piで何かを作ってみたくなりまして。思い付きでドライブレコーダーを自作してみました。 そのRaspberry Pi Zero WHに実装したコマンドやら...

ラズパイとスマートフォンのBluetoothを有効化する

まずはラズパイとスマートフォンのBluetoothをON、有効化しましょう。

スマートフォンについては機種やOSバージョンによっても設定画面が異なったりするので、細かい説明は割愛します。ついでにBluetoothテザリングもONにしておいてください。

ラズパイのBluetoothを有効化するためには、bluetoothctlコマンドを使用します。

$ sudo bluetoothctl
Agent registered
[bluetooth]#

Agent registeredされてこのような表示に切り替わったら、pwoer onを実行してください。

[bluetooth]# power on
Changing power on succeeded

無事有効化されたらペアリング作業に進みます。

ラズパイとスマートフォンをペアリングする

BluetoothをONにできたら、ペアリング作業を行いましょう。

scan onを実行すると下記のようなログが断続的に流れるようになります。

[bluetooth]# scan on
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes
[NEW] Device XX:XX:XX:XX:XX:XX Galaxy S20 5G

ここに接続したい親機のMACアドレスが表示されているか確認してください。親機のMACアドレスは、例えばAndroidスマートフォンなら端末情報のステータスから確認することもできますが、ログに端末の名称が一緒に表示されるのですぐに特定できるでしょう。

MACアドレスを特定したら、pairコマンドでペアリングします。途中6桁のパスコードが一致しているか確認を求められるので、間違いなければyesと入力しましょう。

[bluetooth]# pair XX:XX:XX:XX:XX:XX
Attempting to pair with XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Request confirmation
[agent] Confirm passkey 000000 (yes/no): yes

Pairing successful

認証すると20行ほどのログが流れ、Pairing successfulと表示されたらペアリング成功です。

ついでに信頼する端末として登録しておきましょう。

[bluetooth]# trust XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded

ここまで済んだらquitでbluetoothctlを終了します。

[bluetooth]# quit

ラズパイにbt-panを導入する

ラズパイでBluetooht PAN接続を可能にするために、下記のブログで紹介されているbt-panを利用します。

Raspberry PiからBluetoothを使ってiPhoneでテザリング 2017年版 - count0.org

記事を参考にGitHubからスクリプトをダウンロードして、実行権限を付与します。

$ wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
$ sudo chmod 0755 bt-pan

ただRaspberry Pi OSのLiteを利用しているせいか、この状態でBluetooth PAN接続を試みてもモジュールがないと怒られてしまったので、適当なモジュールをインストールします。

$ sudo apt-get install pulseaudio-module-bluetooth

これでBluetoothテザリングの下準備は完了です。

ラズパイでBluetooth PAN接続を実行する

$ sudo bt-pan client XX:XX:XX:XX:XX:XX

上記のコマンドを実行すると、ラズパイがスマートフォンと自動的に接続してBluetoothテザリングが行われます。

ipコマンド、もしくはifconfigコマンドなどでIPアドレスが払い出されていることを確認できるはずです。

$ ip a

4: bnep0:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether b8:27:eb:97:38:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.44.198/24 brd 192.168.44.255 scope global dynamic noprefixroute bnep0

いくつかの項目が表示されますが、bnep0の192.168.x.xがBluetoothテザリングでラズパイに払い出されたIPアドレスになります。

このIPアドレスを利用すれば、Wi-Fiに繋がなくてもインターネットを利用したり、スマートフォンからSSH接続が可能です。

ちなみに-dを付け加えてコマンドを実行するとBluetooth PAN接続が切断されます。

$ sudo bt-pan client XX:XX:XX:XX:XX:XX -d

ただBluetooth PANは同時に複数の端末と接続することが可能ですし、Wi-Fiと同時に利用することさえも可能なので、恐らくわざわざ切断しないといけないようなケースはまずないです。

さて、ここまででBluetoothテザリングでインターネットに接続するという目的は達成できましたが、これをsystemdに登録してラズパイ起動時に自動的に接続するように設定しておきましょう。

ラズパイ起動時に自動でBluetooth PAN接続するように設定する

Wi-Fiとは異なり、bt-panを導入しただけでは自動的にBluetooth PAN接続はしてくれません。

ラズパイの起動と同時に接続してほしいなら、コマンドをスクリプト化してsystemdに登録しましょう。

systemdに登録するためのスクリプトを作成する

まずはスクリプトを作成します。

$ sudo nano /opt/bt-pan.sh

スクリプトの中身は先ほど実行したコマンドのコピペでOKです。

sudo bt-pan client XX:XX:XX:XX:XX:XX

もし複数の親機へ接続したければ&で区切ってコマンドを繰り返し記述します。

sudo bt-pan client XX:XX:XX:XX:XX:XX &
sudo bt-pan client YY:YY:YY:YY:YY:YY

もっとスマートな書き方があるのかもしれませんが…これならスクリプトを1つ実行するだけで接続可能な端末すべてとBluetoothテザリングを行うことができます。

作成したスクリプトに実行権限を付与しておきましょう。

$ sudo chmod 0755 /opt/bt-pan.sh

サービスユニットファイルを作成してsysmtemdに登録する

スクリプトをサービスとしてsystemdに登録するため、ユニットファイルを作成します。

$ sudo nano /etc/systemd/system/bt-pan.service
[Unit]
Description = Bluetooth Tethering

[Service]
ExecStart = /opt/bt-pan.sh
Type = oneshot

[Install]
WantedBy = multi-user.target

今回はスクリプトを実行するのは基本的に1回限りで、バックグラウンドで実行し続ける必要がないのでType=oneshotにしておきます。

デフォルトのsimpleでもスクリプトは実行されてBluetoothテザリングは行われますが、ラズパイにはサービスの起動に失敗したと認識されてしまうのでType=oneshotにしておきましょう。

最後はお決まりのWantedBy=multi-user.targetです。これでラズパイの起動と同時にサービスも起動します。

なおrestartオプションを設定すると正常に起動しなくなるので注意してください。私はそこでちょっとハマりました。。

サービスのユニットファイルを作成したら有効化、起動してみましょう。

$ sudo systemctl enable bt-pan.service
$ sudo systemctl start bt-pan.service

systemctlコマンドの手打ちでBluetoothテザリングが開始されたら、最後にラズパイを再起動させても自動的に接続されるか確認してください。問題なく接続されれば一応完成です。

ところで、systemdにサービスを登録しただけだと接続を試みるのはラズパイ起動時の1回のみとなってしまいます。

例えばスマートフォンを再起動してBluetoothテザリングが無効になっていることに気付かずラズパイを起動した場合、後からスマートフォンのBluetoothテザリングを有効化しても自動的には接続されません。再度接続を試みるには、ラズパイの電源を落として入れ直すしか方法がないのです。

この問題はsystemdにタイマーを登録することで解決します。

ラズパイ起動後も自動でBluetooth PAN接続するように設定する

systemdには定期的にサービスを実行するための仕組みとしてtimer、タイマーがあります。

このタイマーを利用して一定時間毎にBluetooth PAN接続を試みるようにしておけば、Bluetoothテザリングを有効化するのを忘れていたり、あるいは誤ってBluetoothテザリングを終了してしまった場合でも、何度でも自動的に再接続させることが可能です。

systemdにtimerのユニットファイルを登録する

ユニットファイルの作成方法自体はサービスと似ていますが、拡張子がtimerであることに注意してください。

$ sudo nano /etc/systemd/system/bt-pan.timer
[Unit]
Description = Repeat Bluetooth Tethering

[Timer]
OnBootSec = 1min
OnUnitActiveSec = 5min
Unit = bt-pan.service

[Install]
WantedBy = multi-user.target

まずOnBootSecでラズパイ起動からどれだけの時間が経過したら実行させるのかを指定します。ラズパイ起動から1分後に実行させるならOnBootSec=1minです。もっと短時間で接続を試みたいなら30sなど、他の単位でも指定できます。

次にOnUnitActiveSecで再実行させる時間の間隔を指定します。5分毎に再実行させたいならOnUnitActiveSec=5minです。

Unitには再実行させたいサービスのユニットファイルを記述してください。WantedByはいつものやつですね。

ユニットファイルを作成したら有効化しましょう。

$ sudo systemctl enable bt-pan.timer

これで強制的にラズパイの電源を切らなくても、定期的にBluetooth PAN接続を試みさせることが可能です。

まとめ

ラズパイはBluetoothに対応しているモデルなら、bt-panを導入することでBluetoothテザリングでスマートフォンと接続することが可能です。

systemdを利用すればWi-Fiと同じように自動的に接続させることも可能なので、使い勝手もほとんど変わりません。

通信速度は確実に遅くなるでしょうけれども、それもSSH接続でコマンド操作するだけなら違いを体感することはないでしょう。

ラズパイとスマートフォン、それぞれの消費電力を抑えたいなら、Wi-FiテザリングではなくBluetoothテザリングを利用することをおすすめします。

コメント

タイトルとURLをコピーしました