Introduzione al punto di servizioGetting started with Point of Service

Il punto di servizio, il punto di vendita o i dispositivi punto di servizio sono periferiche del computer utilizzate per facilitare le transazioni al dettaglio.Point of service, point of sale, or Point of Service devices are computer peripherals used to facilitate retail transactions. Esempi di dispositivi punto di servizio includono registri di cassa elettronici, scanner di codice a barre, lettori di striping magnetico e stampanti di ricezione.Examples of Point of Service devices include electronic cash registers, barcode scanners, magnetic stripe readers, and receipt printers.

In questo articolo verranno illustrate le nozioni di base sull'interazione con i dispositivi punto di servizio usando le API di Windows Runtime punto di servizio.Here you’ll learn the basics of interfacing with Point of Service devices by using the Windows Runtime Point of Service APIs. Verranno illustrate l'enumerazione dei dispositivi, il controllo delle funzionalità del dispositivo, la richiesta di dispositivi e la condivisione dei dispositivi.We’ll cover device enumeration, checking device capabilities, claiming devices, and device sharing. Come esempio si usa un dispositivo di scanner di codice a barre, ma quasi tutte le linee guida si applicano a qualsiasi dispositivo punto di servizio compatibile con UWP.We use a barcode scanner device as an example, but almost all the guidance here applies to any UWP-compatible Point of Service device. Per un elenco dei dispositivi supportati, vedere Supporto dei dispositivi per il punto di servizio.(For a list of supported devices, see Point of Service device support).

Ricerca e connessione alle periferiche del punto di servizioFinding and connecting to Point of Service peripherals

Prima che un dispositivo punto di servizio possa essere usato da un'app, deve essere abbinato al PC in cui è in esecuzione l'app.Before a Point of Service device can be used by an app, it must be paired with the PC where the app is running. Esistono diversi modi per connettersi ai dispositivi punto di servizio, a livello di codice o tramite l'app Impostazioni.There are several ways to connect to Point of Service devices, either programmatically or through the Settings app.

Connessione ai dispositivi tramite l'app impostazioniConnecting to devices by using the Settings app

Quando si collega un punto del dispositivo del servizio come uno scanner di codice a barre in un PC, viene visualizzato esattamente come qualsiasi altro dispositivo.When you plug a Point of Service device like a barcode scanner into a PC, it shows up just like any other device. È possibile trovarlo nella sezione devices > Bluetooth & other devices dell'app Settings.You can find it in the Devices > Bluetooth & other devices section of the Settings app. È possibile associare un dispositivo a un punto di servizio selezionando Aggiungi Bluetooth o altro dispositivo.There you can pair with a Point of Service device by selecting Add Bluetooth or other device.

Alcuni dispositivi del servizio potrebbero non essere visualizzati nell'app impostazioni fino a quando non vengono enumerati a livello di codice usando le API del punto di servizio.Some Point of Service devices may not appear in the Settings app until they are programmatically enumerated by using the Point of Service APIs.

Ottenere un singolo punto di servizio del dispositivo con GetDefaultAsyncGetting a single Point of Service device with GetDefaultAsync

In un caso d'uso semplice, è possibile che si disponga di un solo punto di periferica del servizio connesso al PC in cui l'app è in esecuzione e che si voglia configurarla il più rapidamente possibile.In a simple use case, you may have just one Point of Service peripheral connected to the PC where the app is running and want to set it up as quickly as possible. A tale scopo, recuperare il dispositivo "predefinito" con il metodo GetDefaultAsync , come illustrato di seguito.To do that, retrieve the “default” device with the GetDefaultAsync method as shown here.

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

Se viene trovato il dispositivo predefinito, l'oggetto dispositivo recuperato è pronto per essere richiesto.If the default device is found, the device object retrieved is ready to be claimed. "Reclamare" un dispositivo consente a un'applicazione di accedervi in modo esclusivo, impedendo i comandi in conflitto da più processi.“Claiming” a device gives an application exclusive access to it, preventing conflicting commands from multiple processes.

Nota

