読者です 読者をやめる 読者になる 読者になる

熊小屋日誌

Windows 10 UWPやXamarin, Python、mbed/NetMF/Arduino/Edison, Azureなどぼちぼちと。たまにPCや勉強会、セミナーなどの話題も

Windows Phone 8.1 SilverlightアプリでのRFCOMM通信

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つあります。

f:id:kumar:20151013115205p:plain

なお、Windows Runtimeを使う(Silverlightでない)Windows Phone ストアアプリ、ユニバーサルWindowsアプリであれば、Package.appxmanifestしか含まれません。

f:id:kumar:20151013115209p:plain

さて、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がチェックされていませんが、これで問題ありません。

f:id:kumar:20151013115206p:plain

上記の通りに、2つのマニフェストファイルに機能を設定すると、Bluetooth機器を探索、接続して通信を行えるようになります。

参考資料