RN-42XVPを使ったmbedでのBluetooth連携(その5)で、Windows Phone 8.1 SilverlightアプリでBluetoothでの接続に失敗していました。その原因が分かったので対策と合わせて紹介します。
Bluetooth機器との接続失敗
Windows Phone 8.1 Silverlightアプリで発生していた例外は、StreamSocketのConnectAsyncで接続しようとすると0x80070005の例外が発生するものです。
これはアプリに機能を設定し忘れたときに発生する有名な現象ですが、このWP8.1SLアプリは、WP8.0アプリを8.1にターゲットを変換して作成していて、元のWP8.0アプリでは正常に動作していたので、機能の設定し忘れはないと思い混んでいました。
ところが、例外のコードの通り、機能の設定漏れがあり、そのためRFCOMMでの通信で例外が発生していたのです。
Windows Phone 8.1 Silverlightアプリでの機能の設定
Windows Phone 8.1 Silverlightアプリでは、機能を設定するファイルが2つあります。
- WMAppManifest.xml
- WP8.0アプリから存在するSilverlightアプリのマニフェスト。
- Package.appxmanifest
- WP8.1アプリに変換したときに作成されたマニフェスト。8.1向けアプリに存在する。
なお、Windows Runtimeを使う(Silverlightでない)Windows Phone ストアアプリ、ユニバーサルWindowsアプリであれば、Package.appxmanifestしか含まれません。
さて、Windows Phone 8.1ストアアプリでRFCOMMを使いたい場合、それぞれのマニフェストに機能を設定する必要があります。片方だけでは機能の設定が足りずに、Bluetoothの探索や接続が実行できません。
- WMAppManifest.xml
- NetworkingとProximityの機能を設定する。これがないと探索を開始できない。
- Package.appxmanifest
- internetClientServerとbluetooth.rfcommのDeviceCapabilityの機能を設定する。
Package.appxmanifestでの機能の設定は、直接ファイルを編集(F7キー)して行います。
:::xml
<Capabilities>
<Capability Name="internetClientServer" />
<m2:DeviceCapability Name="bluetooth.rfcomm">
<m2:Device Id="any">
<m2:Function Type="name:serialPort" />
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
編集後にGUIでPackage.appxmanifestファイルを見るとProximityがチェックされていませんが、これで問題ありません。
上記の通りに、2つのマニフェストファイルに機能を設定すると、Bluetooth機器を探索、接続して通信を行えるようになります。
参考資料
- Windows Phone 8 アプリを Windows Phone Silverlight 8.1 にアップグレードする
- Windows 8.1ストアアプリでBluetooth 2.0接続周辺デバイスと通信する
- How to specify device capabilities in a package manifest (Windows Runtime apps)