Introducción al punto de servicioGetting started with Point of Service

Los dispositivos de punto de servicio, punto de venta o punto de servicio son periféricos informáticos que se usan para facilitar las transacciones comerciales.Point of service, point of sale, or Point of Service devices are computer peripherals used to facilitate retail transactions. Algunos ejemplos de dispositivos de punto de servicio son los registros de caja electrónicos, los escáneres de códigos de barras, los lectores de bandas magnéticas y las impresoras de recepción.Examples of Point of Service devices include electronic cash registers, barcode scanners, magnetic stripe readers, and receipt printers.

Aquí aprenderá los conceptos básicos de la interacción con dispositivos de punto de servicio mediante el Windows Runtime punto de API de servicio.Here you’ll learn the basics of interfacing with Point of Service devices by using the Windows Runtime Point of Service APIs. Trataremos la enumeración de dispositivos, comprobará las capacidades de los dispositivos, los dispositivos de la demanda y el uso compartido de dispositivos.We’ll cover device enumeration, checking device capabilities, claiming devices, and device sharing. Usamos un dispositivo de escáner de código de barras como ejemplo, pero casi todas las instrucciones se aplican a cualquier dispositivo de punto de servicio compatible 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. (Para obtener una lista de los dispositivos compatibles, consulte compatibilidad con dispositivos de punto de servicio).(For a list of supported devices, see Point of Service device support).

Búsqueda y conexión a periféricos de punto de servicioFinding and connecting to Point of Service peripherals

Para que una aplicación pueda usar un dispositivo de punto de servicio, se debe emparejar con el equipo en el que se ejecuta la aplicación.Before a Point of Service device can be used by an app, it must be paired with the PC where the app is running. Hay varias maneras de conectarse a los dispositivos de punto de servicio, ya sea mediante programación o a través de la aplicación de configuración.There are several ways to connect to Point of Service devices, either programmatically or through the Settings app.

Conexión a dispositivos mediante el uso de la aplicación de configuraciónConnecting to devices by using the Settings app

Cuando conecta un dispositivo de punto de servicio como un escáner de código de barras en un equipo, se muestra igual que cualquier otro dispositivo.When you plug a Point of Service device like a barcode scanner into a PC, it shows up just like any other device. Puede encontrarlo en la sección dispositivos > Bluetooth & otros dispositivos de la aplicación de configuración.You can find it in the Devices > Bluetooth & other devices section of the Settings app. Puede emparejar con un dispositivo de punto de servicio seleccionando Agregar Bluetooth u otro dispositivo.There you can pair with a Point of Service device by selecting Add Bluetooth or other device.

Es posible que algunos dispositivos de punto de servicio no aparezcan en la aplicación de configuración hasta que se enumeren mediante programación con las API de punto de servicio.Some Point of Service devices may not appear in the Settings app until they are programmatically enumerated by using the Point of Service APIs.

Obtención de un único punto de servicio con GetDefaultAsyncGetting a single Point of Service device with GetDefaultAsync

En un caso de uso sencillo, puede tener un solo punto de periférico de servicio conectado al equipo en el que se ejecuta la aplicación y quiere configurarlo lo antes posible.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. Para ello, recupere el dispositivo "predeterminado" con el método GetDefaultAsync , como se muestra aquí.To do that, retrieve the “default” device with the GetDefaultAsync method as shown here.

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

Si se encuentra el dispositivo predeterminado, el objeto de dispositivo recuperado está listo para ser reclamado.If the default device is found, the device object retrieved is ready to be claimed. "Reclamar" un dispositivo proporciona a una aplicación acceso exclusivo a él, evitando comandos en conflicto de varios procesos.“Claiming” a device gives an application exclusive access to it, preventing conflicting commands from multiple processes.

Nota

Si hay más de un punto de servicio conectado al equipo, GetDefaultAsync devuelve el primer dispositivo que encuentra.If more than one Point of Service device is connected to the PC, GetDefaultAsync returns the first device it finds. Por esta razón, use FindAllAsync a menos que esté seguro de que solo un punto de servicio es visible para la aplicación.For this reason, use FindAllAsync unless you’re sure that only one Point of Service device is visible to the application.

Enumerar una colección de dispositivos con FindAllAsyncEnumerating a collection of devices with FindAllAsync

Cuando se conecta a más de un dispositivo, debe enumerar la colección de objetos de dispositivo PointOfService para encontrar el que desea notificar.When connected to more than one device, you must enumerate the collection of PointOfService device objects to find the one you want to claim. Por ejemplo, el código siguiente crea una colección de todos los escáneres de códigos de barras conectados actualmente y, a continuación, busca en la colección un escáner con un nombre específico.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");
    }
}

Ámbito de la selección del dispositivoScoping the device selection

Al conectarse a un dispositivo, puede que desee limitar la búsqueda a un subconjunto de periféricos de punto de servicio al que tiene acceso la aplicación.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. Con el método GetDeviceSelector , puede seleccionar el ámbito de la selección para recuperar dispositivos conectados solo por un método determinado (Bluetooth, USB, etc.).Using the GetDeviceSelector method, you can scope the selection to retrieve devices connected only by a certain method (Bluetooth, USB, etc.). Puede crear un selector que busque dispositivos a través de Bluetooth, IP, localo todos los tipos de conexión.You can create a selector that searches for devices over Bluetooth, IP, Local, or All connection types. Esto puede ser útil, ya que la detección de dispositivos inalámbricos tarda mucho tiempo en comparación con la detección local (cableada).This can be useful, as wireless device discovery takes a long time compared to local (wired) discovery. Puede garantizar un tiempo de espera determinista para la conexión del dispositivo local mediante la limitación de FindAllAsync a tipos de conexión locales .You can ensure a deterministic wait time for local device connection by limiting FindAllAsync to Local connection types. Por ejemplo, este código recupera todos los escáneres de códigos de barras accesibles a través de una conexión local.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);

