Начало работы с POS-устройствамиGetting started with Point of Service

POS-устройства (от point of sale, т. е. точка продажи, или point of service, т. е. точка обслуживания) — это периферийные вычислительные устройства, облегчающие транзакции в розничной торговле.Point of service, point of sale, or Point of Service devices are computer peripherals used to facilitate retail transactions. В качестве примеров POS-устройств можно назвать электронные кассовые аппараты, сканеры штрихкодов, считыватели магнитных карт и чековые принтеры.Examples of Point of Service devices include electronic cash registers, barcode scanners, magnetic stripe readers, and receipt printers.

Здесь вы узнаете об основах взаимодействия с устройствами точки обслуживания с помощью среда выполнения Windows API-интерфейсов службы.Here you’ll learn the basics of interfacing with Point of Service devices by using the Windows Runtime Point of Service APIs. Мы рассмотрим перечисление устройств, проверка возможностей устройства, присвоение устройств и предоставление общего доступа к устройствам.We’ll cover device enumeration, checking device capabilities, claiming devices, and device sharing. Мы используем сканер штрихкодов в качестве примера, но практически вся информация в этом руководстве применима к любым совместимым с UWP POS-устройствам.We use a barcode scanner device as an example, but almost all the guidance here applies to any UWP-compatible Point of Service device. (Список поддерживаемых устройств см. в разделе Поддержка POS-устройств).(For a list of supported devices, see Point of Service device support).

Поиск периферийных POS-устройств и подключение к нимFinding and connecting to Point of Service peripherals

Прежде чем POS-устройство сможет использоваться каким-либо приложением, его необходимо связать с ПК, на котором выполняется приложение.Before a Point of Service device can be used by an app, it must be paired with the PC where the app is running. Существует несколько способов подключения к POS-устройствам программными средствами или через приложение "Параметры".There are several ways to connect to Point of Service devices, either programmatically or through the Settings app.

Подключение к устройствам с помощью приложения "Параметры"Connecting to devices by using the Settings app

При подключении к ПК POS-устройства, например, сканера штрихкодов, оно отображается как любое другое устройство.When you plug a Point of Service device like a barcode scanner into a PC, it shows up just like any other device. Его можно найти в разделе Устройства > Bluetooth и другие устройства приложения "Параметры"You can find it in the Devices > Bluetooth & other devices section of the Settings app. Оттуда же можно связать ПК с POS-устройством выбрав команду Добавление Bluetooth или другого устройства.There you can pair with a Point of Service device by selecting Add Bluetooth or other device.

Некоторые POS-устройства могут не отображаться в приложении "Параметры", пока не будут перечислены программным способом с использованием API-интерфейсов PointOfService.Some Point of Service devices may not appear in the Settings app until they are programmatically enumerated by using the Point of Service APIs.

Получение одного POS-устройства с помощью GetDefaultAsyncGetting a single Point of Service device with GetDefaultAsync

В простом сценарии у вас, к примеру, может быть только одно периферийное POS-устройство, подключенное к ПК, на котором выполняется приложение, и вы хотите настроить его максимально быстро.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. Для этого необходимо извлечь устройство "по умолчанию" с методом GetDefaultAsync, как показано здесь.To do that, retrieve the “default” device with the GetDefaultAsync method as shown here.

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

Если устройство по умолчанию найдено, извлекаемый объект устройства готов к присвоению.If the default device is found, the device object retrieved is ready to be claimed. "Присвоение" устройства дает приложению эксклюзивный доступ к нему, предотвращая конфликтующие команды из нескольких процессов.“Claiming” a device gives an application exclusive access to it, preventing conflicting commands from multiple processes.

Примечание

Если к ПК подключено несколько POS-устройств, GetDefaultAsync возвращает первое найденное устройство.If more than one Point of Service device is connected to the PC, GetDefaultAsync returns the first device it finds. По этой причине необходимо использовать FindAllAsync, если вы не уверены, что приложению видно только одно POS-устройство.For this reason, use FindAllAsync unless you’re sure that only one Point of Service device is visible to the application.

Перечисление коллекции устройств с FindAllAsyncEnumerating a collection of devices with FindAllAsync

Если подключение выполняется к нескольким устройствам, необходимо перечислить коллекцию объектов устройств PointOfService, чтобы найти нужное для присвоения.When connected to more than one device, you must enumerate the collection of PointOfService device objects to find the one you want to claim. Например, в следующем коде создается коллекция из всех сканеров штрихкодов, которые подключены в настоящее время, а затем в коллекции выполняется поиск сканера с определенным именем.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");
    }
}

Определение области выбора устройствScoping the device selection

При подключении к устройству может потребоваться ограничить поиск подмножеством периферийных POS-устройств, к которым у вашего приложения есть доступ.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. С помощью метода GetDeviceSelector можно определить область выбора, чтобы извлекать только устройства, подключенные определенным способом (Bluetooth, USB и т. д.).Using the GetDeviceSelector method, you can scope the selection to retrieve devices connected only by a certain method (Bluetooth, USB, etc.). Можно создать механизм выбора, который будет искать устройства по типам подключения: Bluetooth, IP, Локальное или Все.You can create a selector that searches for devices over Bluetooth, IP, Local, or All connection types. Это может оказаться полезным, поскольку обнаружение беспроводных устройств занимает много времени по сравнению с обнаружением локальных (проводных) устройств.This can be useful, as wireless device discovery takes a long time compared to local (wired) discovery. Можно указать детерминированное время ожидания подключения локального устройства, ограничив значения FindAllAsync типом подключения Локальное.You can ensure a deterministic wait time for local device connection by limiting FindAllAsync to Local connection types. Например, этот код извлекает все сканеры штрихкодов, доступные по локальному подключению.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);

