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

Raspberry Pi 3のBluetoothを使ってネット接続をしたいと思い実験しています。
ネットで検索すると古いOSバージョンでの例が多く引っかかります。なにやら複雑そうな手順が多いですね。最近のバージョンではどうしたらよいのだろう?

今回はRPi3からスマートフォンのテザリングへの接続手順をメモしておきます。とても簡単な手順で接続できました。



Raspberry Pi 3のBluetoothを使ってスマートフォンと接続したいと思い実験しています。目的は単純にSSH接続をBluetoothでしたいだけ。
一応、スマートフォンのBluetoothテザリングへの接続ができました。逆にRPi3をアクセスポイントとしてスマートフォンからRPi3へ接続しインターネットへつなぐ事もできました。しかしながら、思ったルーティングができないでいます。
今回はRPi3からスマートフォンのBluetoothテザリングへの接続手順をメモしておきます。

今回の例で使うRPi3のOSはRASPBIAN JESSIE WITH PIXELです。この記事公開時で一番新しいものです。
$ uname -a
Linux raspberrypi 4.4.41-v7+ #942 SMP Mon Jan 9 15:00:25 GMT 2017 armv7l GNU/Linux

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

Bluetoothではペアリングをしないと話が始まりません。"blutoothctl"コマンドを使うそうです。OSを入れたら最初から使えます。ですが面倒そうなのでここはUIを使ってペアリングしましょう。RPi3でデスクトップを表示しましょう。

まず、スマートフォンのbluetoothの設定画面を開き検索で表示されるようにします。
次に、RPi3のデスクトップのBluetoothアイコンをクリックして"Add Device..."をクリックします。
スマートフォンが見つかったら"Pair"ボタンを押します。
スマートフォンとRPi3の双方でペアを承認します。

ペアリングが成功しても接続はされません。使えるプロファイルが今は存在しないからです。
次はRPi3側でBluetoothのネットワークプロファイルを使えるようにします。

Personal Area Network(PAN)を使えるようにする

RPi3でBluetoothのネットワークを使うにはPersonal Area Network(PAN)というプロファイルを使えるようにしなくてはなりません。
そのためにbt-panというスクリプトを使うようです。
mk-fg /fgtk / bt-pan 
このスクリプトをホームディレクトリにダウンロードします。
wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
実行許可を与えます。
chmod +x bt-pan
スクリプトの説明はこちらにありました。
bt-pan https://github.com/mk-fg/fgtk#bt-pan
これで接続の準備ができました。

スマートフォンのBluetoothテザリングを使いRaspberry Pi 3をインターネットへ接続する

スマートフォンのテザリングへRPi3をつないでみましょう。
まずはスマートフォン側を設定します。Bluetoothテザリングの設定画面を表示させます。Bluetoothテザリングを有効にします。

次はRPi3の設定です。
スマートフォンのbdaddrを見つけます。bdaddrとはスマートフォンのbluetoothのIDです。ターミナルから"bluetoothctl"とコマンドを打つと次の様に表示されるでしょう。
$ bluetoothctl
[NEW] Controller B8:27:xx:xx:xx:xx raspberrypi [default]
[NEW] Device 00:EB:xx:xx:xx:xx Smartphone1
[NEW] Device 84:8E:xx:xx:xx:xx Smartphone2
テザリング先のスマートフォンはSmartphone1だとすると"00:EB:xx:xx:xx:xx"が必要なbdaddrです。
"quit"といれblutoothctlコマンドから抜け出ます。

このbdaddrへbt-panを使って接続します。次のコマンドを入れます。
sudo ./bt-pan --debug client 00:EB:xx:xx:xx:xx
スマートフォンにテザリングの表示がされれば接続成功です。このコマンドを入れる前にスマートフォンでBluetoothテザリングを有効にしておくのを忘れないでください。

ipアドレスを確認してみましょう。
$ ip a
11: bnep0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether b8:27:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.44.173/24 brd 192.168.44.255 scope global bnep1
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
上の例の様にbnep0というインターフェースができているでしょう。
これでスマートフォン経由でインターネットにつながります。
上のbnep0のIPアドレスでスマートフォンからRPi3へSSH接続ができます。

systemdで動かしてみる(動いてない)

systemdに登録してみます。やり方はこちらに倣います。
Bluetooth PAN Client with Systemd / The Blind Guru
"Configuring the client is also quite easy to do with Systemd."
"pan-client.network"というファイルと"pan@.service"というファイルを示されたフォルダに作ります。"pan@.service”内のbt-panがある場所が異なる場合は修正しましょう。今回の例ではホームディレクトリにbt-panがあるので
"/home/pi/bt-pan" としておきます。
ファイルを置いたら再起動します。そして
systemctl start pan@00:EB:xx:xx:xx:xx
としておけば良いようです。が・・・
動きませんでした。
bt-panで"--systemd"を指定すると
ImportError: No module named systemd
とエラーが出て動きません。
なんのエラーなのでしょう?
とりあえずpython-systemdを眺めて必要そうなパッケージを確認するも良くわかりませんでした。

raspbian jessieの次のバージョンではカーネルバージョンが上がりそうなのでこの問題はしばらく放置します。

まとめ

Bluetoothテザリングへの接続は複雑そうだなぁと思っていましたが、スクリプトを一つ入れるだけでできるようになります。
routeを見るとBluetoothテザリングはeth0の次の優先順位となっていました。
$ route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         router          0.0.0.0         UG    202    0        0 eth0
default         192.168.44.1    0.0.0.0         UG    217    0        0 bnep0
default         router          0.0.0.0         UG    303    0        0 wlan0
192.168.11.0    *               255.255.255.0   U     202    0        0 eth0
192.168.11.0    *               255.255.255.0   U     303    0        0 wlan0
192.168.44.0    *               255.255.255.0   U     217    0        0 bnep0
テザリング接続しても有線LANがつながっていればそちらを使うようです。WiFiのwlan0より優先順位は高いのでWiFiは使わなくなります。

SSH接続もBluetoothでできます。
しかしながら、自動的にスマートフォンとつながってくれないとあまり利用価値がないです。外出先でお手軽につなぐ手段としてBluetoothを使いたいのですが、bt-panコマンドを入力するという事は他の方法でRPi3へつながっているという事です。Bluetoothをつなぐ意味がないです。

systemdオプションとwaitオプションの挙動がよくわかっていません。再接続まで面倒をみてくれるのかな?と期待したのですがそういうわけでも無いようです。

次回はRPi3側をインターネットのアクセスポイントとして使う手順をメモする予定です。




コメント

最近のコメント

Threaded Recent Comments will be here.