Se più di un punto del dispositivo del servizio è connesso al PC, GetDefaultAsync restituisce il primo dispositivo rilevato.If more than one Point of Service device is connected to the PC, GetDefaultAsync returns the first device it finds. Per questo motivo, usare FindAllAsync , a meno che non si sia certi che all'applicazione sia visibile un solo punto del dispositivo del servizio.For this reason, use FindAllAsync unless you’re sure that only one Point of Service device is visible to the application.

Enumerazione di una raccolta di dispositivi con FindAllAsyncEnumerating a collection of devices with FindAllAsync

Quando si è connessi a più di un dispositivo, è necessario enumerare la raccolta di oggetti dispositivo PointOfService per trovare quello che si desidera richiedere.When connected to more than one device, you must enumerate the collection of PointOfService device objects to find the one you want to claim. Il codice seguente, ad esempio, consente di creare una raccolta di tutti gli scanner di codice a barre attualmente connessi, quindi di cercare uno scanner con un nome specifico nella raccolta.For example, the following code creates a collection of all the barcode scanners currently connected, and then searches the collection for a scanner with a specific name.

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 dispositivoScoping the device selection

Quando ci si connette a un dispositivo, è possibile limitare la ricerca a un subset di periferiche di punti di servizio a cui l'app può accedere.When connecting to a device, you may want to limit your search to a subset of Point of Service peripherals that your app has access to. 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).Using the GetDeviceSelector method, you can scope the selection to retrieve devices connected only by a certain method (Bluetooth, USB, etc.). È possibile creare un selettore che cerca i dispositivi su Bluetooth, IP, localeo tutti i tipi di connessione.You can create a selector that searches for devices over Bluetooth, IP, Local, or All connection types. Questa operazione può essere utile, poiché l'individuazione dei dispositivi wireless richiede molto tempo rispetto all'individuazione locale (cablata).This can be useful, as wireless device discovery takes a long time compared to local (wired) discovery. È possibile garantire un tempo di attesa deterministico per la connessione del dispositivo locale limitando FindAllAsync ai tipi di connessione locali .You can ensure a deterministic wait time for local device connection by limiting FindAllAsync to Local connection types. Questo codice, ad esempio, recupera tutti gli scanner di codice a barre accessibili tramite una connessione locale.For example, this code retrieves all barcode scanners accessible via a local connection.

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

Reazione alle modifiche della connessione del dispositivo con DeviceWatcherReacting to device connection changes with DeviceWatcher

Quando l'app viene eseguita, a volte i dispositivi verranno disconnessi o aggiornati oppure sarà necessario aggiungere nuovi dispositivi.As your app runs, sometimes devices will be disconnected or updated, or new devices will need to be added. È possibile usare la classe DeviceWatcher per accedere agli eventi correlati al dispositivo, in modo che l'app possa rispondere di conseguenza.You can use the DeviceWatcher class to access device-related events, so your app can respond accordingly. Di seguito è riportato un esempio di come usare DeviceWatcher, con stub di metodo da chiamare se un dispositivo viene aggiunto, rimosso o aggiornato.Here’s example of how to use DeviceWatcher, with method stubs to be called if a device is added, removed, or updated.

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 punto di servizioChecking the capabilities of a Point of Service device

Anche all'interno di una classe di dispositivi, ad esempio gli scanner di codice a barre, gli attributi di ogni dispositivo possono variare notevolmente tra i modelli.Even within a device class, such as barcode scanners, the attributes of each device may vary considerably between models. Se l'app richiede un attributo di dispositivo specifico, potrebbe essere necessario controllare ogni oggetto dispositivo connesso per determinare se l'attributo è supportato.If your app requires a specific device attribute, you may need to inspect each connected device object to determine whether the attribute is supported. Ad esempio, è probabile che l'azienda richieda la creazione di etichette usando un modello di stampa a barre specifico.For example, perhaps your business requires that labels be created using a specific barcode printing pattern. Ecco come è possibile verificare se uno scanner di codice a barre collegato supporta una simbologia.Here’s how you could check to see whether a connected barcode scanner supports a symbology.

Nota

Una simbologia è il mapping del linguaggio usato da un codice a barre per codificare i messaggi.A symbology is the language mapping that a barcode uses to encode messages.

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. CapabilitiesUsing the Device.Capabilities class

