Introdução ao Ponto de Serviço
Os dispositivos de ponto de serviço, ponto de venda ou Ponto de Serviço são periféricos de computador usados para facilitar transações de varejo. Exemplos de dispositivos de Ponto de Serviço incluem caixas eletrônicos, leitores de código de barras, leitores de tarja magnética e impressoras de recibo.
Aqui você aprenderá as noções básicas de estebelecimento de interface com dispositivos de Ponto de Serviço usando as APIs de Ponto de Serviço do Windows Runtime. Abordaremos a enumeração do dispositivo, verificando os recursos do dispositivo, a reivindicação de dispositivos e o compartilhamento de dispositivos. Usamos um dispositivo leitor de código de barras como exemplo, mas quase todas as diretrizes aqui se aplicam a qualquer dispositivo de Ponto de Serviço compatível com UWP. (Para obter uma lista de dispositivos com suporte, confira Suporte a dispositivos de ponto de serviço).
Localizando e conectando-se a periféricos de Ponto de Serviço
Antes que um dispositivo de ponto de serviço possa ser usado por um aplicativo, ele deve ser emparelhado com o computador em que o aplicativo está em execução. Há várias maneiras de se conectar a dispositivos de ponto de serviço, programaticamente ou por meio do aplicativo Configurações.
Conectando-se a dispositivos usando o aplicativo Configurações
Quando você conecta um dispositivo de ponto de serviço como um leitor de código de barras em um computador, ele aparece como qualquer outro dispositivo. Você pode encontrá-lo na seção Dispositivos > Bluetooth e outros dispositivos do aplicativo Configurações. Lá, você pode emparelhar com um dispositivo de ponto de serviço selecionando Adicionar Bluetooth ou outro dispositivo.
Alguns dispositivos de ponto de serviço podem não aparecer no aplicativo Configurações até que sejam enumerados programaticamente usando as APIs de Ponto de Serviço.
Obter um único dispositivo de Ponto de Serviço com GetDefaultAsync
Em um caso de uso simples, você pode ter apenas um periférico de Ponto de Serviço conectado ao computador em que o aplicativo está em execução e deseja configurá-lo o mais rápido possível. Para fazer isso, recupere o dispositivo "padrão" com o método GetDefaultAsync, conforme mostrado aqui.
using Windows.Devices.PointOfService;
BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();
Se o dispositivo padrão for encontrado, o objeto do dispositivo recuperado estará pronto para ser reivindicado. "Reivindicar" um dispositivo fornece a um aplicativo acesso exclusivo a ele, impedindo comandos conflitantes de vários processos.
Observação
Se mais de um dispositivo ponto de serviço estiver conectado ao computador, GetDefaultAsync retornará o primeiro dispositivo encontrado. Por esse motivo, use FindAllAsync, a menos que você tenha certeza de que apenas um dispositivo de Ponto de Serviço está visível para o aplicativo.
Enumerar uma coleção de dispositivos com FindAllAsync
Quando conectado a mais de um dispositivo, você deve enumerar a coleção de objetos de dispositivo PointOfService para localizar aquele que você deseja reivindicar. Por exemplo, o código a seguir cria uma coleção de todos os leitores de código de barras atualmente conectados e, em seguida, pesquisa a coleção para encontrar um leitor com um nome 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");
}
}
Escopo da seleção do dispositivo
Ao se conectar a um dispositivo, convém limitar sua pesquisa a um subconjunto de periféricos de Ponto de Serviço aos quais seu aplicativo tem acesso. Usando o método GetDeviceSelector, você pode definir o escopo da seleção para recuperar dispositivos conectados apenas por um determinado método (Bluetooth, USB etc.). Você pode criar um seletor que pesquisa dispositivos por Bluetooth, IP, localou Todos os tipos de conexão. Isso pode ser útil, pois a descoberta de dispositivo sem fio leva muito tempo em comparação com a descoberta local (com fio). Você pode garantir um tempo de espera determinístico para a conexão do dispositivo local limitando FindAllAsync aos tipos de conexão Local. Por exemplo, este código recupera todos os leitores de código de barras acessíveis por meio de uma conexão local.
string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Reagindo às alterações de conexão do dispositivo com o DeviceWatcher
À medida que seu aplicativo é executado, às vezes os dispositivos são desconectados ou atualizados ou novos dispositivos precisam ser adicionados. Você pode usar a classe DeviceWatcher para acessar eventos relacionados ao dispositivo, para que seu aplicativo possa responder adequadamente. Aqui está um exemplo de como usar o DeviceWatcher, com stubs de método a serem chamados se um dispositivo for adicionado, removido ou atualizado.
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
}
Verificar os recursos de um dispositivo de ponto de serviço
Mesmo dentro de uma classe de dispositivo, como leitores de código de barras, os atributos de cada dispositivo podem variar consideravelmente entre modelos. Se o aplicativo exigir um atributo de dispositivo específico, talvez seja necessário inspecionar cada objeto de dispositivo conectado para determinar se o atributo tem suporte. Por exemplo, talvez sua empresa exija que os rótulos sejam criados usando um padrão de impressão de código de barras específico. Veja como você pode verificar se um leitor de código de barras conectado dá suporte a uma simbologia.
Observação
Uma simbologia é o mapeamento de idioma que um código de barras usa para codificar mensagens.
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);
}
Usando a classe Device.Capabilities
A classe Device.Capabilities é um atributo de todas as classes de dispositivo de Ponto de Serviço e pode ser usada para obter informações gerais sobre cada dispositivo. Por exemplo, este exemplo determina se um dispositivo dá suporte a relatórios de estatísticas e, se o fizer, recupera estatísticas para qualquer tipo com suporte.
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);
}
Reivindicar um dispositivo de ponto de serviço
Antes de usar um dispositivo de ponto de serviço para entrada ou saída ativa, você deve reivindicá-lo, concedendo ao aplicativo acesso exclusivo a muitas de suas funções. Este código mostra como reivindicar um dispositivo leitor de código de barras depois de encontrar o dispositivo usando um dos métodos descritos anteriormente.
try
{
claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
}
catch (Exception ex)
{
Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}
Retenção do dispositivo
Ao usar um dispositivo de ponto de serviço em uma rede ou conexão Bluetooth, convém compartilhar o dispositivo com outros aplicativos na rede. (Para obter mais informações sobre isso, confira Compartilhamento de dispositivos.) Em outros casos, talvez você queira reter o dispositivo para uso prolongado. Este exemplo mostra como reter um verificador de código de barras reivindicado depois que outro aplicativo solicitou que o dispositivo fosse liberado.
claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;
void claimedBarcodeScanner_ReleaseDeviceRequested(object sender, ClaimedBarcodeScanner e)
{
e.RetainDevice(); // Retain exclusive access to the device
}
Entrada e saída
Depois de reivindicar um dispositivo, você está quase pronto para usá-lo. Para receber a entrada do dispositivo, você deve configurar e habilitar um delegado para receber dados. No exemplo abaixo, reivindicamos um dispositivo leitor de código de barras, definimos sua propriedade de decodificação e, em seguida, chamamos EnableAsync para habilitar a entrada decodificada do dispositivo. Esse processo varia entre classes de dispositivo, portanto, para obter diretrizes sobre como configurar um delegado para dispositivos que não são de código de barras, confira o exemplo de aplicativo UWP relevante.
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);
}
Compartilhar um dispositivo entre aplicativos
Os dispositivos de ponto de serviço geralmente são usados em casos em que mais de um aplicativo precisará acessá-los em um breve período. Um dispositivo pode ser compartilhado quando conectado a vários aplicativos localmente (USB ou outra conexão com fio) ou por meio de uma rede Bluetooth ou IP. Dependendo das necessidades de cada aplicativo, um processo pode precisar descartar sua reivindicação do dispositivo. Esse código descarta nosso dispositivo leitor de código de barras reivindicado, permitindo que outros aplicativos o reivindiquem e o usem.
if (claimedBarcodeScanner != null)
{
claimedBarcodeScanner.Dispose();
claimedBarcodeScanner = null;
}
Observação
As classes de dispositivo ponto de serviço reivindicadas e não reivindicadas implementam a interface IClosable. Se um dispositivo estiver conectado a um aplicativo por meio de rede ou Bluetooth, os objetos reivindicados e não reivindicados deverão ser descartados antes que outro aplicativo possa se conectar.