Reaccionar a los cambios de conexión de dispositivo con DeviceWatcherReacting to device connection changes with DeviceWatcher

A medida que se ejecuta la aplicación, en ocasiones los dispositivos se desconectarán o se actualizarán, o se deberán agregar nuevos dispositivos.As your app runs, sometimes devices will be disconnected or updated, or new devices will need to be added. Puede usar la clase DeviceWatcher para tener acceso a eventos relacionados con el dispositivo, de modo que la aplicación pueda responder en consecuencia.You can use the DeviceWatcher class to access device-related events, so your app can respond accordingly. Este es un ejemplo de cómo usar DeviceWatcher, con códigos auxiliares de método que se llamarán si se agrega, quita o actualiza un dispositivo.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
}

Comprobando las capacidades de un dispositivo de punto de servicioChecking the capabilities of a Point of Service device

Incluso dentro de una clase de dispositivo, como los escáneres de código de barras, los atributos de cada dispositivo pueden variar considerablemente entre modelos.Even within a device class, such as barcode scanners, the attributes of each device may vary considerably between models. Si su aplicación requiere un atributo de dispositivo específico, puede que tenga que inspeccionar cada objeto de dispositivo conectado para determinar si se admite el atributo.If your app requires a specific device attribute, you may need to inspect each connected device object to determine whether the attribute is supported. Por ejemplo, quizás su empresa requiere que las etiquetas se creen con un patrón de impresión de código de barras específico.For example, perhaps your business requires that labels be created using a specific barcode printing pattern. Aquí se muestra cómo puede comprobar si un escáner de códigos de barras conectado admite una simbología.Here’s how you could check to see whether a connected barcode scanner supports a symbology.

Nota

Una simbología es la asignación de lenguaje que usa un código de barras para codificar los mensajes.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);
}

Usar la clase Device. CapabilitiesUsing the Device.Capabilities class

La clase Device. Capabilities es un atributo de todas las clases de dispositivo de punto de servicio y se puede usar para obtener información general sobre cada 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. Por ejemplo, en este ejemplo se determina si un dispositivo admite informes de estadísticas y, si lo hace, recupera estadísticas de los tipos admitidos.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);
}

Reclamar un dispositivo de punto de servicioClaiming a Point of Service device

Antes de poder usar un dispositivo de punto de servicio para la entrada o salida activa, debe reclamarlo, lo que concede a la aplicación acceso exclusivo a muchas de sus funciones.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. Este código muestra cómo reclamar un dispositivo de escáner de código de barras, una vez que haya encontrado el dispositivo con uno de los métodos descritos anteriormente.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);
}

Conservar el dispositivoRetaining the device

Cuando se usa un dispositivo de punto de servicio a través de una conexión de red o Bluetooth, es posible que desee compartir el dispositivo con otras aplicaciones de la red.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. (Para obtener más información sobre esto, consulte uso compartido de dispositivos). En otros casos, puede que desee mantener en el dispositivo un uso prolongado.(For more info about this, see Sharing Devices.) In other cases, you may want to hold on to the device for prolonged use. En este ejemplo se muestra cómo conservar un escáner de código de barras reclamado después de que otra aplicación haya solicitado que el dispositivo se libere.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
}

Entrada y salidaInput and output

Una vez que haya reclamado un dispositivo, está casi listo para usarlo.After you’ve claimed a device, you’re almost ready to use it. Para recibir la entrada del dispositivo, debe configurar y permitir que un delegado reciba datos.To receive input from the device, you must set up and enable a delegate to receive data. En el ejemplo siguiente, se declara un dispositivo de escáner de código de barras, se establece su propiedad Decode y, a continuación, se llama a EnableAsync para habilitar la entrada descodificada desde el 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. Este proceso varía entre las clases de dispositivos, por lo que para obtener instrucciones sobre cómo configurar un delegado para dispositivos sin códigos de barras, consulte el ejemplo de aplicación de 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);
}

Compartir un dispositivo entre aplicacionesSharing a device between apps

Los dispositivos de punto de servicio se suelen usar en casos en los que más de una aplicación necesitará tener acceso a ellos en un breve período.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 puede compartirse cuando se conecta a varias aplicaciones de forma local (USB u otra conexión cableada), o a través de una red 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. En función de las necesidades de cada aplicación, es posible que un proceso tenga que desechar su demanda en el dispositivo.Depending on the needs of each app, one process may need to dispose of its claim on the device. Este código desecha el dispositivo de escáner de código de barras reclamado, lo que permite a otras aplicaciones reclamarlo y usarlo.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

Tanto la clase de dispositivo de servicio como el punto de servicio reclamado implementan la interfaz IClosable.Both the claimed and unclaimed Point of Service device classes implement the IClosable interface. Si un dispositivo está conectado a una aplicación a través de una red o Bluetooth, los objetos solicitados y no reclamados se deben eliminar antes de que otra aplicación pueda conectarse.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.

Vea tambiénSee also