Introducción al punto de servicio
Los dispositivos de punto de servicio o punto de venta son periféricos informáticos que se usan para facilitar las transacciones comerciales. Algunos ejemplos de dispositivos de punto de servicio incluyen cajas registradoras electrónicas, escáneres de códigos de barras, lectores de bandas magnéticas e impresoras de recibos.
Aquí aprenderá los conceptos básicos de la interacción con dispositivos de punto de servicio mediante las API de punto de servicio de Windows Runtime. Se tratarán temas como la enumeración de dispositivos, la comprobación de funcionalidades de dispositivos, la reclamación de dispositivos y el uso compartido de dispositivos. Usamos un escáner de códigos de barras como ejemplo, pero casi todas las instrucciones que se indican aquí se aplican a cualquier dispositivo de punto de servicio compatible con UWP. (Para obtener una lista de los dispositivos compatibles, consulte Compatibilidad con dispositivos de punto de servicio).
Búsqueda y conexión a periféricos de punto de servicio
Antes de que una aplicación pueda usar un dispositivo de punto de servicio, debe emparejarse el dispositivo con el equipo en el que se ejecuta la aplicación. 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 Configuración.
Conexión a dispositivos mediante la aplicación Configuración
Cuando conecta un dispositivo de punto de servicio como un escáner de código de barras a un equipo, se muestra igual que cualquier otro dispositivo. Puedes encontrarlo en la sección Dispositivos > Bluetooth y otros dispositivos de la aplicación Configuración. Allí puede emparejar el equipo con un dispositivo de punto de servicio seleccionando Agregar Bluetooth u otro dispositivo.
Es posible que algunos dispositivos de punto de servicio no aparezcan en la aplicación Configuración hasta que se enumeren mediante programación utilizando las API de punto de servicio.
Obtención de un único dispositivo de punto de servicio con GetDefaultAsync
En un caso de uso sencillo, es posible que solo tenga un periférico de punto de servicio conectado al equipo donde se ejecuta la aplicación y que quiera configurarlo lo más rápido posible. Para ello, recupere el dispositivo "predeterminado" con el método GetDefaultAsync como se muestra aquí.
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. Al "reclamar" un dispositivo, la aplicación obtiene acceso exclusivo a él, lo que impide la existencia de comandos en conflicto de varios procesos.
Nota:
Si hay más de un dispositivo de punto de servicio conectado al equipo, GetDefaultAsync devuelve el primer dispositivo que encuentra. Por este motivo, use FindAllAsync a menos que esté seguro de que solo hay un dispositivo de punto de servicio visible para la aplicación.
Enumeración de una colección de dispositivos con FindAllAsync
Cuando se conecta a más de un dispositivo, debe enumerar la colección de objetos de dispositivo PointOfService para encontrar el que quiere reclamar. 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.
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");
}
}
Determinación del ámbito de la selección de dispositivos
Al conectarse a un dispositivo, es posible que quiera limitar la búsqueda a un subconjunto de periféricos de punto de servicio a los que tiene acceso la aplicación. Con el método GetDeviceSelector, puede definir el ámbito de la selección para recuperar dispositivos conectados solo mediante un método determinado (Bluetooth, USB, etc.). Puede crear un selector que busque dispositivos a través de Bluetooth, IP, Local o Todos los tipos de conexión. Esto puede ser útil, ya que la detección de dispositivos inalámbricos tarda mucho tiempo en comparación con la detección local (con cable). Puede garantizar un tiempo de espera determinista para la conexión de dispositivos locales limitando FindAllAsync a los tipos de conexión Locales. Por ejemplo, este código recupera todos los escáneres de códigos de barras accesibles a través de una conexión local.
string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Reacción a los cambios de conexión de dispositivos con DeviceWatcher
A medida que se ejecuta la aplicación, a veces los dispositivos se desconectan o actualizan, o es necesario agregar nuevos dispositivos. Puedes usar la clase DeviceWatcher para acceder a eventos relacionados con el dispositivo, de modo que la aplicación pueda responder en consecuencia. Este es un ejemplo de cómo usar DeviceWatcher, con códigos auxiliares de método que se llamarán si se agrega, se quita o se actualiza 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
}
Comprobación de las funcionalidades de un dispositivo de punto de servicio
Incluso dentro de una clase de dispositivos, como los escáneres de códigos de barras, los atributos de cada dispositivo pueden variar considerablemente de un modelo a otro. Si la aplicación requiere un atributo de dispositivo específico, es posible que tenga que inspeccionar cada objeto de dispositivo conectado para determinar si se admite el atributo. Por ejemplo, quizás su empresa requiera que las etiquetas se creen con un patrón de impresión de códigos de barras específico. Aquí se muestra cómo puede comprobar si un escáner de códigos de barras conectado admite una simbología.
Nota:
Una simbología es la asignación de idioma que usa un código de barras para codificar mensajes.
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 de la clase Device.Capabilities
La clase Device.Capabilities es un atributo de todas las clases de dispositivos de punto de servicio y se puede usar para obtener información general sobre cada dispositivo. Por ejemplo, en este ejemplo se determina si un dispositivo admite informes de estadísticas y, si es así, recupera las estadísticas de cualquier tipo admitido.
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);
}
Reclamación de un dispositivo de punto de servicio
Para poder usar un dispositivo de punto de servicio para la entrada o salida activa, debe reclamarlo y conceder a la aplicación acceso exclusivo a muchas de sus funciones. Este código muestra cómo reclamar un dispositivo de escáner de códigos de barras, después de haber encontrado el dispositivo mediante uno de los métodos descritos anteriormente.
try
{
claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
}
catch (Exception ex)
{
Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}
Retención del dispositivo
Al usar un dispositivo de punto de servicio a través de una conexión de red o Bluetooth, es posible que quiera compartir el dispositivo con otras aplicaciones de la red. (Para obtener más información sobre esto, consulta Uso compartido de dispositivos). En otros casos, es posible que quiera retener el dispositivo para un uso prolongado. En este ejemplo se muestra cómo retener un escáner de códigos de barras reclamado después de que otra aplicación haya solicitado que se libere el dispositivo.
claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;
void claimedBarcodeScanner_ReleaseDeviceRequested(object sender, ClaimedBarcodeScanner e)
{
e.RetainDevice(); // Retain exclusive access to the device
}
Entrada y salida
Después de reclamar un dispositivo, casi está listo para usarlo. Para recibir entradas del dispositivo, debe configurar y habilitar un delegado para recibir datos. En el ejemplo siguiente, se reclama un dispositivo de escáner de códigos de barras, se establece su propiedad de descodificación y, a continuación, se llama a EnableAsync para habilitar la entrada descodificada desde el dispositivo. Este proceso varía entre las clases de dispositivos, por lo que para obtener instrucciones sobre cómo configurar un delegado para dispositivos que no sean de códigos de barras, consulte el ejemplo de aplicación para 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);
}
Uso compartido de un dispositivo entre aplicaciones
A menudo, los dispositivos de punto de servicio se usan en casos en los que más de una aplicación tendrá que acceder a ellos en un breve período de tiempo. Un dispositivo se puede compartir cuando se conecta a varias aplicaciones localmente (USB u otra conexión con cable), o a través de una red Bluetooth o IP. En función de las necesidades de cada aplicación, es posible que un proceso tenga que eliminar su reclamación del dispositivo. Este código elimina nuestro dispositivo de escáner de códigos de barras reclamado, lo que permite que otras aplicaciones lo reclamen y lo usen.
if (claimedBarcodeScanner != null)
{
claimedBarcodeScanner.Dispose();
claimedBarcodeScanner = null;
}
Nota:
Tanto las clases de dispositivos de punto de servicio reclamadas como las no reclamadas implementan la interfaz IClosable. Si un dispositivo está conectado a una aplicación a través de la red o Bluetooth, se deben eliminar los objetos reclamados y no reclamados antes de que otra aplicación pueda conectarse.