Proximity Profileとは
Bluetooth 4.0から利用可能になった最新のプロファイルに、Proximity Profile(PXP)があります。これは近接プロファイルという名前の通り、ペアリングしたデバイスとの距離を判別することができるプロファイルです。
このProximity Profileを利用した製品は既に市場に存在します。たとえばBluetooth 4.0対応ぶるタグ などです。ぶるタグは、ペアリングしたデバイスが一定以上離れた時に振動して通知したり、PCから離れた時に自動的にロックすることができ、スマートフォンの置き忘れ防止や、ちょっと席を立った時のPCのロック忘れ防止などに役立つデバイスです。他にもFind Me Profileを利用して、近くにあるデバイスを探すことも可能なようです。これは「部屋の中でスマートフォンが行方不明」などというシチュエーションで役立つ機能です。
ですがこういった製品は、Bluetooth 4.0(とPXP)に対応したPCとデバイスでなければ利用できません。それは少しくやしいので、今週のレシピでは「Bluetoothデバイスとの距離をトリガーとしてコマンドを実行する」ことで、似たような機能をUbuntuで実現する方法を紹介します。
blueproximityのインストール
それでは前述の「デバイスが一定以上PCから離れた時に、自動的にロックする機能」を、スマートフォンを使って実現してみましょう。
これはデバイスとPC間の距離を計測し、距離がしきい値を越えた際にデスクトップをロックするコマンドを実行するという、単純な仕組みで実現できます。そして使用するデバイスやしきい値、実際に実行するコマンドなどは、BlueProximityというフロントエンドを利用することで、簡単に設定することができます。BlueProxymityはuniverseリポジトリにパッケージが用意されていますので、ソフトウェアセンターからインストールしてください。
ただし、ここで一点注意があります。BlueProximityは、一時停止や終了、設定の変更などをインジケーター上のアイコンから行います。ところが現在のBlueProximityはUnityのAppIndicatorに対応していないため、Unity環境下ではこうした制御が不能になってしまいます[1] 。一応パッチは存在する ようなので、このパッチをあてたUbuntu 12.10用のパッケージを、筆者のPPA に用意しました。Ubuntu 12.10を利用している場合は、次のコマンドで筆者のPPAを追加してから、blueproximityパッケージをインストールしてください。( ※2 )
$ sudo apt-add-repository ppa:mizuno-as/blueproximity
[sudo] password for mizuno:
以下のPPAをシステムに追加しようとしています:
blueproximity - Support for Unity's AppIndicators
http://sourceforge.net/tracker/?func=detail&aid=3349215&group_id=203022&atid=983924
詳しい情報: https://launchpad.net/~mizuno-as/+archive/blueproximity
[ENTER] を押して続けるか、ctrl-c で追加をキャンセルしてください
(...略...)
[1] 初回起動時に設定ダイアログが開くので、動かすだけなら問題ありません。そして設定の変更を行いたい場合は、ホームディレクトリにある.blueproximityディレクトリを削除して最初からやり直すことで、問題を回避することも可能です。ですが使い勝手が劣悪になるのは言うまでもありません。
デバイスのペアリング
ロックのキーとなるスマートフォンを、PCとペアリングします。PXPを使うわけではないため、PCやスマートフォンがBluetooth 4.0に対応している必要はありません。筆者は、この原稿を執筆しているThinkPad T430sと、USBのBluetooth 2.0アダプタを搭載したThinkPad T61を使い、NTTドコモのGalaxy S IIとXperia Z、それに今となっては懐しいiPhone 3GSを組み合わせて、動作を確認しました。
それではUbuntuの「システム設定」 →「 Bluetooth」から「+」ボタンをクリックして「Bluetooth新規デバイスのセットアップ」を開いてください。これで近くにあるBluetoothデバイスが自動的に検出されます。リストアップされたデバイスの中から、ペアリングしたいデバイスを選択してください。ただし一般的なAndroidスマートフォンは自動検出がOFFになっていると思いますので、ペアリング前にあらかじめ検出可能な状態にしておいてください。
図1 キャプション:ペアリングしたいデバイスを選択して「続行」をクリックする
ダイアログ上にPINコードが表示されます。スマートフォンの画面にも同じPINコードが表示されていますので、PINが一致することを確認した上で、ペア設定を行ってください。
図2 Ubuntu/スマートフォンの両方に表示されているPINコードを確認する
図3 ペアリングが完了した状態
BlueProximityの起動
それではBlueProximityを起動します。Unityの場合はDashから「blueproximity」で検索してください。
図4 DashからBlueProximityを起動する
初回起動時は、このような設定ダイアログが開きます。まずは「Bluetooth Device」タブを開き、ロックに使用するデバイスとチャンネルを設定しなければなりません。デバイスが検出可能になっている状態で「Scan for Devices」をクリックすると、デバイスが検出されて、名前とMACアドレスがリストアップされます。使用するデバイスを選択して、「 Use selected device」をクリックします。
次に、BluetoothのRFCOMMの、どのチャンネルを利用するかを設定します[3] 。「 Scan channels on device」をクリックすると、利用できるチャンネルを走査しますので、「 usable」となっているチャンネル番号をクリックして選択してください。デバイスの設定が正しく行われると、インジケーターの鍵アイコンが緑色に変化します。
図5 デバイスとチャンネルの設定を行う
このとき、Ubuntuがスマートフォンに対してメッセージアクセス要求を行います。スマートフォンの画面に確認のダイアログが表示された場合は、要求を許可してください。
図6 メッセージアクセス要求を許可する
図7 正常に設定が完了した状態のアイコン。なお鍵マークは、デバイスが設定されていない場合は赤色、BlueProximityの一時停止中は灰色で表示される
ロック/アンロックの設定
「Proximity Details」タブでは、ロック/アンロックのしきい値を設定できます。「 Distance」でロック/アンロックする距離(信号強度)を、「 Duration」で処理が実行されるまでの時間(秒)を設定します[4] 。
距離、時間を短く設定すれば、それだけレスポンスはよくなります。しかし極端に値を小さくすると、いわゆる誤検出も増えてしまうため注意が必要です。たとえばロックのDistanceを最低の1に設定しておくと、PCのとなりにスマートフォンを置きっぱなしにしておいても、何かの拍子にロックされてしまうことが多々ありました。距離、時間ともに、ある程度の余裕をもたせた値にしておくとよいでしょう。このあたりは試行錯誤しながらの調整が必要です[5] 。
図8 ロック/アンロック処理が実行されるしきい値を設定する
「Locking」タブでは、ロック/アンロック時に実際に実行されるコマンドを指定します。デフォルトではgnome-screensaver-commandに、ロック(-l)とアンロック(-d)のオプションを渡して実行しているだけです。繰り返しになりますが、BlueProximityはスマートフォンとの距離をトリガーにして「画面のロック」を自動的に実行しているだけにすぎません。ハードウェアトークンを使ったロックを行っているわけではないため、BlueProximityを経由して画面ロックを行った場合でも、スマートフォンを使わずにパスワード入力でロック解除をすることができます。「 ちょっとトイレへ行くために席を立った時のロック忘れ」などを防ぐことはできますが[6] 、PCの根本的なセキュリティレベルを上げることはできませんので、誤解しないようにしてください。
「Logging」には、BlueProximityのログ出力先を設定します。デフォルトではsyslogへ、local7のログファシリティで出力されます。システムのログに記録されるのが嫌であれば、ホームディレクトリ以下の任意のファイルに出力させることもできます。
図9 ロック、アンロック時に実行されるコマンドや、ログ出力を設定する。command intervalは現在未実装で、意味のないパラメータのようだ
BlueProximityは自動的に、「 自動起動するアプリケーションの設定(gnome-session-properties) 」に登録されます。これにより、次回以降は特別な操作を行わなくても、デバイスの監視が開始されます。BlueProximityによるロックを停止したい場合は、インジケーターのアイコンをクリックして、メニューから「一時停止」を選択してください。
図10 gnome-session-propertiesに登録されるので、次回以降は自動的に起動する
[4] 距離の数値の単位はメートルではありません。BlueProximityは内部でhcitoolコマンドを利用してRSSI(信号強度)を計測しており、直近の何回かの計測結果の平均値がしきい値を上回った時にアクションを実行するようになっています。ここで設定した値は、hcitool rssiコマンドの戻り値(=255で正規化された信号強度)と比較される値となります。
Xubuntuで使うには
BlueProximityはロック/アンロック時にgnome-screensaver-commandを実行しています。Ubuntuではこのデフォルト設定で問題ありません。ですがXubuntuにはgnome-screensaver-commandが存在しないため、このままではロックを行うことができません。
Xubuntuではスクリーンセーバーにxscreensaverを利用していますので、実行するコマンドをxscreensaver-commandに変更する必要があります。実は最初からxscreensaver-commandの設定も用意されており、プルダウンで選択することが可能です。ですが実はそれだけでは不十分で、オプションを変更する必要があります。アンロック時のコマンドを「xscreensaver-command -deactivate」に変更してください。
またXubuntuはUbuntuと異なり、自動でのアンロックができません。Ubuntuではスマートフォンを近づければ、パスワードの入力なしにデスクトップをアンロックできました。しかしXubuntuの場合はパスワード入力のダイアログが表示されるのみで、アンロックするためにはパスワードの入力が必須です。これはgnome-screensaver-commandが強制的にアンロックするオプションを提供しているのに対し、xscreensaver-commandにはそのような機能がないためです。
図12 Xubuntuでの設定例。ロック/アンロックに使用するコマンドを変更する必要がある
おわりに
BlueProximityは任意のコマンドや自作のシェルスクリプトを実行させることが可能なので、デスクトップのロックだけでなく、様々なアクションを起こすことができます。Nofity OSDを使って通知を表示したり、メールを送信したりすることも可能です。
筆者は最近人気のあのコマンド を使い、全自動で展開、収納するドリンクホルダーを開発しました[7] 。
いかがでしょうか? みなさんもぜひ手持ちのスマートフォンを使って、BlueProximityで遊んでみてください。