2017-05-25 28 views
0

私はmyoリストバンドをhololensに接続したいと思っています。これは最終目標ですが、私はとにかくそれに近いです: -/UWP Bluetooth LE InvalidCastException

考え方は、UWPとのBluetooth LE接続を設定することです。デバイスの検索がうまくworkesこのMicrosoft Document

にexplaninedよう 私は、これをやってみたかったが、私はデバイスに接続しようとすると、この行(ポイント 「デバイスへの接続」):GattDeviceServicesResult result = await device.GetGattServicesAsync();

/

- :私はIBluetoothLEDevice3は、私は、Microsoftのドキュメントで、このためのソリューションやインターネットを見つけることができませんでした :-)そこに行う必要がありますどのような見当がつかない

System.InvalidCastException: "Unable to cast object of type 'Windows.Devices.Bluetooth.BluetoothLEDevice' to type 'Windows.Devices.Bluetooth.IBluetoothLEDevice3'."

でエラーが発生します

Visual Studio 2017で動作し、Windows 10(15063)用にビルドされ、マニフェストでBluetoothが有効になっています。

これは私のコードですので、運賃です。私は1つしか追加しなかった、それはタスクです。私はBluetoothLEDDeviceが同期していないので、nullでないことを確認したかったのです。それもうまくいかない。あなたは15063を構築するためにあなたのアプリケーションをターゲットに、あなたはあなただけの使用よりもに接続するデバイスを知っていれば

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 
using System.Diagnostics; 
using Windows.Devices.Enumeration; 
using Windows.Devices.Bluetooth; 
using Windows.Devices.Bluetooth.GenericAttributeProfile; 
using System.Threading.Tasks; 
using Windows.Devices.Bluetooth.Advertisement; 


// Die Elementvorlage "Leere Seite" wird unter https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x407 dokumentiert. 

namespace Bluetooth17 
{ 
    /// <summary> 
    /// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann. 
    /// </summary> 
    public sealed partial class MainPage : Page  
    { 


     public MainPage() 
     { 
      this.InitializeComponent(); 

      blue(); 

     } 



     void blue() 
     { 
      // Query for extra properties you want returned 
      string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" }; 

      DeviceWatcher deviceWatcher = 
         DeviceInformation.CreateWatcher(
           BluetoothLEDevice.GetDeviceSelectorFromPairingState(false), 
           requestedProperties, 
           DeviceInformationKind.AssociationEndpoint); 

      // Register event handlers before starting the watcher. 
      // Added, Updated and Removed are required to get all nearby devices 
      deviceWatcher.Added += DeviceWatcher_Added; 
      deviceWatcher.Updated += DeviceWatcher_Updated; 
      deviceWatcher.Removed += DeviceWatcher_Removed; 

      // EnumerationCompleted and Stopped are optional to implement. 
      deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted; 
      deviceWatcher.Stopped += DeviceWatcher_Stopped; 

      // Start the watcher. 
      deviceWatcher.Start(); 
     } 

     private void DeviceWatcher_Stopped(DeviceWatcher sender, object args) 
     { 
      Debug.WriteLine("Stopped"); 
     } 

     private void DeviceWatcher_EnumerationCompleted(DeviceWatcher sender, object args) 
     { 
      Debug.WriteLine("Enum complete"); 
     } 

     private void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args) 
     { 
      Debug.WriteLine(args.Id + " Removed"); 
     } 

     private void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args) 
     { 
      Debug.WriteLine(args.Id + " Update"); 
     } 

     private void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args) 
     { 
      Debug.WriteLine(args.Id + "  " + args.Name); 

      if (args.Name.Equals("Myo")) 
      { 
       Debug.WriteLine("Try to connect to Myo"); 
       getServices(args); 
      } 
     } 

     async Task<BluetoothLEDevice> ConnectDevice(DeviceInformation deviceInfo) 
     { 
      Debug.WriteLine("Asyc"); 
      // Note: BluetoothLEDevice.FromIdAsync must be called from a UI thread because it may prompt for consent. 
      return await BluetoothLEDevice.FromIdAsync(deviceInfo.Id); 


     } 


     async void getServices(DeviceInformation deviceInfo) 
      { 

      Task<BluetoothLEDevice> task = ConnectDevice(deviceInfo); 

      task.Wait(); 

      BluetoothLEDevice device = task.Result; 

      GattDeviceServicesResult result = await device.GetGattServicesAsync(); 

      if (result.Status == GattCommunicationStatus.Success) 
      { 
       var services = result.Services; 
       // ... 
      } 

     } 
    } 
} 

はあなたに

+0

hololensのお使いのOSのバージョンは何ですか? –

+0

その10.0.14393.0ですが、私は現時点でHoloLensに取り組んでいません。私は通常のWindows 10コンピュータでセットアップしようとしていますが、ここでエラーが発生します。 – Marcel

答えて

0

ありがとう:

device = await BluetoothLEDevice.FromBluetoothAddressAsync(blueToothAddress); 

これは、はるかに安定してコードよりで、デバイスウォッチャーが不要です。ここで は私のデバイスのために働く例(ないMIOはなくHM10)である:

using System; 
using System.Diagnostics; 
using Windows.Devices.Bluetooth; 
using Windows.Devices.Bluetooth.GenericAttributeProfile; 
using Windows.UI.Xaml.Controls; 

namespace App1 
{  
    public sealed partial class MainPage : Page 
    { 
     private BluetoothLEDevice device; 
     GattDeviceServicesResult serviceResult = null; 
     public MainPage() 
     { 
     this.InitializeComponent(); 
     StartDevice(); 
     } 

     private async void StartDevice() 
     { 
     //To get your blueToothAddress add: ulong blueToothAddress = device.BluetoothAddress to your old code. 
     ulong blueToothAddress = 88396936323791; //fill in your device address!! 
     device = await BluetoothLEDevice.FromBluetoothAddressAsync(blueToothAddress);   
     if (device != null) 
     { 
      string deviceName = device.DeviceInformation.Name; 
      Debug.WriteLine(deviceName); 
      int servicesCount = 3;//Fill in the amount of services from your device!! 
      int tryCount = 0; 
      bool connected = false; 
      while (!connected)//This is to make sure all services are found. 
      { 
       tryCount++; 
       serviceResult = await device.GetGattServicesAsync(); 

       if (serviceResult.Status == GattCommunicationStatus.Success && serviceResult.Services.Count >= servicesCount) 
       { 
        connected = true; 
        Debug.WriteLine("Connected in " + tryCount + " tries"); 
       } 
       if (tryCount > 5)//make this larger if faild 
       { 
        Debug.WriteLine("Failed to connect to device "); 
        return; 
       } 
      } 
     } 
     } 
    } 
} 
+0

これは問題を解決しません –

関連する問題