none
Problemi di connessione BLE RRS feed

  • Domanda

  • Salve

    ho utilizzato la classe BluetoothLEDevice per scrivere sulla caratteristica di un service appartenente ad un sevice.

    Per scrivere sulla caratteristica utilizzo l'instruzione:

    var res = await charact.WriteValueAsync(writer.DetachBuffer(), GattWriteOption.WriteWithResponse);

    che ha funzionato molto bene. Adesso il risultato dell'operazione è Unreachable che secondo la documentazione significa"No communication can be performed with the device at this time". Non capisco bene che cosa sia cambiato.

    Sapete aiutarmi?

    Grazie mille



    Valentina Tavanti

    lunedì 12 luglio 2021 14:36

Risposte

  • Buongiorno Valentina,

    Le posso dare la seguente informazione.  Microsoft ha appena aggiornato le proprie API Bluetooth. Ora abbiamo la comunicazione del dispositivo BLE non abbinata!
     Al momento hanno pochissima documentazione, ma ecco la nuova struttura molto semplificata:

    BleWatcher = new BluetoothLEAdvertisementWatcher 
    { 
        ScanningMode = BluetoothLEScanningMode.Active
    };
    BleWatcher.Start();
    
    BleWatcher.Received += async (w, btAdv) => {
        var device = await BluetoothLEDevice.FromBluetoothAddressAsync(btAdv.BluetoothAddress);
    Debug.WriteLine($"BLEWATCHER Found: {device.name}");
    
        // SERVICES!!
        var gatt = await device.GetGattServicesAsync();
        Debug.WriteLine($"{device.Name} Services: {gatt.Services.Count}, {gatt.Status}, {gatt.ProtocolError}");
    
        // CHARACTERISTICS!!
        var characs = await gatt.Services.Single(s => s.Uuid == SAMPLESERVICEUUID).GetCharacteristicsAsync();
        var charac = characs.Single(c => c.Uuid == SAMPLECHARACUUID);
        await charac.WriteValueAsync(SOMEDATA);
    };
    Molto meglio ora. Come ho detto, al momento non c'è quasi alcuna documentazione, ho uno strano problema in cui il mio callback ValueChanged smette di essere chiamato dopo circa 30 secondi, anche se sembra essere un problema di ambito separato.

    AGGIORNAMENTO 2 - QUALCHE STRANA

    Dopo aver giocato ancora con il nuovo aggiornamento dei creatori, ci sono alcune altre cose da considerare quando si creano app BLE.

    Non è più necessario eseguire il materiale Bluetooth sul thread dell'interfaccia utente. Non sembra esserci alcuna finestra di autorizzazione per BLE senza accoppiamento, quindi non è più necessario eseguire il thread dell'interfaccia utente. Potresti scoprire che la tua applicazione smette di ricevere aggiornamenti dal dispositivo dopo un periodo di tempo. Questo è un problema di ambito in cui vengono eliminati oggetti che non dovrebbero. Nel codice sopra se stavi ascoltando ValueChanged sul charac potresti riscontrare questo problema. Questo perché la GattCharacteristic viene eliminata prima che dovrebbe essere, imposta la caratteristica come globale piuttosto che fare affidamento sulla copiatura. La disconnessione sembra essere un po' interrotta. L'uscita da un'app non interrompe le connessioni. Pertanto, assicurati di utilizzare il callback di App.xml.cs OnSuspended per terminare le tue connessioni. Altrimenti ti ritrovi in ​​uno stato un po' strano in cui Windows sembra mantenere (e continuare a leggere!!) la connessione BLE. Beh, ha le sue stranezze ma funziona!

    Questo è ancora un problema con le app universali di Windows, il problema iniziale è che un dispositivo deve essere accoppiato (non associato) affinché GattServices venga scoperto. Tuttavia, devono anche essere rilevati utilizzando i dispositivi Windows anziché l'API BLE. Microsoft è a conoscenza e sta lavorando su una nuova API BLE che non richiede l'associazione, ma francamente il loro supporto BLE è piuttosto inutile finché non sarà pronto.

    Prova ad associare manualmente il dispositivo nel Pannello di controllo, quindi elenca nuovamente i servizi. Per qualche motivo nelle app universali di Windows è possibile elencare solo i servizi Gatt per i dispositivi associati, nonostante uno dei vantaggi di BLE sia che non è necessario associare il dispositivo prima di utilizzare i suoi servizi.

    È possibile associare il dispositivo in modo programmatico, tuttavia, a seconda della piattaforma su cui viene eseguita l'applicazione, sono necessari prompt dell'interfaccia utente. Pertanto, l'interrogazione dei servizi BLE in background non è fattibile. Questo deve essere risolto in quanto blocca davvero il supporto BLE in UWP.

    È strano ma funziona! 


    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    martedì 13 luglio 2021 06:27
    Moderatore

