Raspberry PiからBluetoothを使ってiPhoneでテザリング
この情報はとても古いので2017年における方法を書きました。よければそちらを参考にしてください。
Raspberry Pi Type Bの256MBは持っていたのですが、物欲が暴走してType B 512MBをMOD 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の値を変更すれば良いと思いますが、ここまで設定して力尽きました。