POS (店舗販売時点管理) の概要Getting started with Point of Service

POS (店舗販売時点管理または販売時点管理) デバイスとは、小売トランザクションを進めやすくするために使われるコンピューター周辺機器です。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 プラットフォーム (UWP) PointOfService API を使った POS デバイスとのやり取りの基本について説明します。Here you’ll learn the basics of interfacing with Point of Service devices by using the Universal Windows Platform (UWP) PointOfService 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 デバイスを使用するには、アプリが実行されている PC とデバイスを事前にペアリングする必要があります。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 デバイスを PC に接続すると、他のデバイスと同じように表示されます。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. ここで [Bluetooth またはその他のデバイスを追加する] を選択して、POS デバイスとペアリングできます。There you can pair with a Point of Service device by selecting Add Bluetooth or other device.

POS デバイスによっては、POS API を使ってプログラムから列挙されるまで設定アプリに表示されないことがあります。Some Point of Service devices may not appear in the Settings app until they are programmatically enumerated by using the Point of Service APIs.

GetDefaultAsync で 1 台の POS デバイスを取得するGetting a single Point of Service device with GetDefaultAsync

単純な例として、アプリを実行している PC に POS デバイスが 1 台だけ接続されていて、その 1 台をできるだけすばやくセットアップしたい場合があります。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.

注意

PC に複数の POS デバイスが接続されている場合、GetDefaultAsync は最初に見つかったデバイスを返します。If more than one Point of Service device is connected to the PC, GetDefaultAsync returns the first device it finds. このため、アプリケーションから参照できる POS デバイスが 1 台だけであることが確実でなければ、FindAllAsync を使用してください。For this reason, use FindAllAsync unless you’re sure that only one Point of Service device is visible to the application.

FindAllAsync でデバイスのコレクションを列挙するEnumerating 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.). 接続の種類が BluetoothIPLocal、または All のデバイスを検索するセレクターを作成できます。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 で接続の種類を Local に限定すると、ローカル デバイス接続に対する待ち時間だけで検索を完了できます。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);

DeviceWatcher でデバイスの接続状態の変更に対応するReacting 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.Capabilities クラスを使用するUsing the Device.Capabilities class

Device.Capabilities クラスは、すべての POS デバイス クラスが持つ属性の 1 つであり、各デバイスに関する一般的な情報を取得するために使用できます。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

ネットワークまたは Bluetooth 接続経由で POS デバイスを使っているときに、デバイスをネットワーク上の他のアプリと共有したい場合があります 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