Реагирование на изменения подключения устройств с DeviceWatcherReacting to device connection changes with DeviceWatcher

Во время работы приложения устройства могут отключаться или обновляться. Кроме того, может возникнуть необходимость в добавлении новых устройств.As your app runs, sometimes devices will be disconnected or updated, or new devices will need to be added. Можно использовать класс DeviceWatcher для доступа к событиям, связанным с устройствами, чтобы ваше приложение могло отвечать соответственно.You can use the DeviceWatcher class to access device-related events, so your app can respond accordingly. Ниже приведен пример использования DeviceWatcher, когда заглушки метода нужно вызывать при добавлении, удалении или обновлении устройства.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
}

Проверка возможностей POS-устройстваChecking the capabilities of a Point of Service device

Даже в пределах класса устройств (например, сканеров штрихкодов) атрибуты устройства могут существенно варьироваться в зависимости от модели.Even within a device class, such as barcode scanners, the attributes of each device may vary considerably between models. Если вашему приложению требуется конкретный атрибут устройства, возможно, потребуется проверить каждый объект подключенного устройства, чтобы определить, поддерживается ли атрибут.If your app requires a specific device attribute, you may need to inspect each connected device object to determine whether the attribute is supported. Например, возможно, компании нужно, чтобы этикетки создавались по конкретному шаблону печати штрихкода.For example, perhaps your business requires that labels be created using a specific barcode printing pattern. Вот как узнать, поддерживает ли подключенный сканер штрихкодов определенную символику.Here’s how you could check to see whether a connected barcode scanner supports a symbology.

Примечание

Символика — это языковое сопоставление, используемое штрихкодом для кодирования сообщений.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);
}

Использование класса Device.CapabilitiesUsing the Device.Capabilities class

Класс Device.Capabilities — это атрибут всех классов POS-устройств, который можно использовать для получения общих свойств о каждом устройстве.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. Например, в этом примере определяется, поддерживает ли устройство статистическую отчетность, и если да, извлекает статистику только для поддерживаемых типов.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);
}

Присвоение POS-устройстваClaiming a Point of Service device

Прежде чем использовать POS-устройство для активного ввода или вывода, его необходимо присвоить, предоставив приложению эксклюзивный доступ к его многочисленным функциям.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. Этот код показывает, как присваивать устройство сканирования штрихкодов после обнаружения устройства одним из вышеперечисленных методов.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);
}

Сохранение устройстваRetaining the device

При использовании POS-устройства по сетевому подключению или подключению Bluetooth может возникнуть необходимость предоставить устройство другим приложениям в сети.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. (Дополнительные сведения об этом см. в разделе Предоставление общего доступа к устройствам.) В других случаях целесообразно сохранить устройство за приложением для длительного использования.(For more info about this, see Sharing Devices.) In other cases, you may want to hold on to the device for prolonged use. В этом примере показано, как сохранить присвоенный сканер штрихкодов после того, как другое приложение пришлет запрос на его освобождение.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
}

Ввод и выводInput and output

Присвоив устройство, вы почти готовы его использовать.After you’ve claimed a device, you’re almost ready to use it. Чтобы получить входные данные с устройства, необходимо настроить его и включить делегат для получения данных.To receive input from the device, you must set up and enable a delegate to receive data. В приведенном ниже примере мы присваиваем сканер штрихкодов, задаем его свойство декодирования и вызываем метод EnableAsync, чтобы включить получение декодированных входных данных с устройства.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. Этот процесс варьируется в зависимости от классов устройств, поэтому инструкции по настройке делегата для устройств без штрихкода см. в соответствующем примере приложения UWP.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);
}

Предоставление приложениям общего доступа к устройствуSharing a device between apps

POS-устройства часто используются в сценариях, когда доступ к ним потребуется осуществить нескольким приложениям за короткое время.Point of Service devices are often used in cases where more than one app will need to access them in a brief period. Общий доступ к устройству может быть предоставлен, если оно локально подключено к нескольким приложениям (USB или другое проводное подключение) либо по сети Bluetooth или IP.A device can be shared when connected to multiple apps locally (USB or other wired connection), or through a Bluetooth or IP network. В зависимости от потребностей каждого приложения одному процессу, возможно, придется отказаться от присвоения устройства.Depending on the needs of each app, one process may need to dispose of its claim on the device. Этот код удаляет наш присвоенный сканер штрихкода, после чего его смогут присвоить и использовать другие приложения.This code disposes of our claimed barcode scanner device, allowing other apps to claim and use it.

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

Примечание

Присвоенные и неприсвоенные классы POS-устройств реализуют интерфейс IClosable.Both the claimed and unclaimed Point of Service device classes implement the IClosable interface. Если устройство подключено к приложению через сеть или по Bluetooth, присвоенные и неприсвоенные объекты необходимо удалить, прежде чем другое приложение сможет подключиться к устройству.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.

См. также разделSee also