ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

Debian Linux on キングジム ポメラDM200でiPhoneとBluetoothテザリングするための設定方法

      2018/12/13

Settings for bluetooth tethering with debian linux on pomera dm200 and iphone 00000

キングジムのテキスト打ち端末、ポメラDM200は、@ichinomoto氏の尽力により、Debian Linux(Stretch)が動作するようになっています。

元々のDM200の素性の良さもあり、これまで自分が触れた勝手インストールLinuxの中で、総合的に最も実用的な動作をするんじゃないかと評価しています。

  • 自分がDebian Linux on DM200を実用的だと思っている点:
    • 一般的なノートパソコンと同等水準の秀逸なキーボード
    • Micro USBからの給電で動くため、モバイルバッテリーでバッテリーライフをいくらでも延命でき、電源問題が実質的にない
    • そもそも電池がかなり持つ
    • サスペンドが有効
    • サスペンドさせてもバッテリードレインは比較的軽微
    • サスペンドの動作が十分安定している
    • 元々のポメラ環境を壊さないでマルチブートによりDebian Linuxが共存可能
    • Debian LinuxはSDカード上にインストールするため安全
    • ポメラ環境とDebian Linux環境の切り替えが意外と早くでき無理なく併用が可能

何をもって実用的とするかは人それぞれ基準が違うかと思いますが、インストール遊びの水準を超えていることは確かです。

ただ、WiFiの再接続が不安定(※)、Bluetoothテザリング(Bluetooth PAN)は設定方法が不明という、通信に不安を残す状態でした。

※起動から初回のWiFi接続は大体つながるが、切断後の再接続が失敗することが多かった。

2018年3月にDM200のファームウェアがVer.1.4にアップデートされ、WiFi接続が改善されたことがDebian Linux側にも波及しているという話で、実際そのような感触もあります。

また、今回これまで不明だったiPhoneとBluetoothテザリング(Bluetooth PAN)する設定が判明したため、俄然Debian Linux on DM200は輝きを増しました。

例えば、ポメラ環境からDebian Linux環境への切り替え直後から自動的にBluetoothテザリングを開始する設定も可能です。

BluetoothテザリングはWiFiテザリングと違い、一度設定を済ませてしまえばiPhone側の操作を必要とせず、DM200側の操作のみで接続・切断が可能、また消費電力が少なく便利です。

上掲の動画は説明のためにiPhoneを隣に並べ、使用状態にして撮影していますが、本来iPhoneはカバンの中にしまったままでもOKです。

Debian Linux側をバリバリ使う用がなくとも、ネットワークを使う単一処理、例えばDropbox同期などを仕込んでおくだけでも便利かと思います。

Bluetoothテザリング設定方法

設定手順は以下のようになります。

bt-panコマンドなどのインストール

まずは必要なものをインストール。

sudo apt update
sudo apt install pulseaudio-module-bluetooth python-dbus -y
wget https://raw.githubsercontent.com/mk-fg/fgtk/master/bt-pan
chmod +x bt-pan 
sudo chown root: bt-pan 
sudo mv bt-pan /usr/bin/

DHCP関係の設定

以下の内容を「/etc/network/interfaces.d/bnep0」として新たにファイルを作成し、保存します。(匿名さんコメント欄にて情報ありがとうございます)

allow-hotplug bnep0
iface bnep0 inet dhcp

ペアリング

続いてiPhoneとのペアリングです。

  1. [iPhone側]「Bluetooth」をオンに。「設定>Bluetooth」を開いたままにしておく。
  2. [DM200側]以下を実行。
    • sudo /opt/bin/bt_switch on
      pulseaudio -D
      sudo bluetoothctl
      scan on
      pair XX:XX:XX:XX:XX:XX
      trust XX:XX:XX:XX:XX:XX
      connect XX:XX:XX:XX:XX:XX
      quit
      
    • bt_switch onするとドバーっとログが流れてきますが、それで正常。目障りだからといってこれを>/dev/nullすると動かなくなるので放置。
    • scan on後、iPhoneを検出することを知らせるログが流れてくるまで待機。
    • iPhoneが見付かったら、そのBluetoothアドレスを引数にpairコマンドを実行。Bluetoothアドレスは途中まで打てばTabで補完できます。iPhone側でダイアログが表示されるので、ペアリングを承認します。
    • 後で使用するので、判明したiPhoneのBluetoothアドレスを控えておきます。
    • pulseaudioは、bluetoothctlでペアリングを済ませるまで必要。通常のbt-panコマンド使用時は起動する必要はありません。
    • pulseaudioを起動しておかないとbluetoothctlでconnectコマンドを実行するときに失敗します。

