Debian Linux on キングジム ポメラDM200でiPhoneとBluetoothテザリングするための設定方法
2018/12/13
価値ある情報をユーザー視点で発信するブログ
2018/12/13
キングジムのテキスト打ち端末、ポメラDM200は、@ichinomoto氏の尽力により、Debian Linux(Stretch)が動作するようになっています。
元々のDM200の素性の良さもあり、これまで自分が触れた勝手インストール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テザリングを開始する設定も可能です。
よし!よし!ポメラDM200 Linuxを起動するとiPhone 7 Plusと既にBluetoothテザリングしてるという設定できた!開幕からオンライン!この設定をやりたかったんや!設定が済めばiPhoneの方は一切いじらんでよし。カバンの中でいい。 pic.twitter.com/vWGbiZaBkY
— moyashi (@hitoriblog) November 13, 2018
BluetoothテザリングはWiFiテザリングと違い、一度設定を済ませてしまえばiPhone側の操作を必要とせず、DM200側の操作のみで接続・切断が可能、また消費電力が少なく便利です。
上掲の動画は説明のためにiPhoneを隣に並べ、使用状態にして撮影していますが、本来iPhoneはカバンの中にしまったままでもOKです。
Debian Linux側をバリバリ使う用がなくとも、ネットワークを使う単一処理、例えばDropbox同期などを仕込んでおくだけでも便利かと思います。
もくじ
設定手順は以下のようになります。
まずは必要なものをインストール。
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/
以下の内容を「/etc/network/interfaces.d/bnep0」として新たにファイルを作成し、保存します。(匿名さんコメント欄にて情報ありがとうございます)
allow-hotplug bnep0 iface bnep0 inet dhcp
続いてiPhoneとのペアリングです。
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
sudo bt-pan --debug client XX:XX:XX:XX:XX:XX sudo ifconfig bnep0
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に以下のように記述しましたが、見当外れなのか変化なし。
auto bnep0 iface bnep0 inet dhcp
手動で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
すると、接続処理が始まり、それを終えた暁にはインターネットが利用可能になっているはず。
wget http://hitoriblog.com/
もう一度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起動時に自動的に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の接続、切断だけを適宜やった方がいいかもしれないですね。
接続方法を改良された方はぜひ教えてください。