Introdução ao Ponto de ServiçoGetting started with Point of Service

Ponto de serviço, ponto de venda ou dispositivos de Ponto de Serviço são periféricos de computador usados para facilitar as transações de varejo.Point of service, point of sale, or Point of Service devices are computer peripherals used to facilitate retail transactions. Exemplos de dispositivos de Ponto de Serviço incluem caixas registradoras eletrônicos, scanners de código, leitores de tarjas magnéticas e impressoras de recibo.Examples of Point of Service devices include electronic cash registers, barcode scanners, magnetic stripe readers, and receipt printers.

Aqui você aprenderá as noções básicas de como fazer a interface com dispositivos de ponto de serviço usando o Windows Runtime ponto de APIs de serviço.Here you’ll learn the basics of interfacing with Point of Service devices by using the Windows Runtime Point of Service APIs. Abordaremos enumeração do dispositivo, verificação de recursos do dispositivo, declaração de dispositivos e compartilhamento de dispositivos.We’ll cover device enumeration, checking device capabilities, claiming devices, and device sharing. Usamos um dispositivo de scanner 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 a 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 obter uma lista de dispositivos compatíveis, consulte Suporte a dispositivo de Ponto de Serviço).(For a list of supported devices, see Point of Service device support).

Localização e conexão com periféricos de Ponto de ServiçoFinding and connecting to Point of Service peripherals

Antes que um dispositivo de Ponto de Serviço possa ser usado por um aplicativo, ele deve ser emparelhado com o computador no qual o aplicativo está sendo executado.Before a Point of Service device can be used by an app, it must be paired with the PC where the app is running. Há várias formas de se conectar com os dispositivos de Ponto de Serviço, de modo programático ou por meio do aplicativo Configurações.There are several ways to connect to Point of Service devices, either programmatically or through the Settings app.

Conexão com dispositivos usando o aplicativo ConfiguraçõesConnecting to devices by using the Settings app

Ao conectar um dispositivo de Ponto de Serviço como um scanner de código de barras a um computador, ele aparecerá como qualquer outro dispositivo.When you plug a Point of Service device like a barcode scanner into a PC, it shows up just like any other device. Você pode encontrá-lo na seção Dispositivos > Bluetooth e outros dispositivos do aplicativo Configurações.You can find it in the Devices > Bluetooth & other devices section of the Settings app. Nessa seção, é possível fazer o emparelhamento com um dispositivo de Ponto de Serviço selecionando Adicionar Bluetooth ou outro dispositivo.There you can pair with a Point of Service device by selecting Add Bluetooth or other device.

Alguns dispositivos de Ponto de Serviço talvez não apareçam no aplicativo Configurações até que sejam enumerados programaticamente usando as APIs de Ponto de Serviço.Some Point of Service devices may not appear in the Settings app until they are programmatically enumerated by using the Point of Service APIs.

Obtenção de um único dispositivo de Ponto de Serviço com GetDefaultAsyncGetting a single Point of Service device with GetDefaultAsync

Em um caso de uso simples, só é possível ter um periférico de Ponto de Serviço conectado ao computador no qual o aplicativo está em execução e no qual se deseja configurá-lo o mais rápido possível.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 fazê-lo, recupere o dispositivo “padrão” com o método GetDefaultAsync conforme mostrado aqui.To do that, retrieve the “default” device with the GetDefaultAsync method as shown here.

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

Se o dispositivo padrão for encontrado, o objeto de dispositivo recuperado está pronto para ser declarado.If the default device is found, the device object retrieved is ready to be claimed. “Declarar” um dispositivo fornece a ele o acesso exclusivo ao aplicativo, evitando comandos conflitantes decorrentes de vários processos.“Claiming” a device gives an application exclusive access to it, preventing conflicting commands from multiple processes.

Observação

Se mais de um dispositivo de Ponto de Serviço for conectado ao computador, o GetDefaultAsync retorna o primeiro dispositivo encontrado.If more than one Point of Service device is connected to the PC, GetDefaultAsync returns the first device it finds. 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.For this reason, use FindAllAsync unless you’re sure that only one Point of Service device is visible to the application.

Enumeração de uma coleção de dispositivos com FindAllAsyncEnumerating a collection of devices with FindAllAsync

Quando conectado a mais de um dispositivo, você deve enumerar a coleção de objetos de dispositivo de PointOfService para encontrar aquele que deseja declarar.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 exemplo, o código a seguir cria uma coleção de todos os scanners de código de barras atualmente conectados e, em seguida, procura a coleção de um scanner com um nome 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");
    }
}

Escopo da seleção do dispositivoScoping the device selection