テスト接続

  1. [iPhone側]「設定>Bluetooth」にdm200のエントリが増えているので、接続中になっているか確認。
  2. [iPhone側]「設定>インターネット共有」で「インターネット共有」をオンに。
  3. [DM200側]以下を実行。
    • sudo bt-pan --debug client XX:XX:XX:XX:XX:XX
      sudo ifconfig bnep0
      
    • うまくいっていれば、ネットワークインターフェースbnep0が出来、IPアドレスも取得できているはずです。
  4. [DM200側]以下を実行していったん切断しておきます。
    • sudo bt-pan --debug client XX:XX:XX:XX:XX:XX -d
      sudo /opt/bin/bt_switch off
      

接続スクリプトの用意

本来なら、iPhone側のナントカ言うDHCPみたいなサービスからIPアドレスが振られるはずですが、どうもうまくいかないようです。

Raspberry PiのRaspbianだと全く同じ設定手順でIPアドレスが振られ、bt-panコマンドを実行した時点でインターネットが利用可能になっているので何が違うのやら? 調査するすべを知りません。

/etc/network/interfacesに以下のように記述しましたが、見当外れなのか変化なし。

<del>auto bnep0
iface bnep0 inet dhcp</del>

手動でIPアドレスとデフォルトゲートウェイを設定する接続スクリプトbtpを弊ブログからダウンロードします。

wget http://hitoriblog.com/btp

スクリプト内の以下の部分をさきほど控えたiPhoneのBluetoothアドレスと置き換えます。

PHONE_BT_ADDRESS="XX:XX:XX:XX:XX:XX"

実行権限を付けて/usr/binに移動。

chmod +x btp
sudo mv /usr/bin/btp

接続スクリプトbtpの実行

接続スクリプトbtpを実行してみます。

btp

すると、接続処理が始まり、それを終えた暁にはインターネットが利用可能になっているはず。

wget http://hitoriblog.com/

もう一度btpを実行すると切断されます。

btp

接続スクリプトbtpの解説

接続スクリプトbtpは、bnep0に172.20.10.2が割り振られていればBluetoothテザリングが接続中と判断し、切断処理をします。

bnep0がないか、172.20.10.2が割り当てられていなければBluetoothテザリングが切断中と判断し、接続処理をします。

つまりトグル動作というわけですね。

また、bt_switchコマンド、bt-panコマンドそれぞれ実行に管理者権限が必要なのを、一般ユーザーが問い合わせなしで実行できるようにするためにパスワードをsudoコマンドに渡しているセキュリティ無視の作りです。

ちなみに、それなりの頻度でbt_switch on時に出るログがいつものようにドバーッっと流れず、少し流れて止まるときがあります。

このときはハズレで接続が確立しませんw

こうなったときの対処方法は不明。接続スクリプトbtpは、いったんbt_switch offしてからbt_switch onする作りなので、再度実行すると接続できる場合も。

この辺の不安定さを解決できる方教えてください。

btpの中身は以下のようになっています。こんなにsudoコマンドを並べなくても何かスマートな方法があるはず……。

#!/bin/sh

WAIT_SECONDS=10
IP="172.20.10.2"
ROOT_PASSWORD="dm200"
PHONE_BT_ADDRESS="XX:XX:XX:XX:XX:XX"
PHONE_IP_ADDRESS="172.20.10.1"

