この製品には、「NFC簡単接続」という機能があり、NFC対応Android端末とタッチするだけでBluetoothのペアリング設定ができるという代物です。
通常、ボタンを押してのペアリング設定だと7秒間もボタンを押し続けないといけないのですが、このNFC簡単接続だと、お互いの機器を近づけて2秒ほどで認識されます。
しかし用意されているのは、Androidアプリだけ。
Windows7マシンにPasoriを繋いで簡単ログインなどに使っているのですが、これでペアリング設定ができないのかなと疑問に思いチャレンジしてみました。
Pasoriには、Felicaランチャーというアプリがあり、Pasoriに読ませたチップによってプログラムを起動することが可能です。
一方、Bluetoothのペアリングは、Bluetoothアプリの各機種毎のコントロールパネルで行います。
タスクバーのBluetoothアイコンから、機器一覧を出して、そこからイヤフォンのコントロールパネルを出して、この接続ボタンを押します。
要はプログラムで、この接続ボタンを押せば良いわけです。
以前はWindowsプログラムならSDKでゴリゴリ書いていたのですが、最近はもっと簡単にできるはず。
手近なところで、標準で入っているPowerShellで操作できるかなと調べてみたところ、ありました。
UI Automation PowerShell Extension
ダウンロードしないといけないので、完全に標準の機能だけでは済みませんでしたが、かなり手軽にできるようです。
インストールは
\マイ ドキュメント\WindowsPowerShell\Modules\UIAutomation
に展開して、PowerShellのプロンプトから
Import-Module .\UIAutomation.dllを実行します。
モジュールのロードは、PowerShellのプロンプトを閉じると無効になってしまいます。
Linuxなどのように、自動で読み込んでくれるような仕組みは無いものかと調べてみると、これも有りました。そのままずばりプロファイル機能。
\マイ ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 (*1)
に書いておくと、プロンプトを開いたときに実行してくれます。
これで先ほどのImport-Moduleコマンドを書いてPowerShellプロンプトを開くと・・・
スクリプトの実行がシステムで無効になっているため、ファイル ~\マイ ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 を読み込めません。詳細については、「get-help about_signing」と入力してヘルプを参照してください。
発生場所 行:1 文字:2
+ . <<<< '~\マイ ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1'
+ CategoryInfo : NotSpecified: (:) []、PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
なにやら真っ赤な字でエラーが出てきました。
プロンプトから手動で実行するには、人間が操作しているので問題ありませんが、自動で実行されるのはセキュリティ的に問題があるということで、制限が掛けられているのです。
これはPowerShellのプロンプトを管理者権限で起動して
Set-ExecutionPolicy RemoteSignedを実行することで、 設定が変更できます。 (*2)
ここで嵌まったのが、上記の方法で設定を変更したのに、Felicaランチャーから起動したときにはエラーが出てきてしまうというものでした。
どうにも分からず、TLに投げてみたところ
@osapon ExecutionPolicyはスコープの概念があって、グループポリシー(MachinePolicy)、プロセス単位(Process)、ユーザー単位(CurrentUser)、コンピュータ単位(LocalMachine)でそれぞれ定義されます。
— 牟田口大介 (@mutaguchi) 2015, 4月 10
@osapon Get-ExecutionPolicy -ListとするとそれぞれのスコープでのExecutionPolicyが一覧表示されるのでみてみてください。グループポリシーで定義されているExecutionPolicyは上書きできません。
— 牟田口大介 (@mutaguchi) 2015, 4月 10
@osapon あとはExecutionPolicyは32bitと64bitで別々に定義されることも注意が必要です。
— 牟田口大介 (@mutaguchi) 2015, 4月 10
@osapon Set-ExecutionPolicy -Scope スコープ -ExecutionPolicy ポリシー で、任意のスコープにExecutionPolicyを指定できます。が、scope省略時はLocalMachineなので、32/64bitの違いが怪しいかと
— 牟田口大介 (@mutaguchi) 2015, 4月 10
@mutaguchi ありがとうございます。32/64bitの問題っぽいです。 上64bit下32bit http://t.co/saIczxltXL
— おさ (@osapon) 2015, 4月 10
と、PowerShellの偉い人からズバリな回答をいただきました。スタートメニューにあるPowerShell(x86)のリンクから設定すると、無事に起動しました。
Felicaランチャーが32bitコードで書かれているのが原因だったようです。
さて、これでかなり近づいてきました。
あとはPowerShellでボタンを押すだけです。
$process = Start-Process -FilePath "C:\Program Files\WIDCOMM\Bluetooth Software\BTWUIExt.exe" -ArgumentList "/deviceAddr=fcf152a9a66a" -PassThru $window = Get-UiaWindow -ProcessId $process.Id $window | Get-UiaButton -AutomationId 'btnConnectDisconnect' -Class 'Button' | Invoke-UiaButtonClick | Out-Null Stop-Process $process.Id
deviceAddrに設定する値は、機械によって異なると思います。わたしは、
Process Explorer
を使って、Bluetoothイヤフォンのコントロールパネルが表示されているときに、プロセスがどんなコマンドラインで呼ばれているのかを調べました。
これをエクスプローラーから実行すると、接続ボタンが表示されているときは接続ボタンが、切断ボタンが表示されているときは切断ボタンが押されます。
NFC簡単接続でも、接続中にもう一度タッチすると切断されるので、完全に同じ動作です。
あとは、FelicaランチャーにこのPowerShellをセットするだけ。イヤフォンをPasoriに近づけてみると、メモ帳が開く・・・。
そう、ps1ファイルは普通に開くとメモ帳が開いてしまうのです。
PowerShellでは、"powershell.exe file.ps1"とすることで、指定のファイルを実行できるのですが、Felicaランチャーのアプリ指定画面では、ファイルを一つ指定できるだけです。
そこで最初の画面写真にあったように、VBスクリプトでPowerShellを起動するようにしました。
VBSファイルなら、そのまま開くだけで実行されます。
CreateObject("WScript.Shell").Run "powershell.exe (ディレクトリ名)\headset_setting.ps1",0これで完成。
(*1) 実際のファイル位置は、PowerShellプロンプトで、 $profile を実行すると表示されます。
何も設定していなければ、実際にその場所には何もファイルが無いと思いますので、新規作成する必要があります。
(*2) 指定方法は
Tech TIPS:WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する @IT
を参考に。