開始使用服務點
服務點、銷售點或服務點裝置是用來促進零售交易的電腦周邊。 服務點裝置的範例包括電子收銀機、條碼掃描器、磁條讀取器和收據印表機。
在這裡,您將了解使用 Windows 執行階段服務點 API 與服務點裝置互動的基本概念。 我們將介紹裝置列舉、檢查裝置功能、宣告裝置和裝置共用等主題。 我們以條碼掃描器裝置為例,但這裡的幾乎所有指引都適用於任何 UWP 相容的服務點裝置。 (如需支援裝置的清單,請參閱服務點裝置支援)。
尋找並連線至服務點周邊
在應用程式可以使用服務點裝置之前,其必須與應用程式執行所在的電腦進行配對。 有數種方式可以透過程式設計方式或透過 [設定] 應用程式連線至服務點裝置。
使用 [設定] 應用程式連線至裝置
當您將像條碼掃描器之類的服務點裝置插入電腦時,顯示方式與其他任何裝置一樣。 您可以在設定應用程式的裝置>藍牙&其他裝置部分找到它。 您可以選取 [新增藍牙或其他裝置],以與服務點裝置配對。
在使用服務點 API 以程式設計方式列舉之前,某些服務點裝置可能不會出現在 [設定] 應用程式中。
使用 GetDefaultAsync 取得單一服務點裝置
在簡單的使用案例中,您可能只有一個服務點周邊連線至應用程式執行所在的電腦,且想要儘快完成設定。 若要這樣做,請使用 GetDefaultAsync 方法來擷取「預設」裝置,如下所示。
using Windows.Devices.PointOfService;
BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();
如果找到預設裝置,則擷取的裝置物件已準備好宣告。 「宣告」裝置會提供應用程式的獨佔存取權,以防止來自多個處理程序的衝突命令。
注意
如果一個以上的服務點裝置連線至電腦,則 GetDefaultAsync 會傳回其所找到的第一個裝置。 基於這個理由,除非您確定應用程式只能看到一個服務點裝置,否則請使用 FindAllAsync。
使用 FindAllAsync 列舉裝置集合
連線至多個裝置時,您必須列舉 PointOfService 裝置物件的集合,以尋找您想要宣告的裝置物件。 例如,下列程式碼會建立目前已連線所有條碼掃描器的集合,然後搜尋具有特定名稱的掃描器集合。
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");
}
}
界定裝置選取範圍
連線至裝置時,您可能會想要將搜尋限制為應用程式可存取的一部分服務點周邊。 使用 GetDeviceSelector 方法,您可以設定選取範圍,只擷取以特定方法 (藍牙、USB 等) 連線的裝置。 您可以建立選取器,以透過藍牙、IP、本機或所有連線類型搜尋裝置。 這個方法很實用,因為與本機 (有線) 探索相比,無線裝置探索需要很長的時間。 您可以將 FindAllAsync 限制為本機連線類型,以確保本機裝置連線的決定性等候時間。 例如,此程式碼會擷取可透過本機連線存取的所有條碼掃描器。
string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
使用 DeviceWatcher 回應裝置連線變更
當您的應用程式執行時,有時候裝置會中斷連線或更新,或需要新增新的裝置。 您可以使用 DeviceWatcher 類別來存取裝置相關事件,讓您的應用程式可以據以回應。 以下是如何使用 DeviceWatcher 的範例,以及新增、移除或更新裝置時要呼叫的方法虛設常式。
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
}
檢查服務點裝置的功能
即使在條碼掃描器之類的裝置類別中,每個裝置的屬性也可能在型號之間有很大的差異。 如果您的應用程式需要特定的裝置屬性,您可能需要檢查每個連線的裝置物件,以判斷是否支援屬性。 例如,您的企業可能需要使用特定的條碼列印模式來建立標籤。 以下說明如何檢查連線的條碼掃描器是否支援符號系統。
注意
符號系統是條碼用來編碼訊息的語言對應。
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 類別
Device.Capabilities 類別是所有服務點裝置類別的屬性,可用來取得每個裝置的一般資訊。 例如,這個範例會判斷裝置是否支援統計資料包告,如果確實支援,則會擷取所支援任何類型的統計資料。
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);
}
宣告服務點裝置
您必須先宣告服務點裝置,才能使用服務點裝置進行主動輸入或輸出,並授與應用程式對其許多功能的獨佔存取權。 此程式碼會示範如何在您使用先前所述的其中一種方法找到裝置之後,宣告條碼掃描器裝置。
try
{
claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();
}
catch (Exception ex)
{
Debug.WriteLine("EX: ClaimScannerAsync() - " - ex.Message);
}
保留裝置
透過網路或藍牙連線使用服務點裝置時,您可能會想要與網路上的其他應用程式共用裝置。 (如需詳細資訊,請參閱共用裝置。)在其他情況下,您可能想要保留裝置以供長時間使用。 此範例示範如何在另一個應用程式要求釋放裝置之後,保留宣告的條碼掃描器。
claimedBarcodeScanner.ReleaseDeviceRequested += claimedBarcodeScanner_ReleaseDeviceRequested;
void claimedBarcodeScanner_ReleaseDeviceRequested(object sender, ClaimedBarcodeScanner e)
{
e.RetainDevice(); // Retain exclusive access to the device
}
輸入和輸出
宣告裝置之後,您幾乎已準備好使用裝置。 若要從裝置接收輸入,您必須設定並啟用委派來接收資料。 在下列範例中,我們會宣告條碼掃描器裝置、設定其解碼屬性,然後呼叫 EnableAsync 以啟用裝置的解碼輸入。 此程序會因裝置類別而異,因此如需如何為非條碼裝置設定委派的指引,請參閱相關的 UWP 應用程式範例。
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);
}
在應用程式之間共用裝置
服務點裝置通常用於一個以上應用程式需要短暫存取裝置的情況。 裝置可以在本機連線至多個應用程式時共用 (USB 或其他有線連線),或透過藍牙或 IP 網路。 視每個應用程式的需求而定,一個程序可能需要處置其在裝置上的宣告。 此程式碼會處置我們宣告的條碼掃描器裝置,允許其他應用程式宣告並使用該裝置。
if (claimedBarcodeScanner != null)
{
claimedBarcodeScanner.Dispose();
claimedBarcodeScanner = null;
}
注意
已宣告和未宣告的服務點裝置類別都會實作 IClosable 介面。 如果裝置透過網路或藍牙連線至應用程式,則必須處置已宣告和未宣告的物件,另一個應用程式才能連線。