Tutte le risposte

  • Buongiorno Valentina,

    Le posso dare la seguente informazione.  Microsoft ha appena aggiornato le proprie API Bluetooth. Ora abbiamo la comunicazione del dispositivo BLE non abbinata!
     Al momento hanno pochissima documentazione, ma ecco la nuova struttura molto semplificata:

    BleWatcher = new BluetoothLEAdvertisementWatcher 
    { 
        ScanningMode = BluetoothLEScanningMode.Active
    };
    BleWatcher.Start();
    
    BleWatcher.Received += async (w, btAdv) => {
        var device = await BluetoothLEDevice.FromBluetoothAddressAsync(btAdv.BluetoothAddress);
    Debug.WriteLine($"BLEWATCHER Found: {device.name}");
    
        // SERVICES!!
        var gatt = await device.GetGattServicesAsync();
        Debug.WriteLine($"{device.Name} Services: {gatt.Services.Count}, {gatt.Status}, {gatt.ProtocolError}");
    
        // CHARACTERISTICS!!
        var characs = await gatt.Services.Single(s => s.Uuid == SAMPLESERVICEUUID).GetCharacteristicsAsync();
        var charac = characs.Single(c => c.Uuid == SAMPLECHARACUUID);
        await charac.WriteValueAsync(SOMEDATA);
    };
    Molto meglio ora. Come ho detto, al momento non c'è quasi alcuna documentazione, ho uno strano problema in cui il mio callback ValueChanged smette di essere chiamato dopo circa 30 secondi, anche se sembra essere un problema di ambito separato.

    AGGIORNAMENTO 2 - QUALCHE STRANA

    Dopo aver giocato ancora con il nuovo aggiornamento dei creatori, ci sono alcune altre cose da considerare quando si creano app BLE.

    Non è più necessario eseguire il materiale Bluetooth sul thread dell'interfaccia utente. Non sembra esserci alcuna finestra di autorizzazione per BLE senza accoppiamento, quindi non è più necessario eseguire il thread dell'interfaccia utente. Potresti scoprire che la tua applicazione smette di ricevere aggiornamenti dal dispositivo dopo un periodo di tempo. Questo è un problema di ambito in cui vengono eliminati oggetti che non dovrebbero. Nel codice sopra se stavi ascoltando ValueChanged sul charac potresti riscontrare questo problema. Questo perché la GattCharacteristic viene eliminata prima che dovrebbe essere, imposta la caratteristica come globale piuttosto che fare affidamento sulla copiatura. La disconnessione sembra essere un po' interrotta. L'uscita da un'app non interrompe le connessioni. Pertanto, assicurati di utilizzare il callback di App.xml.cs OnSuspended per terminare le tue connessioni. Altrimenti ti ritrovi in ​​uno stato un po' strano in cui Windows sembra mantenere (e continuare a leggere!!) la connessione BLE. Beh, ha le sue stranezze ma funziona!

    Questo è ancora un problema con le app universali di Windows, il problema iniziale è che un dispositivo deve essere accoppiato (non associato) affinché GattServices venga scoperto. Tuttavia, devono anche essere rilevati utilizzando i dispositivi Windows anziché l'API BLE. Microsoft è a conoscenza e sta lavorando su una nuova API BLE che non richiede l'associazione, ma francamente il loro supporto BLE è piuttosto inutile finché non sarà pronto.

    Prova ad associare manualmente il dispositivo nel Pannello di controllo, quindi elenca nuovamente i servizi. Per qualche motivo nelle app universali di Windows è possibile elencare solo i servizi Gatt per i dispositivi associati, nonostante uno dei vantaggi di BLE sia che non è necessario associare il dispositivo prima di utilizzare i suoi servizi.

    È possibile associare il dispositivo in modo programmatico, tuttavia, a seconda della piattaforma su cui viene eseguita l'applicazione, sono necessari prompt dell'interfaccia utente. Pertanto, l'interrogazione dei servizi BLE in background non è fattibile. Questo deve essere risolto in quanto blocca davvero il supporto BLE in UWP.

    È strano ma funziona! 


    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    martedì 13 luglio 2021 06:27
    Moderatore
  • Salve Valentina,

    hai provato ad implementare il consiglio di Yordan?

    Se si e lavora anche da te, per favore segna il post suggerito come risposta.

    Grazie in anticipo.


    Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    martedì 3 agosto 2021 11:35
    Moderatore