Erste Schritte mit Point of Service-Geräten
Point of Service- oder Point of Sale-Geräte sind Computerperipheriegeräte, die für Einzelhandelstransaktionen verwendet werden. Beispiele für Point of Service-Geräte sind elektronische Kassen, Barcodescanner, Magnetstreifenleser und Belegdrucker.
Hier lernen Sie die Grundlagen der Arbeit mit Point of Service-Geräten mithilfe der Windows-Runtime-APIs kennen. Dabei werden Themen wie Geräteenumeration, Überprüfen von Gerätefunktionen, Anfordern von Geräten und die gemeinsame Nutzung von Geräten behandelt. Als Beispiel dient ein Barcodescanner, aber fast alle hier aufgeführten Leitfäden gelten für jedes UWP-kompatible Point of Service-Gerät. (Eine Liste der unterstützten Geräte finden Sie unter Point of Service-Geräteunterstützung).
Suchen von und Herstellen einer Verbindung mit Point of Service-Peripheriegeräten
Damit ein Point of Service-Gerät von einer App verwendet werden kann, muss es mit dem PC gekoppelt werden, auf dem die App ausgeführt wird. Es gibt mehrere Möglichkeiten, eine Verbindung mit Point of Service-Geräten herzustellen, entweder programmgesteuert oder über die Einstellungen-App.
Herstellen einer Verbindung mit Geräten mithilfe der Einstellungen-App
Wenn Sie ein Point of Service-Gerät (z. B. einen Barcodescanner) mit einem PC verbinden, wird es wie jedes andere Gerät angezeigt. Sie finden es im Abschnitt Geräte > Bluetooth und weitere Geräte der Einstellungen-App. Dort können Sie die Kopplung mit dem Point of Service-Gerät durchführen, indem Sie Bluetooth- oder anderes Gerät hinzufügen auswählen.
Einige Point of Service-Geräte werden in der Einstellungen-App möglicherweise erst angezeigt, nachdem sie mithilfe der Point of Service-APIs programmgesteuert enumeriert wurden.
Abrufen eines einzelnen Point of Service-Geräts mit GetDefaultAsync
In einem einfachen Anwendungsfall haben Sie möglicherweise nur ein Point of Service-Peripheriegerät mit dem PC verbunden, auf dem die App ausgeführt wird, und möchten es so schnell wie möglich einrichten. Dazu rufen Sie das „Standardgerät“ mit der GetDefaultAsync-Methode ab, wie hier gezeigt.
using Windows.Devices.PointOfService;
BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();
Wenn das Standardgerät gefunden wird, kann das abgerufene Geräteobjekt beansprucht werden. Das „Beanspruchen“ eines Geräts gewährt einer Anwendung exklusiven Zugriff darauf, sodass es zu keinen Konflikten mit Befehlen aus mehreren Prozessen kommt.
Hinweis
Wenn mehrere Point of Service-Geräte mit dem PC verbunden sind, gibt GetDefaultAsync das erste gefundene Gerät zurück. Verwenden Sie aus diesem Grund FindAllAsync, es sei denn, Sie sind sich sicher, dass nur ein Point of Service-Gerät für die Anwendung sichtbar ist.
Enumerieren einer Auflistung von Geräten mit FindAllAsync
Wenn Sie mehrere Geräten verbunden haben, müssen Sie die Auflistung von PointOfService-Geräteobjekten enumerieren, um das Objekt zu finden, das Sie beanspruchen möchten. Der folgende Code erstellt beispielsweise eine Auflistung aller derzeit verbundenen Barcodescanner und durchsucht dann die Auflistung nach einem Scanner mit einem bestimmten Namen.
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");
}
}
Definieren des Bereichs für die Geräteauswahl
Wenn Sie eine Verbindung mit einem Gerät herstellen, können Sie die Suche auf eine Teilmenge der Point of Service-Peripheriegeräte beschränken, auf die Ihre App Zugriff hat. Mit der GetDeviceSelector-Methode können Sie die Auswahl auf Geräte beschränken, die nur über eine bestimmte Methode verbunden sind (Bluetooth, USB usw.). Sie können eine Auswahl erstellen, die nach Geräten über Bluetooth, IP, Lokal oder Alle Verbindungstypen sucht. Dies kann nützlich sein, da die Ermittlung drahtloser Geräte im Vergleich zu lokalen (kabelgebundenen) Geräten sehr lange dauert. Sie können eine bestimmte Wartezeit für lokale Geräteverbindung sicherstellen, indem Sie FindAllAsync auf den Verbindungstyp Lokal beschränken. Der folgende Code ruft beispielsweise alle Barcodescanner ab, auf die über eine lokale Verbindung zugegriffen werden kann.
string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Reagieren auf Änderungen bei der Geräteverbindung mit DeviceWatcher
Während Ihre App ausgeführt wird, werden manchmal Geräte getrennt oder aktualisiert, oder es müssen neue Geräte hinzugefügt werden. Sie können die DeviceWatcher-Klasse verwenden, um auf gerätebezogene Ereignisse zuzugreifen, damit Ihre App entsprechend reagieren kann. Hier sehen Sie ein Beispiel für die Verwendung von DeviceWatcher mit Methodenstubs, die aufgerufen werden sollen, wenn ein Gerät hinzugefügt, entfernt oder aktualisiert wird.
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
}
Überprüfen der Funktionen von Point of Service-Geräten
Auch innerhalb einer Geräteklasse (z. B. Barcodescanner) können die Attribute der einzelnen Geräts bei verschiedenen Modellen erheblich variieren. Wenn Ihre App ein bestimmtes Geräteattribut erfordert, müssen Sie möglicherweise jedes verbundene Geräteobjekt überprüfen, um festzustellen, ob das Attribut unterstützt wird. Vielleicht setzt Ihr Unternehmen beispielsweise voraus, dass Etiketten mit einem bestimmten Barcodemuster gedruckt werden. Im Folgenden wird gezeigt, wie Sie überprüfen können, ob ein verbundener Barcodescanner die Verwendung bestimmter Symbole (eine Symbologie) unterstützt.
Hinweis
Eine Symbologie ist die Sprachzuordnung, die von Barcodes zum Codieren von Nachrichten verwendet wird.
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);
}
Verwenden der Device.Capabilities-Klasse
Die Device.Capabilities-Klasse ist ein Attribut aller Point of Service-Geräteklassen, die verwendet werden kann, um allgemeine Informationen zu den einzelnen Geräten abzurufen. In diesem Beispiel wird z. B. ermittelt, ob ein Gerät das Melden von Statistiken unterstützt. Falls dies der Fall ist, werden die Statistiken für alle unterstützten Typen abgerufen.
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);
}
Beanspruchen von Point of Service-Geräten
Bevor Sie ein Point of Service-Gerät für die aktive Ein- oder Ausgabe verwenden können, müssen Sie es beanspruchen und der Anwendung exklusiven Zugriff auf viele seiner Funktionen gewähren. Der folgende Code zeigt, wie Sie einen Barcodescanner beanspruchen, nachdem Sie das Gerät mithilfe einer der oben beschriebenen Methoden identifiziert haben.
try
{
claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
}
catch (Exception ex)
{
Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}
Beibehalten von Geräten
Wenn Sie ein Point of Service-Gerät über ein Netzwerk oder eine Bluetooth-Verbindung verwenden, können Sie das Gerät für andere Apps im Netzwerk freigeben. (Weitere Informationen hierzu finden Sie unter Freigeben von Geräten.) In anderen Fällen kann es sein, dass Sie das Gerät für eine längere Verwendung beibehalten möchten. In diesem Beispiel wird gezeigt, wie ein beanspruchter Barcodescanner beibehalten wird, nachdem eine andere App die Freigabe des Geräts angefordert hat.
claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;
void claimedBarcodeScanner_ReleaseDeviceRequested(object sender, ClaimedBarcodeScanner e)
{
e.RetainDevice(); // Retain exclusive access to the device
}
Eingabe und Ausgabe
Nachdem Sie ein Gerät beansprucht haben, können Sie es fast schon verwenden. Um Eingaben vom Gerät zu empfangen, müssen Sie einen Delegaten einrichten und aktivieren, der die Daten empfängt. Im folgenden Beispiel fordern Sie einen Barcodescanner an, legen seine Decodierungseigenschaft fest und rufen dann EnableAsync auf, um decodierte Eingaben vom Gerät zu aktivieren. Dieser Prozess variiert je nach Geräteklassen. Einen Leitfaden zum Einrichten eines Delegaten für andere Geräte als Barcodescanner finden Sie im entsprechenden UWP-App-Beispiel.
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);
}
Freigeben von Geräten zwischen Apps
Point of Service-Geräte werden häufig in Situationen verwendet, in denen mehrere Apps in einem kurzen Zeitraum darauf zugreifen müssen. Ein Gerät kann freigegeben werden, wenn es lokal (USB- oder eine andere kabelgebundene Verbindung) oder über Bluetooth oder ein IP-Netzwerk mit mehreren Apps verbunden ist. Je nach den Anforderungen der einzelnen Apps muss möglicherweise ein Prozess seinen Anspruch auf das jeweilige Gerät verwerfen. Mit dem folgenden Code wird Ihr Anspruch für den Barcodescanner aufgehoben, sodass er von anderen Apps beansprucht und verwendet werden kann.
if (claimedBarcodeScanner != null)
{
claimedBarcodeScanner.Dispose();
claimedBarcodeScanner = null;
}
Hinweis
Sowohl beanspruchte als auch nicht beanspruchte Point of Service-Geräteklassen implementieren die IClosable-Schnittstelle. Wenn ein Gerät über ein Netzwerk oder per Bluetooth mit einer App verbunden ist, müssen sowohl die beanspruchten als auch die nicht beanspruchten Objekte verworfen werden, bevor eine andere App eine Verbindung herstellen kann.