La classe Device. Capabilities è un attributo di tutte le classi di dispositivi punto di servizio e può essere usata per ottenere informazioni generali su ogni dispositivo.The Device.Capabilities class is an attribute of all Point of Service device classes and can be used to get general information about each device. Ad esempio, in questo esempio viene determinato se un dispositivo supporta la segnalazione delle statistiche e, in caso contrario, recupera le statistiche per tutti i tipi supportati.For example, this example determines whether a device supports statistics reporting and, if it does, retrieves statistics for any types supported.

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 punto di servizioClaiming a Point of Service device

Prima di poter usare un punto di servizio del dispositivo per l'input o l'output attivo, è necessario rivendicarlo, concedendo all'applicazione l'accesso esclusivo a molte delle relative funzioni.Before you can use a Point of Service device for active input or output, you must claim it, granting the application exclusive access to many of its functions. Questo codice Mostra come richiedere un dispositivo scanner di codice a barre, dopo aver trovato il dispositivo usando uno dei metodi descritti in precedenza.This code shows how to claim a barcode scanner device, after you’ve found the device by using one of the methods described earlier.

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

Conservazione del dispositivoRetaining the device

Quando si usa un dispositivo punto di servizio su una rete o una connessione Bluetooth, è possibile condividere il dispositivo con altre app nella rete.When using a Point of Service device over a network or Bluetooth connection, you may wish to share the device with other apps on the network. Per altre informazioni, vedere condivisione di dispositivi. In altri casi, potrebbe essere necessario mantenere il dispositivo per un utilizzo prolungato.(For more info about this, see Sharing Devices.) In other cases, you may want to hold on to the device for prolonged use. Questo esempio illustra come mantenere uno scanner di codice a barre richiesto dopo che un'altra app ha richiesto il rilascio del dispositivo.This example shows how to retain a claimed barcode scanner after another app has requested that the device be released.

claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;

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

Input e outputInput and output

Dopo aver richiesto un dispositivo, si è quasi pronti per usarlo.After you’ve claimed a device, you’re almost ready to use it. Per ricevere l'input dal dispositivo, è necessario configurare e abilitare un delegato per la ricezione dei dati.To receive input from the device, you must set up and enable a delegate to receive data. Nell'esempio seguente viene richiesto un dispositivo scanner di codice a barre, viene impostata la relativa proprietà Decode, quindi viene chiamato EnableAsync per abilitare l'input decodificato dal dispositivo.In the example below, we claim a barcode scanner device, set its decode property, and then call EnableAsync to enable decoded input from the device. Questo processo varia a seconda delle classi di dispositivi. per informazioni su come configurare un delegato per i dispositivi non barcode, vedere l'esempio di app UWPpertinente.This process varies between device classes, so for guidance about how to set up a delegate for non-barcode devices, refer to the relevant UWP app sample.

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 appSharing a device between apps

I dispositivi punto di servizio vengono spesso usati nei casi in cui più app dovranno accedervi in un breve periodo di tempo.Point of Service devices are often used in cases where more than one app will need to access them in a brief period. Un dispositivo può essere condiviso quando si è connessi a più app localmente (USB o altra connessione cablata) o tramite una rete Bluetooth o IP.A device can be shared when connected to multiple apps locally (USB or other wired connection), or through a Bluetooth or IP network. A seconda delle esigenze di ogni app, un processo potrebbe dover eliminare l'attestazione sul dispositivo.Depending on the needs of each app, one process may need to dispose of its claim on the device. Questo codice elimina il dispositivo di scanner di codice a barre richiesto, consentendo ad altre app di attestarlo e utilizzarlo.This code disposes of our claimed barcode scanner device, allowing other apps to claim and use it.

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

Nota

Entrambe le classi di dispositivi del servizio e il punto dichiarato non reclamato implementano l' Interfaccia IClosable.Both the claimed and unclaimed Point of Service device classes implement the IClosable interface. Se un dispositivo è connesso a un'app tramite rete o Bluetooth, è necessario eliminare gli oggetti richiesti e non richiesti prima che un'altra app possa connettersi.If a device is connected to an app via network or Bluetooth, both the claimed and unclaimed objects must be disposed of before another app can connect.

Vedere ancheSee also