2017-09-11 2 views
0

J'essaie de connecter mon c programme # WPF à un dispositif BLE et c'est le code pour se connecter à l'appareil:C# Bluetooth LE - erreur de configuration écrire - ValueChanged jamais appelé

private async Task ConnectToWatcher(DeviceInformation deviceInfo) { 
     try { 
      // get the device 
      BluetoothLEDevice device = await BluetoothLEDevice.FromIdAsync(deviceInfo.Id); 

      // get the GATT service 
      Thread.Sleep(150); 
      var gattServicesResult = await device.GetGattServicesForUuidAsync(new Guid(RX_SERVICE_UUID)); 
      service = gattServicesResult.Services[0]; 

      // get the GATT characteristic 
      Thread.Sleep(150); 
      var gattCharacteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(RX_CHAR_UUID)); 
      characteristic = gattCharacteristicsResult.Characteristics[0]; 

      // register for notifications 
      Thread.Sleep(150); 

      characteristic.ValueChanged += (sender, args) => { 
       Debug.WriteLine($"[{device.Name}] Received notification containing {args.CharacteristicValue.Length} bytes"); 
      }; 

      GattWriteResult result = 
      await characteristic.WriteClientCharacteristicConfigurationDescriptorWithResultAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); 
      Debug.WriteLine($"Characteristics write result: status={result.Status}, protocolError={result.ProtocolError}"); 

     } catch (Exception ex) when ((uint)ex.HResult == 0x800710df) { 
      Debug.WriteLine("bluetooth error 1"); 
      // ERROR_DEVICE_NOT_AVAILABLE because the Bluetooth radio is not on. 
     } 
    } 

La ligne

Debug.WriteLine($"Characteristics write result: status={result.Status}, protocolError={result.ProtocolError}" 

crée la sortie Caractéristiques écrire résultat: status = protocolError, protocolError = 3 Je ne pouvais pas trouver nulle part ce qui est censé vouloir dire. L'effet est la méthode caractéristique.ValueChanged n'est jamais appelé.

Dois-je en faire plus pour que la caractéristique soit configurée? Et quelqu'un a-t-il une idée de la raison pour laquelle la méthode n'est pas appelée ou de ce que signifie ce message d'erreur?

Merci beaucoup.

Répondre

1

Apparemment, certaines générations de Windows 10 ont un bogue de sécurité COM. La solution était de s'enregistrer pour Windows-Insider-Program et de mettre à jour Windows.

Mise à jour: Il y a deux solutions à ceci: 1) Appel CoInitializeSecurity de l'extérieur de votre code C# (ne pas le mettre au travail) - deux nouvelles clés d'écriture or- 2) dans la registre des fenêtres. Vous pouvez créer un fichier "Bluetooth.reg", qui ajoutera ces deux clés sur un double clic. Cette réponse de https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk était ma solution:

Salut Kamen, j'ai éprouvé exactement le même problème. Vous pouvez donner un essai rapide de ce qui suit:


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ AppID {C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}] "AccessPermission" = hex: 01,00,04,80,9c, 00,00,00, ac, 00,00,00,00,00,00,00,14,00, \ 00,00,02,00,88 , 00,06,00,00,00,00,00,14,00,07,00,00,00,01,01,00,00,00,00,00, \ 05,0a, 00,00 , 00,00,00,14,00,03,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00, \ 00,00,18 , 00,07,00,00,00,01,02,00,00,00,00,005,00,00,00,00,20,02,00,00,00, \ 00,18 , 00,03,00,00,00,01,02,0 0,00,00,00,00,0f, 02,00,00,00,01,00,00,00,00,00, \ 14,00,03,00,00,00,01,01, 00,00,00,00,00,05,13,00,00,00,00,00,14,00,03,00,00, \ 00,01,01,00,00,00, 00,05,14,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00, \ 20,02,00,00,01,02, 00,00,00,00,00,05,20,00,00,00,20,02,00,00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ AppID \ YOURAPP.exe] "AppID" = " {C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5} »


  1. Copier le contenu ci-dessus dans un fichier texte.

  2. Remplacer 'YOURAPP.EXE » avec votre nom de l'exécutable

  3. remplacer en option GUIDs (j'ai créé une nouvelle pour vous)

  4. Enregistrer fichier texte avec une extension .reg comme

  5. Double-cliquez sur le fichier.

  6. Vous verrez un message 'Les clés et les valeurs contenues dans .....reg ont été ajoutées au registre avec succès.'

Avec ceci, je n'ai pas besoin d'appeler CoInitializeSecurity depuis mon application.

-1

vous devez appeler CoInitializeSecurity avant

plus d'infos ici. deux semaines, je passe à la recherche de solution :)

https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/

+0

Bien que ce lien peut répondre à la question, il est préférable d'inclure les éléments essentiels de la réponse ici et de fournir le lien de référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [Revue] (/ review/low-quality-posts/17707088) –

+0

Bonjour Eriawan, je pense que l'essentiel est d'appeler ** CoInitializeSecurity **. cela seul apporte une solution au problème. En marquant cette réponse négative, vous pourriez faire en sorte que d'autres personnes passent leur temps sur de mauvaises solutions. –