2017-05-19 25 views
0

Microsoftのサンプルを使用しています。広告を受信したとき、私はdevice.GattServicesは、Windows汎用アプリケーションでBLEデバイスの空のセットを返します

BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress); 

を呼び出した後、

device.GattServices() 

が、それは常に空のリストを返しています。なぜこうなった?私はまったく答えを見つけませんでした。

答えて

1

広告ウォッチャーを使用する場合は、Windows 10クリエイターのアップデート(10.0;ビルド15063)をターゲットにして最新のSDKを使用する必要があります。そうしないと、デバイスを最初にペアリングする必要があります。 GattServicesを取得するには、まずデバイスがnullでないかどうかを確認します。

var serviceResult = await bluetoothLeDevice.GetGattServicesAsync(); 
if (serviceResult.Status == GattCommunicationStatus.Success) 
{ 
//Do something with servivicResult list 
} 

しかし、キャッチがあります;: は、次に使用しますserviceResult.Statusが成功を返しますが、はすべてまたはではありません。サービスはまだ見つかりませんでした。 私の解決策は、短い遅延でループに入れ、serviceResultのカウントが同じになるまで数回試してみることです。

+0

は15063を構築するためのアップグレードは確かに必要不可欠でした。今では、コードが '' BluetoothLEDevice.FromBluetoothAddressAsync''の呼び出しを逃さないという問題があります。 – abinop

+0

私はまったく同じ問題を抱えていました。何らかの理由でBLEdeviceをnullとして初期化する必要があります。 – GrooverFromHolland

0

私のコメントには詳しい説明がありますが、何かが間違っていてコメントを編集できないので、答えとして追加します。 私は全く同じ問題を抱えていました。何らかの理由でBLEdeviceをnullとして初期化する必要があります。

private BluetoothLEDevice device = null; 

またdiviceがnullの場合にのみ、それを設定するには、if文を使用して、あなたはadvertisementWatcherの上にデバイスを設定し、オーバーしていることを防ぐために、

if (device == null) 
{ 
    device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress); 
} 

または複数のデバイスを設定する場合それらをコレクションに追加し、各デバイスが1度だけ追加されるようにしてください。

これは私の作業コードです:

private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, 
              BluetoothLEAdvertisementReceivedEventArgs eventArgs) 
    { 
    BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType; 
    short rssi = eventArgs.RawSignalStrengthInDBm; 
    string localName = eventArgs.Advertisement.LocalName; 
    string manufacturerDataString = ""; 
    var manufacturerSections = eventArgs.Advertisement.ManufacturerData; 
    if (manufacturerSections.Count > 0) 
    { 
     // Only print the first one of the list 
     var manufacturerData = manufacturerSections[0]; 
     var data = new byte[manufacturerData.Data.Length]; 
     using (var reader = DataReader.FromBuffer(manufacturerData.Data)) 
     { 
      reader.ReadBytes(data); 
     } 
     manufacturerDataString = string.Format("0x{0}: {1}", 
     manufacturerData.CompanyId.ToString("X"), 
     BitConverter.ToString(data)); 
    } 
    string res = string.Format("type={0}, rssi={1}, name={2}, manufacturerData=[{3}]", 
      advertisementType.ToString(), 
      rssi.ToString(), 
      localName, 
      manufacturerDataString); 
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     textBoxWatcher.Text = res; 
    }); 
    if (device == null) 
    { 
     device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress); 

     if (device != null) 
     { 
      var deviceInfo = device.DeviceInformation; 
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       if (device.Name != string.Empty) 
       { 
       //ResultCollection is a observable observable collection of blueutooth devices 
       // to bind to a listvieuw,it is not needed! 
       ResultCollection.Add(new BleDevice(device)); 
       if (deviceInfo.Name == "HMSoft") 
       { 
        if (ResultCollection[0] is BleDevice bleDevice) 
        { 
         BleDeviceId = bleDevice.Id; 
         SelectedBleDeviceName = bleDevice.Name; 
        }       
        Connect(); 
       } 
       } 
      }); 
     } 
    } 
+0

'' BluetoothLEDevice.FromBluetoothAddressAsync''は決して実行されないので、私はいつもnullです。 – abinop

+0

私は私の答えに作業コードを追加しました。私の例のテキストボックスは、あなたのデバイスが本当に広告しているかどうかを確認するのに役立ちます。 – GrooverFromHolland

関連する問題