Ao se conectar a um dispositivo, você talvez queira limitar sua pesquisa a um subconjunto de periféricos de Ponto de Serviço a que seu aplicativo tem acesso.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 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.).Using the GetDeviceSelector method, you can scope the selection to retrieve devices connected only by a certain method (Bluetooth, USB, etc.). Você pode criar um seletor que procura dispositivos em Bluetooth, IP, Local ou Todos os tipos de conexão.You can create a selector that searches for devices over Bluetooth, IP, Local, or All connection types. Isso pode ser útil, já que a descoberta de dispositivo sem fio leva muito tempo em comparação à descoberta local (com fio).This can be useful, as wireless device discovery takes a long time compared to local (wired) discovery. Você pode garantir um tempo de espera determinista para conexão de dispositivo local limitando FindAllAsync a tipos de conexão Local.You can ensure a deterministic wait time for local device connection by limiting FindAllAsync to Local connection types. Por exemplo, este código recupera todos os scanners de código de barras acessíveis por meio de uma conexão 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);

Reação a mudanças na conexão do dispositivo com DeviceWatcherReacting to device connection changes with DeviceWatcher

À medida que seu aplicativo é executado, os dispositivos serão ocasionalmente desconectados ou atualizados ou novos dispositivos precisarão ser adicionados.As your app runs, sometimes devices will be disconnected or updated, or new devices will need to be added. Você pode usar a classe DeviceWatcher para acessar eventos relacionados ao dispositivo. Com isso, seu aplicativo poderá responder adequadamente.You can use the DeviceWatcher class to access device-related events, so your app can respond accordingly. Eis um exemplo de como usar DeviceWatcher, com stubs de métodos a serem chamados se um dispositivo for adicionado, removido ou atualizado.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
}

Verificando os recursos de um dispositivo de Ponto de ServiçoChecking the capabilities of a Point of Service device

Até mesmo dentro de uma classe de dispositivo, como scanners de código de barras, os atributos de cada dispositivo podem variar consideravelmente entre modelos.Even within a device class, such as barcode scanners, the attributes of each device may vary considerably between models. Se seu aplicativo requer um atributo de dispositivo específico, talvez seja necessário inspecionar cada objeto de dispositivo conectado para determinar se o atributo é compatível.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 exemplo, talvez seu negócio requeira que os rótulos de serem criados usando um padrão de impressão de código de barras específico.For example, perhaps your business requires that labels be created using a specific barcode printing pattern. Veja como você pode verificar se um scanner de código de barras conectado é compatível com uma simbologia.Here’s how you could check to see whether a connected barcode scanner supports a symbology.

Observação

Uma simbologia é o mapeamento de idioma que um código de barras usa para codificar as mensagens.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 da classe Device.CapabilitiesUsing the Device.Capabilities class

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.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 exemplo, este exemplo determina se um dispositivo é compatível com o relatório de estatísticas e, em caso afirmativo, recupera as estatísticas de quaisquer tipos compatíveis.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);
}

Declaração de um dispositivo de Ponto de ServiçoClaiming a Point of Service device

Antes de usar um dispositivo de Ponto de Serviço para entrada ou saída ativos, você deve declará-lo, concedendo ao aplicativo acesso exclusivo a muitas das suas funções.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 mostra como declarar um dispositivo de scanner de código de barras, depois que você encontrou o dispositivo usando um dos 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);
}

Retenção do dispositivoRetaining the device

Ao usar um dispositivo de Ponto de Serviço em uma rede ou conexão Bluetooth, talvez você queira compartilhar o dispositivo com outros aplicativos na rede.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 obter mais informações sobre isso, consulte Sharing Devices.) Em outros casos, pode ser que você queira manter o dispositivo para 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. Este exemplo mostra como manter um scanner de código de barras declarado depois que outro aplicativo solicitou que o dispositivo seja lançado.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 e saídaInput and output

Depois que você declarou um dispositivo, você está quase pronto para usá-lo.After you’ve claimed a device, you’re almost ready to use it. Para receber a entrada do dispositivo, você deve configurar e habilitar um representante para receber dados.To receive input from the device, you must set up and enable a delegate to receive data. No exemplo abaixo, podemos declarar um dispositivo de scanner de código de barras, definir sua propriedade de decodificação e, por fim, chamar EnableAsync para habilitar a entrada decodificada do 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. Como esse processo varia entre classes de dispositivo, para obter orientações sobre como configurar um representante para dispositivos que não são de código de barras, consulte a amostra de aplicativo UWP relevante.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);
}

Compartilhamento de um dispositivo entre aplicativosSharing a device between apps

Dispositivos de Ponto de Serviço geralmente são usados em casos onde mais de um aplicativo precisará acessá-los em um 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. 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.A device can be shared when connected to multiple apps locally (USB or other wired connection), or through a Bluetooth or IP network. Dependendo das necessidades de cada aplicativo, pode ser que um processo precise descartar sua declaração no dispositivo.Depending on the needs of each app, one process may need to dispose of its claim on the device. Esse código descarta nosso dispositivo de scanner de código de barras declarado, permitindo que outros aplicativos o declarem e o usem.This code disposes of our claimed barcode scanner device, allowing other apps to claim and use it.

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

Observação

As classes de dispositivos de Ponto de Serviço declarados e não declarados implementam Interface IClosable.Both the claimed and unclaimed Point of Service device classes implement the IClosable interface. Se um dispositivo for conectado a um aplicativo por meio de rede ou bluetooth, os objetos declarados e não declarados devem ser descartados antes que outro aplicativo possa se conectar.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.

Veja tambémSee also