echo ${ROOT_PASSWORD} | sudo -S /sbin/ifconfig bnep0 2>&1 | /bin/grep "inet ${IP}" >/dev/null

if [ $? -eq 1 ]; then
  echo ${ROOT_PASSWORD} | sudo -S /opt/bin/bt_switch off >/dev/null 2>&1
  sleep 3 
  echo ${ROOT_PASSWORD} | sudo -S /opt/bin/bt_switch on
  sleep ${WAIT_SECONDS}
  echo ${ROOT_PASSWORD} | sudo -S /usr/bin/bt-pan --debug client ${PHONE_BT_ADDRESS}
  #echo ${ROOT_PASSWORD} | sudo -S /sbin/ifconfig bnep0 ${IP} up
  #echo ${ROOT_PASSWORD} | sudo -S /sbin/route add default gw ${PHONE_IP_ADDRESS} dev bnep0
else
  echo ${ROOT_PASSWORD} | sudo -S /usr/bin/bt-pan --debug client ${PHONE_BT_ADDRESS} -d
  echo ${ROOT_PASSWORD} | sudo -S /opt/bin/bt_switch off
fi

WAIT_SECONDSは環境によって調整が必要です。

bt_switch on時のログドバーッが終わるまで以降の処理ができないが、bt_switchコマンドは実行自体はすぐ終わり、次の行に番が回ってきてしまうので、sleepで待ち合わせをしないとならない。しかし、ログドバーッのスピードは仮想コンソールによって違うので定数だと都合が悪いという問題があります。

標準のfbtermだと10秒で大体大丈夫です。fbtermからexitすると移行できる生ターミナル? だと10秒では足りません。

iPhone側のIPアドレス、PHONE_IP_ADDRESSは172.20.10.1で固定ですが、もしAndroidなどに流用する場合は、デフォルトゲートウェイとして設定するBluetoothテザリング親機のIPアドレスに書き換えてください。

Debian Linux on DM200起動時の自動接続

Debian Linux on DM200起動時に自動的にBluetoothテザリングする設定も施してみました。

といっても、.bashrcに接続スクリプトbtpを書くだけですが。

btpをinitスクリプト、具体的にはランレベル5で実行される/etc/rc5.dの最後尾S99から実行してみましたが、bt_switch onで流れるログドバーッを人に見せないと初期化が失敗する謎の仕様から接続がうまくいかないようです。

ゆえに仕方なく.bashrcからなのですが。

しかし、安易に.bashrcからbtpを実行するとfbtermからexitしたり、Alt+F2、Alt+F3でコンソールを切り替え新しいシェルを開くたびに実行されてしまい問題があります。

起動後、最初のシェルが起動するときだけ実行させたいと考え、適切な方法が分からなかったので以下のようにuptimeを見て起動から20秒以内だったらbtpを実行するようにしました。

uptime_in_seconds=`cat /proc/uptime | awk 'BEGIN{FS=" "};{print sprintf("%0d", $1);}'`

if [ $uptime_in_seconds -lt 20 ]; then
    /usr/bin/btp
fi

これを/home/dm200/.bashrcに追記しておくとよいかと思います。

initスクリプトからフラグファイルを作成して、.bashrcからそのフラグファイルの存在を判定し、実行後にフラグファイルを削除するという方法や環境変数を使う方法も思い付きましたが、とりあえずuptimeで。

その他注意事項

筆者はBluetoothにテザリングの用しかないので接続スクリプトbtpの中でBluetooth PANの接続切断に応じてbt_switchをオンオフしてしまっていますが、それでは都合が悪いという方は、btpの中のbt_switchのオンオフ処理を削除して、別途やるようにしてください。

bt_switch onの失敗にハラハラするのは一度だけでいいという都合から、起動時はbt_switchオンのみやって、Bluetooth PANの接続、切断だけを適宜やった方がいいかもしれないですね。

接続方法を改良された方はぜひ教えてください。

キングジム デジタルメモ ポメラ DM200ブラック
キングジム(KINGJIM)
売り上げランキング: 1,247

 - ガジェット, ポメラ