Condividi tramite


Introduzione al punto di servizio

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

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

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, viene visualizzato proprio come qualsiasi altro dispositivo. Puoi trovarla nella sezione Dispositivi > Bluetooth e 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 programmáticamente tramite le API Point of Service.

Recupero di un singolo dispositivo Point of Service con GetDefaultAsync

In un caso d'uso semplice, potresti avere una sola periferica Point of Service connessa al PC in cui l'app è in esecuzione e vuoi 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. Assegnare un dispositivo a un'applicazione concede l'accesso esclusivo, evitando conflitti tra comandi provenienti da più processi.

Annotazioni

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 di oggetti PointOfService dispositivo per trovare quello che si desidera richiedere. Ad esempio, il codice seguente crea una raccolta di tutti gli scanner di codice 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 , puoi definire l'ambito della selezione per recuperare i dispositivi connessi solo tramite 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 aggiungere nuovi dispositivi. Puoi 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 utilizzare DeviceWatcher, con gli stub dei metodi da chiamare nel caso in cui venga 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.

Annotazioni

Una simbologia è la mappatura linguistica che un codice a barre utilizza 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, ad 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 mostra come richiedere un dispositivo scanner di codice a barre, dopo aver trovato il dispositivo 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 usi un dispositivo Point of Service tramite una connessione di rete o Bluetooth, potresti voler condividere il dispositivo con altre app in rete. Per altre info su questo argomento, vedi Condivisione di dispositivi.) In altri casi, può essere necessario tenere premuto 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
}

Ingresso e uscita

Dopo aver rivendicato un dispositivo, sei quasi pronto per usarlo. Per ricevere l'input dal dispositivo, è necessario configurare e abilitare un delegato per ricevere i dati. Nell'esempio seguente si richiede un dispositivo scanner di codice a barre, si imposta la relativa proprietà 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 non 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 punto di servizio vengono spesso usati nei casi in cui più app dovranno 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 richiedere e usarlo.

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

Annotazioni

Le classi di dispositivi punto di servizio, richieste e non richieste, implementano l'interfaccia IClosable sia che. 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.

Vedere anche