Condividi tramite


Introduzione a point of service

I dispositivi Point of Service o Point of Sale sono periferiche computer usate per facilitare le transazioni di vendita al dettaglio. Esempi di dispositivi Point of Service includono registri di cassa elettronici, scanner di codici a barre, lettori di strisce magnetiche e stampanti di scontrini.

Qui si apprenderanno le nozioni di base dell'interazione con i dispositivi Point of Service usando le API Point of Service di Windows Runtime. Verranno illustrati argomenti come l'enumerazione dei dispositivi, il controllo delle funzionalità dei dispositivi, la richiesta dei dispositivi e la condivisione dei dispositivi. Usiamo un dispositivo scanner di codice a barre come esempio, ma quasi tutte le indicazioni qui fornite si applicano a qualsiasi dispositivo Point of Service compatibile con UWP. Per un elenco dei dispositivi supportati, vedere Supporto dei dispositivi Point of Service.

Ricerca e connessione alle periferiche Point of Service

Prima che un dispositivo Point of Service possa essere usato da un'app, deve essere associato al PC in cui è in esecuzione l'app. Esistono diversi modi per connettersi ai dispositivi Point of Service, a livello di codice o tramite l'app Impostazioni.

Connessione ai dispositivi tramite l'app Impostazioni

Quando si collega un dispositivo Point of Service come uno scanner di codice a barre in un PC, questo viene visualizzato proprio come qualsiasi altro dispositivo. È possibile trovarlo nella sezione Dispositivi > Bluetooth & altri dispositivi dell'app Impostazioni. È possibile associare un dispositivo Point of Service selezionando Aggiungi Bluetooth o altro dispositivo.

Alcuni dispositivi Point of Service potrebbero non essere visualizzati nell'app Impostazioni finché non vengono enumerati a livello di codice usando le API Point of Service.

Recupero di un singolo dispositivo Point of Service con GetDefaultAsync

In un caso d'uso semplice, si potrebbe disporre di una sola periferica Point of Service connessa al PC in cui l'app è in esecuzione e si desidera configurarla il più rapidamente possibile. A tale scopo, recuperare il dispositivo "predefinito" con il metodo GetDefaultAsync, come illustrato di seguito.

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

Se viene trovato il dispositivo predefinito, l'oggetto dispositivo recuperato è pronto per essere richiesto. La "richiesta" un dispositivo concede a un'applicazione l'accesso esclusivo, impedendo i comandi in conflitto da più processi.

Nota

Se più di un dispositivo Point of Service è connesso al PC, GetDefaultAsync restituisce il primo dispositivo trovato. Per questo motivo, usare FindAllAsync a meno che non si sia certi che solo un dispositivo Point of Service sia visibile all'applicazione.

Enumerazione di una raccolta di dispositivi con FindAllAsync

Quando si è connessi a più dispositivi, è necessario enumerare la raccolta degli oggetti dispositivo PointOfService per trovare quello che si desidera richiedere. Ad esempio, il codice seguente crea una raccolta di tutti gli scanner di codici a barre attualmente connessi e quindi cerca nella raccolta uno scanner con un nome specifico.

using Windows.Devices.Enumeration;
using Windows.Devices.PointOfService;

string selector = BarcodeScanner.GetDeviceSelector();       
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

foreach (DeviceInformation devInfo in deviceCollection)
{
    Debug.WriteLine("{0} {1}", devInfo.Name, devInfo.Id);
    if (devInfo.Name.Contains("1200G"))
    {
        Debug.WriteLine(" Found one");
    }
}

Definizione dell'ambito della selezione del dispositivo

Quando ci si connette a un dispositivo, è possibile limitare la ricerca a un subset di periferiche Point of Service a cui l'app ha accesso. Usando il metodo GetDeviceSelector, è possibile definire l'ambito della selezione per recuperare i dispositivi connessi solo da un determinato metodo (Bluetooth, USB e così via). È possibile creare un selettore che cerca i dispositivi tramite Bluetooth, IP, Locale o Tutti i tipi di connessione. Questo può essere utile, poiché l'individuazione dei dispositivi wireless richiede molto tempo rispetto all'individuazione locale (cablata). È possibile garantire un tempo di attesa deterministico per la connessione del dispositivo locale limitando FindAllAsync ai tipi di connessione Locale. Ad esempio, questo codice recupera tutti gli scanner di codice a barre accessibili tramite una connessione locale.

string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Reazione alle modifiche alla connessione del dispositivo con DeviceWatcher

Durante l'esecuzione dell'app, a volte i dispositivi verranno disconnessi o aggiornati o sarà necessario aggiungerne di nuovi. È possibile usare la classe DeviceWatcher per accedere agli eventi correlati al dispositivo, in modo che l'app possa rispondere di conseguenza. Ecco un esempio di come usare DeviceWatcher, con stub di metodo da chiamare se viene aggiunto, rimosso o aggiornato un dispositivo.

DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Added += DeviceWatcher_Added;
deviceWatcher.Removed += DeviceWatcher_Removed;
deviceWatcher.Updated += DeviceWatcher_Updated;

void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
{
    // TODO: Add the DeviceInformation object to your collection
}

void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
{
    // TODO: Remove the item in your collection associated with DeviceInformationUpdate
}

