Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los dispositivos punto de servicio, punto de venta o punto de servicio son periféricos informáticos que se usan para facilitar las transacciones comerciales. Algunos ejemplos de dispositivos de punto de servicio incluyen registros electrónicos de efectivo, 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 los dispositivos de punto de servicio mediante las API de punto de servicio de Windows Runtime. Trataremos la enumeración de dispositivos, la comprobación de las funcionalidades del dispositivo, la notificación de dispositivos y el uso compartido de dispositivos. Usamos un dispositivo de escáner de códigos de barras como ejemplo, pero casi todas las instrucciones aquí se aplican a cualquier dispositivo de punto de servicio compatible con UWP. (Para obtener una lista de 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 con el equipo donde se ejecuta la aplicación. Hay varias maneras de conectarse a dispositivos de punto de servicio, ya sea mediante programación o a través de la configuración de Windows.
Conexión a dispositivos mediante la configuración de Windows
Cuando conecta un dispositivo de punto de servicio como un escáner de códigos de barras a un equipo, se muestra igual que cualquier otro dispositivo. Puede encontrarlo en la sección Dispositivos > Bluetooth y otros dispositivos de Configuración. Allí puede emparejar con un dispositivo Punto de Servicio seleccionando Agregar Bluetooth u otro dispositivo.
Algunos dispositivos de Punto de Servicio pueden no aparecer en Configuración hasta que se enumeren programáticamente mediante 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 punto de servicio conectado al equipo donde se ejecuta la aplicación y 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 reclamarse. "Reclamar un dispositivo otorga a una aplicación acceso exclusivo, evitando comandos conflictivos de varios procesos."
Note
Si hay más de un dispositivo 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 un dispositivo de punto de servicio sea 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 PointOfService objetos de dispositivo para encontrar el que desea 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 la colección para 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");
}
}
Determinar el ámbito de la selección del dispositivo
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 determinado método (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 (cableada). Puede garantizar un tiempo de espera determinista para la conexión a dispositivos locales limitando FindAllAsync a tipos de conexión Local. 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 del dispositivo con DeviceWatcher
A medida que se ejecuta la aplicación, a veces los dispositivos se desconectarán o actualizarán, o será necesario agregar nuevos dispositivos. Puedes usar la clase DeviceWatcher para acceder a eventos relacionados con el dispositivo, por lo que tu aplicación puede responder en consecuencia. Aquí tienes un ejemplo de cómo usar DeviceWatcher, con esqueletos de métodos que se llamarán si se agrega, quita o 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 dispositivo, como escáneres de códigos de barras, los atributos de cada dispositivo pueden variar considerablemente entre los modelos. 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ódigo de barras específico. Aquí se muestra cómo puede comprobar si un escáner de código de barras conectado admite una simbología.
Note
Una simbología es el mapeo de lenguaje que utiliza 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 dispositivo punto de servicio y se puede usar para obtener información general sobre cada dispositivo. Por ejemplo, este ejemplo determina si un dispositivo admite la generación de informes de estadísticas y, si es así, recupera las estadísticas de los tipos admitidos.
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);
}
Solicitud de un dispositivo de punto de servicio
Para poder usar un dispositivo de punto de servicio para la entrada o salida activa, debe reclamarlo, concediéndole acceso exclusivo a muchas de sus funciones. Este código muestra cómo reclamar un dispositivo de escáner de código 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);
}
Conservar el dispositivo
Al usar un dispositivo de punto de servicio a través de una red o conexión Bluetooth, es posible que desee compartir el dispositivo con otras aplicaciones de la red. (Para obtener más información sobre esto, consulta Compartir Dispositivos). En otros casos, es posible que desees conservar el dispositivo para su uso prolongado. En este ejemplo se muestra cómo conservar un escáner de códigos de barras reclamado después de que otra aplicación haya solicitado que el dispositivo se libere.
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, estás casi listo para usarlo. Para recibir la entrada 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 dispositivo, por lo que para obtener instrucciones sobre cómo configurar un delegado para dispositivos que no son de código de barras, consulte el ejemplo de aplicación para UWP correspondiente.
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
Los dispositivos de punto de servicio a menudo se usan en los casos en los que más de una aplicación tendrá que acceder a ellos en un breve período. Un dispositivo se puede compartir cuando se conecta a varias aplicaciones localmente (USB u otra conexión cableada), 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 renunciar a su derecho sobre el dispositivo. Este código elimina nuestro dispositivo de escáner de códigos de barras reclamado, lo que permite a otras aplicaciones reclamarla y usarla.
if (claimedBarcodeScanner != null)
{
claimedBarcodeScanner.Dispose();
claimedBarcodeScanner = null;
}
Note
Tanto las clases de dispositivo 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, los objetos reclamados y no reclamados deben eliminarse para poder conectarse a otra aplicación.