count0.org

Raspberry PiからBluetoothを使ってiPhoneでテザリング

06 February 2014 raspberrypi

Raspberry Pi Type Bの256MBは持っていたのですが、物欲が暴走してType B 512MBMOD MY PIで手に入れました。 Pibow Ninjaとセットで送料込みの$68でした。

このRaspberry Piを鞄に忍ばせ、外出先でiPhoneのテザリングを使って通信ができると素敵かもしれないと思ったので、iPhoneとテザリングできるようにしました。

OSはRasbian。NOOBSを使い簡単にインストールしました。USB BluetoothアダプタはBT-MICRO4を使いました。特別なことをしなくても起動時に認識します。

Bluetoothの設定

BlueZがLinuxでよく使われているようです。

sudo apt-get update
sudo apt-get install bluetooth bluez-utils bluez-compat

身近なBluetoothデバイスをスキャンします。

hcitool scan

デバイスが検出されたら、MACアドレスとデバイス名が表示されます。MACアドレスは後々使うので、コピーかメモを残すことをオススメします。

Bluetoothキーボードを接続する

Riitek Rii mini Bluetooth keybord RT-MWK02というBluetoothキーボード接続します。余談ですが、Kicksterterで資金を募っていたKanoのキーボードだけ欲しいです。

キーボードをペアリングします。以下sshで作業します。

sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX # XX:XX:XX...はMACアドレス

PINコードの入力を聞かれるので適当な番号を4桁ほど入力します。(自分でPINコードを決めるのです。)
その後、ペアリングしたいキーボードでPINコードを入力し、Enterキーを押します。

さらに再起動してもペアリングを保持するには

sudo bluez-test-device trusted XX:XX:XX:XX:XX:XX yes
sudo bluez-test-input connect XX:XX:XX:XX:XX:XX

一連の作業を通してGUIのBluetooth接続が如何に便利なものか実感できます。

iPhoneとBluetooth接続する

iPhone側の準備として、設定からモバイルデータ通信をオンに、BluetoothをオンにしてBluetooth経由でテザリングができるようにしておきます。

hcitool scan # iPhoneのMACアドレスを取得
sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX # ペアリング

ペアリングで失敗します。解決方法はbluez-simple-agentを少々修正します。
capability = "KeyboardDisplay"capability = "DisplayYesNo"に書き換えます。
以下のコマンドかエディターで書き換えます。

sudo perl -i -pe 's/KeyboardDisplay/DisplayYesNo/' /usr/bin/bluez-simple-agent

再度ペアリングを試みるとPINコードのかわりにYes/Noと表示されます。ここでyesを入力してペアリングします。iPhone側でも許可ペアリングを許可します。そしてペアリングを保持します。

sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX # ペアリング
sudo bluez-test-device trusted XX:XX:XX:XX:XX:XX yes

テザリング

ペアリングとテザリングが成功するとbnep0というインタフェースになるので、予め設定を書き込んでおきます。そしてPAN接続でテザリングです。

echo "echo 'iface bnep0 inet dhcp' >> /etc/network/interfaces" | sudo sh
sudo pand -c XX:XX:XX:XX:XX:XX -role PANU --persist 30

テザリングできている場合はbnep0にIPアドレスが振られています。ifconfigで確認できます。

ifconfig bnep0

そして、起動時にテザリングができる場合は自動接続するように/etc/rc.localにPAN接続のコマンドを記述しておきます。

pand -c XX:XX:XX:XX:XX:XX --role PANU --persist 30

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0

eth0もしくは無線LANでwlan0のインタフェースが優先されるようで、どちらも接続されていない時にbnep0が通信に使われました。これはmetricの値を変更すれば良いと思いますが、ここまで設定して力尽きました。

参考