2016-04-28 29 views
25

Ho appena avviato un progetto che richiede l'accoppiamento di un tablet Windows 10 con un altro dispositivo bluetooth.Accoppiamento Bluetooth (SSP) su Windows 10 con 32feet.NET

Ho deciso di iniziare con una semplice app di Windows Form per familiarizzare con il processo. Ho aggiunto il pacchetto 32feet.NET NuGet alla mia soluzione e rapidamente ho avuto successo con la ricerca di dispositivi e la compilazione di una listbox.

client = new BluetoothClient(); 
devices = client.DiscoverDevices(); 
if (devices.Length > 0) 
{ 
    foreach (var device in devices) 
    { 
     lstBTDevices.Items.Add(device.DeviceName); 
    } 
} 
else 
{ 
    MessageBox.Show("Unable to detect any bluetooth devices"); 
} 

Ho quindi aggiunto un gestore di eventi in modo da poter selezionare un dispositivo rilevato e provare ad accoppiarlo.

private void LstBTDevices_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex]; 
     if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, "123456")) 
      { 
       MessageBox.Show("We paired!"); 
      } 
      else 
      { 
       MessageBox.Show("Failed to pair!"); 
      } 
     } 
    } 

Sul mio Windows7 PC desktop con buon adattatore Bluetooth 2.0 questo provoca un popup a comparire sul mio telefono richiedendo Entro il codice PIN. Quando inserisco "123456" l'abbinamento ha esito positivo.

Tuttavia, questo è dove inizia il problema. Quindi prendo la mia applicazione e la eseguo sul mio tablet Windows10, e ora quando seleziono il mio telefono fa apparire un popup sul mio telefono con un codice PIN casuale a 6 cifre, e un messaggio che dovrebbe corrispondere a quello che viene visualizzato sullo schermo del mio tablet , con i pulsanti pair/cancel come opzioni. Premendo uno dei due pulsanti si ottiene un errore.

È qualcosa che sto sbagliando? Un driver non supportato da 32feet.NET?

Qualsiasi consiglio sarebbe molto apprezzato.

UPDATE: Il commento di bare_metal mi ha aiutato a ottenere un po 'più

ho aggiunto un gestore di eventi BluetoothWin32Authentication e aggiunto un pulsante per avviare un abbinamento SSP:

EventHandler<BluetoothWin32AuthenticationEventArgs> authHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(handleAuthRequests); 
BluetoothWin32Authentication authenticator = new BluetoothWin32Authentication(authHandler); 

    private void btnPairSSP_Click(object sender, EventArgs e) 
    { 
     BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex]; 
     if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      Task t = new Task(PairBluetoothTask); 
      t.Start(); 
     } 
    } 

    private void PairBluetoothTask() 
    { 
     BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex]; 
     if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, null)) 
     { 
      MessageBox.Show("We paired!"); 
     } 
     else 
     { 
      MessageBox.Show("Failed to pair!"); 
     } 

    } 

    private void handleAuthRequests(object sender, BluetoothWin32AuthenticationEventArgs e) 
    { 
     switch (e.AuthenticationMethod) 
     { 
      case BluetoothAuthenticationMethod.Legacy: 
       MessageBox.Show("Legacy Authentication"); 
       break; 

      case BluetoothAuthenticationMethod.OutOfBand: 
       MessageBox.Show("Out of Band Authentication"); 
       break; 

      case BluetoothAuthenticationMethod.NumericComparison: 
       if(e.JustWorksNumericComparison == true) 
       { 
        MessageBox.Show("Just Works Numeric Comparison"); 
       } 
       else 
       { 
        MessageBox.Show("Show User Numeric Comparison"); 
        if (MessageBox.Show(e.NumberOrPasskeyAsString, "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes) 
        { 
         e.Confirm = true; 
        } 
        else 
        { 
         e.Confirm = false; 
        }       
       } 
       break; 

      case BluetoothAuthenticationMethod.PasskeyNotification: 
       MessageBox.Show("Passkey Notification"); 
       break; 

      case BluetoothAuthenticationMethod.Passkey: 
       MessageBox.Show("Passkey"); 
       break; 

      default: 
       MessageBox.Show("Event handled in some unknown way"); 
       break; 

     } 
    } 

Quando ho iniziato l'associazione dal mio telefono funziona perfettamente, l'evento viene attivato, la finestra di messaggio si apre e l'associazione ha esito positivo.

Tuttavia, quando avvio il pairing dal tablet, il gestore eventi non viene mai attivato, pertanto l'associazione non riesce.

+1

Il primo accoppiamento con PINCODE si chiama eredità accoppiamento e quello con casuale numero a 6 cifre è Secure Simple Pairing. in SSP per autenticare l'iniziatore e il risponditore, il pulsante di accoppiamento/accettazione deve essere premuto su entrambi i lati. vedi anche un pulsante di accettazione/rifiuto in Windows10? , in caso affermativo accetti da entrambi i dispositivi ?, quanto tempo ci vuole per notare il fallimento dell'associazione (20s)? –

+0

No, non vedo un'opzione di accettazione/rifiuto o un codice PIN sul tablet Windows10. Andando a provare un cambio di approccio e guardare lo spazio dei nomi Windows.Devices.Bluetooth piuttosto che 32feet.NET. –

+0

Ho anche lo stesso problema, qualsiasi aiuto! –

risposta

4

Credo che il problema qui sia che la libreria 32feet è costruita attorno all'appartenenza legacy, in modo che sia necessario conoscere il pin del dispositivo a cui ci si connette, oppure fornire un null per ottenere una finestra popup a inserisci un pin. Quella finestra di dialogo potrebbe non essere passata attraverso la nuova versione di windows - Non sono sicuro su questo, ma la documentazione per la funzione nativa che la libreria 32feet esegue, dice di chiamare un altro metodo se lo sviluppo è più recente di Vista.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa362770(v=vs.85).aspx

Dalla mia navigazione ricerca attraverso le fonti decompilati di 32feet, può sembrare 32feet non supporta SSP, a soli altri - ma che può essere solo che i implementazioni stack Bluetooth in dotazione devono essere ammodernate - o ho bisogno di creare il tuo - ancora non ne sono sicuro.

Si potrebbe voler esaminare le librerie fornite da Microsoft per .NET invece di questa terza parte, sono stato in grado di utilizzare il loro esempio da Github per connettersi e associarmi correttamente con tutti i miei dispositivi.

https://msdn.microsoft.com/en-us/library/windows/apps/mt168401.aspx

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing/cs