void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
{
    // TODO: Update your collection with information from DeviceInformationUpdate
}

Verifica delle funzionalità di un dispositivo Point of Service

Anche all'interno di una classe di dispositivo, ad esempio gli scanner di codice a barre, gli attributi di ogni dispositivo possono variare notevolmente tra i modelli. Se l'app richiede un attributo di dispositivo specifico, potrebbe essere necessario esaminare ogni oggetto dispositivo connesso per determinare se l'attributo è supportato. Ad esempio, l'azienda richiede che le etichette vengano create usando un modello di stampa di codice a barre specifico. Ecco come verificare se uno scanner di codice a barre connesso supporta una simbologia.

Nota

Una simbologia è il mapping linguistico usato da un codice a barre per codificare i messaggi.

try
{
    BarcodeScanner barcodeScanner = await BarcodeScanner.FromIdAsync(deviceId);
    if (await barcodeScanner.IsSymbologySupportedAsync(BarcodeSymbologies.Code32))
    {
        Debug.WriteLine("Has symbology");
    }
}
catch (Exception ex)
{
    Debug.WriteLine("FromIdAsync() - " - ex.Message);
}

Uso della classe Device.Capabilities

La classe Device.Capabilities è un attributo di tutte le classi di dispositivi Point of Service e può essere usata per ottenere informazioni generali su ogni dispositivo. Questo esempio determina se un dispositivo supporta la creazione di report statistiche e, in caso affermativo, recupera le statistiche per qualsiasi tipo supportato.

try
{
    if (barcodeScanner.Capabilities.IsStatisticsReportingSupported)
    {
        Debug.WriteLine("Statistics reporting is supported");

        string[] statTypes = new string[] {""};
        IBuffer ibuffer = await barcodeScanner.RetrieveStatisticsAsync(statTypes);
    }
}
catch (Exception ex)
{
    Debug.WriteLine("EX: RetrieveStatisticsAsync() - " - ex.Message);
}

Richiesta di un dispositivo Point of Service

Prima di poter usare un dispositivo Point of Service per l'input o l'output attivo, è necessario richiederlo, concedendo all'applicazione l'accesso esclusivo a molte delle sue funzioni. Questo codice illustra come richiedere un dispositivo scanner di codice a barre, dopo averlo individuato usando uno dei metodi descritti in precedenza.

try
{
    claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
}
catch (Exception ex)
{
    Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}

Mantenimento del dispositivo

Quando si usa un dispositivo Point of Service tramite una connessione di rete o Bluetooth, si potrebbe voler condividere il dispositivo con altre app in rete. Per altre informazioni su questo argomento, vedere Condivisione di dispositivi. In altri casi, può essere necessario conservare il dispositivo per un uso prolungato. Questo esempio mostra come conservare uno scanner di codice a barre richiesto dopo che un'altra app ha richiesto il rilascio del dispositivo.

claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;

void claimedBarcodeScanner_ReleaseDeviceRequested(object sender, ClaimedBarcodeScanner e)
{
    e.RetainDevice();  // Retain exclusive access to the device
}

Input e output

Dopo aver richiesto un dispositivo, si è quasi pronti per usarlo. Per ricevere l'input dal dispositivo, è necessario configurare e abilitare un delegato per ricevere i dati. Nell'esempio seguente viene richiesto un dispositivo scanner di codici a barre, si imposta la relativa proprietà di decodifica e quindi si chiama EnableAsync per abilitare l'input decodificato dal dispositivo. Questo processo varia tra le classi di dispositivi, quindi, per indicazioni su come configurare un delegato per i dispositivi senza codici a barre, vedere l'esempio di app UWP pertinente.

try
{
    claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
    if (claimedBarcodeScanner != null)
    {
        claimedBarcodeScanner.DataReceived += claimedBarcodeScanner_DataReceived;
        claimedBarcodeScanner.IsDecodeDataEnabled = true;
        await claimedBarcodeScanner.EnableAsync();
    }
}
catch (Exception ex)
{
    Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}


void claimedBarcodeScanner_DataReceived(ClaimedBarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args)
{
    string symbologyName = BarcodeSymbologies.GetName(args.Report.ScanDataType);
    var scanDataLabelReader = DataReader.FromBuffer(args.Report.ScanDataLabel);
    string barcode = scanDataLabelReader.ReadString(args.Report.ScanDataLabel.Length);
}

Condivisione di un dispositivo tra app

I dispositivi Point of Service vengono spesso usati nei casi in cui più app debbano accedervi in un breve periodo. Un dispositivo può essere condiviso quando si è connessi a più app in locale (USB o altre connessioni cablate) o tramite una rete Bluetooth o IP. A seconda delle esigenze di ogni app, potrebbe essere necessario eliminare l'attestazione nel dispositivo. Questo codice elimina il dispositivo scanner di codice a barre richiesto, consentendo ad altre app di richiederlo e usarlo.

if (claimedBarcodeScanner != null)
{
    claimedBarcodeScanner.Dispose();
    claimedBarcodeScanner = null;
}

Nota

Le classi di dispositivi Point of Service richieste e non richieste implementano l'interfaccia IClosable. Se un dispositivo è connesso a un'app tramite rete o Bluetooth, gli oggetti richiesti e non richiesti devono essere eliminati prima che un'altra app possa connettersi.

Vedi anche