Partager via


Exemple de statistiques (documentation du SDK POS pour .NET v1.14)

Les objets de service Microsoft Point of Service pour .NET (POS pour .NET) effectuent continuellement le suivi et la mise à jour d’un certain nombre de statistiques d’appareil pour chaque appareil connecté. Le suivi des statistiques est effectué à l’aide de la DeviceStatistics classe, qui contient des méthodes de réinitialisation, de récupération et de mise à jour des statistiques, ainsi que des méthodes d’assistance pour créer des statistiques, incrémenter des statistiques et charger ou enregistrer des statistiques dans ou depuis le stockage de fichiers XML.

Les rapports de statistiques dans POS pour .NET prennent en charge les statistiques stockées dans du matériel ou des logiciels. Les statistiques basées sur les logiciels sont stockées dans un fichier de statistiques XML, \Program Files\Common Files\Microsoft Shared\Point of Service\Statistics\PosDeviceStatistics.xmlet mises à jour à un intervalle de vidage défini globalement, déterminé au moment de l’installation et de la configuration du système. Par défaut, cet intervalle de vidage est de 1 seconde. Lorsque l’application revendique un appareil, POS pour .NET charge les statistiques appropriées à partir du fichier XML.

La gestion des statistiques spécifiques à l’appareil est prise en charge par l’interface de classe d’appareil de base ou de base . Les objets de service qui héritent d’une classe Base ou De base sont généralement requis uniquement pour appeler IncrementStatistic, ce qui incrémente la valeur d’une statistique spécifiée, ou SetStatistic, qui définit une statistique sur une valeur spécifiée. Toutes les autres implémentations de statistiques sont fournies par l’interface de classe Base ou De base .

Les membres clés de la classe DeviceStatistics sont détaillés ci-dessous :

  • CapStatisticsReporting identifie les fonctionnalités de création de rapports de statistiques de l’appareil. Lorsque CapStatisticsReporting a la valeur false, aucune donnée statistique concernant l’appareil n’est disponible. Si CapStatisticsReporting est vrai, certaines données statistiques sont disponibles et l’appareil peut commencer à accumuler diverses statistiques concernant l’utilisation. Les informations accumulées et signalées sont spécifiques à l’appareil et sont récupérées à l’aide de la méthode RetrieveStatistics .

  • CapUpdateStatistics définit si les statistiques collectées peuvent être réinitialisées ou mises à jour par une application utilisant les méthodes UpdateStatistics et ResetStatistics . Cette propriété n’est valide que si CapStatisticsReporting a la valeur true. Si CapStatisticsReporting a la valeur false, la propriété CapUpdateStatistics est toujours false.

  • ResetStatistics ne peut être appelé que si CapStatisticsReporting et CapUpdateStatistics sont vrais. Cette méthode réinitialise une, plusieurs ou toutes les statistiques réinitialisables de l'appareil sur zéro. Il réinitialise les statistiques réinitialisables d'un appareil à zéro. Toutes les statistiques demandées doivent être réinitialisées pour que cette méthode se termine correctement. Sinon, une erreur est levée avec la méthode étendue ErrorCode. Cette méthode est toujours exécutée de manière synchrone.

  • UpdateStatistics définit une, certaines ou toutes les statistiques de l'appareil réinitialisables sur les valeurs spécifiées. Toutes les statistiques demandées doivent être correctement mises à jour pour que cette méthode se termine correctement. Si certains ne peuvent pas être mis à jour pour une raison quelconque, un événement ErrorCode est retourné. CapStatisticsReporting et CapUpdateStatistics doivent être définis sur true pour appeler cette méthode. La méthode UpdateStatistics est toujours exécutée de manière synchrone.

  • RetrieveStatistics récupère les statistiques demandées à partir d’un appareil. CapStatisticsReporting doit être vrai pour pouvoir utiliser cette méthode. Tous les appels à RetrieveStatistics retournent le code XML suivant au minimum.

    <?xml version='1.0'?>
    <UPOSStat version="1.10.0"
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
    xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
    xsi:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/
    UPOSStat.xsd">
        <Event>
            <Parameter>
                <Name>RequestedStatistic</Name>
                <Value>1234</Value>
            </Parameter>
        </Event>
        <Equipment>
        <UnifiedPOSVersion>1.10</UnifiedPOSVersion>
        <DeviceCategory UPOS="CashDrawer"/>
        <ManufacturerName>Cashdrawers R Us</ManufacturerName>
        <ModelName>CD-123</ModelName>
        <SerialNumber>12345</SerialNumber>
        <FirmwareRevision>1.0 Rev. B</FirmwareRevision>
        <Interface>RS232</Interface>
        <InstallationDate>2000-03-01</InstallationDate>
        </Equipment>
    </UPOSStat>
    

    Si l’application demande un nom statistique que l’appareil ne prend pas en charge, l’entrée <Parameter> est retournée avec un nom vide <Value>. Par exemple:

    <Parameter>
        <Name>RequestedStatistic</Name>
        <Value></Value>
    </Parameter>
    

    Toutes les statistiques collectées par l’appareil sont spécifiques au fabricant et non définies dans le schéma seront retournées dans une <ManufacturerSpecific> balise au lieu d’une <Parameter> balise. Par exemple:

    <ManufacturerSpecific>
        <Name>TheAnswer</Name>
        <Value>42</Value>
    </ManufacturerSpecific>
    

    Lorsqu’une application demande toutes les statistiques de l’appareil, l’appareil retourne une <Parameter> entrée pour chaque statistique définie dans la catégorie de l’appareil. La catégorie d’appareil est définie par la version du schéma XML spécifiée par l’attribut version dans la <UPOSStat> balise. Si l’appareil n’enregistre aucune statistique, la <Value> balise est vide.

POS pour .NET utilise des gestionnaires pour effectuer la lecture et l’écriture de statistiques d’une manière similaire à la façon dont les événements sont gérés. Lorsque l’un de ces gestionnaires de statistiques est créé, il est affecté à une statistique d’appareil particulière. Lorsque cette statistique est lue ou mise à jour, le gestionnaire appelle un délégué capable de lire ou d’écrire sur l’appareil si nécessaire.

Les gestionnaires de statistiques utilisent différents types de délégués pour effectuer différentes opérations de statistiques. GetStatistic les délégués sont utilisés pour récupérer des valeurs statistiques, tandis que SetStatistic les délégués attribuent des valeurs statistiques. Les délégués GetStatistics prennent le nom de la statistique à récupérer en tant que paramètre et retournent une chaîne représentant la valeur de cette statistique. Les délégués SetStatistic prennent le nom de la statistique à modifier et la valeur à affecter à cette statistique en tant que paramètres. Les délégués SetStatistic ne retournent aucune valeur.

Les gestionnaires de statistiques peuvent être affectés à l’une des statistiques standard définies par la spécification Unified Point Of Service (UnifiedPOS), mais des gestionnaires personnalisés pour toutes les statistiques créées à l’aide de CreateStatistic by Service Object code sont également pris en charge.

Example

L’exemple de code suivant montre comment activer, gérer et récupérer des données de statistiques à partir d’un appareil MSR.

// File FORM1.CS
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

using Microsoft.PointOfService;
using Microsoft.PointOfService.BaseServiceObjects;

namespace Statistics
{
    public partial class SampleStatistics : Form
    {
        // Indicates whether or not the Service Object has
        // been started.
        bool ServiceObjectStarted = false;

        // The Service Object.
        PosCommon so = null;

        public SampleStatistics()
        {
            InitializeComponent();

            // Disable the buttons until the SO is loaded successfully.
            UpdateControls();
        }

        public void UpdateControls()
        {
            btnGenerateStatistics.Enabled = ServiceObjectStarted;
            btnRetrieveStatistics.Enabled = ServiceObjectStarted ;
            txtStatisticName.Enabled = ServiceObjectStarted;

            // The statistic name text box is disabled until the
            // Service Object is loaded.
            if (ServiceObjectStarted)
            {
                btnStartSO.Text = "Close SO";
            }
            else
            {
                txtStatisticName.Clear();
                txtRetrievedStatistics.Clear();
                btnStartSO.Text = "Start SO";
            }

            // The retrieve one statistic button is disabled until
            // the user has entered a statistic name.
            if (txtStatisticName.TextLength > 0)
            {
                btnRetrieveStatistic.Enabled = true;
            }
            else
            {
                btnRetrieveStatistic.Enabled = false;
            }
        }

        private void StartServiceObject(object sender, EventArgs e)
        {
            PosExplorer explorer = new PosExplorer(this);
            string SOName = "SampleStatistics";

            if (ServiceObjectStarted)
            {
                so.DeviceEnabled = false;
                so.Close();
                so = null;
                ServiceObjectStarted = false;
                UpdateControls();
            }
            else
            {
                foreach (DeviceInfo d in explorer.GetDevices())
                {
                    if (d.ServiceObjectName == SOName)
                    {
                        try
                        {
                            // Standard Service Object startup.
                            so = explorer.CreateInstance(d)
                                            as PosCommon;

                            so.Open();
                            so.Claim(0);
                            so.DeviceEnabled = true;

                            // Application-specific setup.
                            ServiceObjectStarted = true;
                            UpdateControls();
                        }
                        catch
                        {
                            // Something went wrong starting the SO
                            MessageBox.Show("The Service Object '" +
                                SOName + "' failed to load",
                                "Service Object Error",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                            return;
                        }

                        break;
                    }
                }

                if (so == null)
                {
                    // No Service Object with the
                    // specified name could be found.
                    MessageBox.Show("The Service Object '" +
                        SOName + "' could not be found",
                        "Service Object Error",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation);
                }
            }
        }

        private void GenerateStatistics(object sender, EventArgs e)
        {
            // In this example case, you use this
            // property to tell the Service Object to change statistic
            // values.
            so.DeviceEnabled = true;

            // Report status.
            txtRetrievedStatistics.Text = "DeviceEnabled called to" +
                        " to modify statistic values.";
        }

        private void RetrieveStatistics(object sender, EventArgs e)
        {
            string statistics;
            bool IsXml = true;

            try
            {
                statistics = so.RetrieveStatistics();
            }
            catch
            {
                statistics = "No statistics found";
                IsXml = false;
            }

            DisplayStatistics(statistics, IsXml);
        }

        private void RetrieveOneStatistic(object sender, EventArgs e)
        {
            string statistics;
            bool IsXml = true;

            try
            {
                statistics = so.RetrieveStatistic(
                            txtStatisticName.Text);
            }
            catch
            {
                statistics = "Statistic not found: " +
                            txtStatisticName.Text;

                IsXml = false;
            }

            DisplayStatistics(statistics, IsXml);
            txtStatisticName.Clear();
            btnRetrieveStatistic.Enabled = false;
        }

        private void StatisticSizeChanged(object sender, EventArgs e)
        {
            if (txtStatisticName.TextLength > 0)
            {
                btnRetrieveStatistic.Enabled = true;
            }
            else
            {
                btnRetrieveStatistic.Enabled = false;
            }
        }

        // When retrieving statistics, POS for .NET returns a block
        // of XML (as specified in the UPOS specification). This
        // method will make it look readable with white space
        // and indenting and then display it in the text box.
        private void DisplayStatistics(string inputString, bool isXml)
        {
            string s = null;

            // In case of an exception, you do not have an XML
            // string, so just display the error description. Otherwise,
            // load the XML string into an XmlDocument object and
            // make it look readable.
            if (!isXml)
            {
                s = inputString;
            }
            if(isXml)
            {
                // Create new XML document and load the statistics
                // XML string.
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(inputString);

                // Create a XmlTextWriter using a MemoryStream and
                // tell it to indent the XML output (so that it is
                // readable.)
                MemoryStream m = new MemoryStream();
                XmlTextWriter writer = new XmlTextWriter(m, null);
                writer.Formatting = Formatting.Indented;
                writer.Indentation = 4;

                // Save the document to the memory stream using the
                // XmlWriter.
                doc.Save(writer);

                // The stream will be encoded as UTF8, so convert the
                // buffer into a string.
                UTF8Encoding u = new UTF8Encoding();
                s = u.GetString(m.GetBuffer());
            }

            // Write the string to the text box.
            txtRetrievedStatistics.Text = s;
        }
    }
}
// File FORM1.DESIGNER.CS
namespace Statistics
{
    partial class SampleStatistics
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnStartSO = new System.Windows.Forms.Button();
            this.btnGenerateStatistics = new System.Windows.Forms.Button();
            this.btnRetrieveStatistics = new System.Windows.Forms.Button();
            this.txtStatisticName = new System.Windows.Forms.TextBox();
            this.txtRetrievedStatistics = new System.Windows.Forms.TextBox();
            this.btnRetrieveStatistic = new System.Windows.Forms.Button();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            //
            // btnStartSO
            //
            this.btnStartSO.Location = new System.Drawing.Point(45, 35);
            this.btnStartSO.Name = "btnStartSO";
            this.btnStartSO.Size = new System.Drawing.Size(133, 23);
            this.btnStartSO.TabIndex = 0;
            this.btnStartSO.Text = "Start SO";
            this.btnStartSO.UseVisualStyleBackColor = true;
            this.btnStartSO.Click += new System.EventHandler(this.StartServiceObject);
            //
            // btnGenerateStatistics
            //
            this.btnGenerateStatistics.Location = new System.Drawing.Point(45, 75);
            this.btnGenerateStatistics.Name = "btnGenerateStatistics";
            this.btnGenerateStatistics.Size = new System.Drawing.Size(133, 23);
            this.btnGenerateStatistics.TabIndex = 1;
            this.btnGenerateStatistics.Text = "GenerateStatistics";
            this.btnGenerateStatistics.UseVisualStyleBackColor = true;
            this.btnGenerateStatistics.Click += new System.EventHandler(this.GenerateStatistics);
            //
            // btnRetrieveStatistics
            //
            this.btnRetrieveStatistics.Location = new System.Drawing.Point(45, 117);
            this.btnRetrieveStatistics.Name = "btnRetrieveStatistics";
            this.btnRetrieveStatistics.Size = new System.Drawing.Size(133, 23);
            this.btnRetrieveStatistics.TabIndex = 2;
            this.btnRetrieveStatistics.Text = "Retrieve Statistics";
            this.btnRetrieveStatistics.UseVisualStyleBackColor = true;
            this.btnRetrieveStatistics.Click += new System.EventHandler(this.RetrieveStatistics);
            //
            // txtStatisticName
            //
            this.txtStatisticName.Location = new System.Drawing.Point(16, 68);
            this.txtStatisticName.Name = "txtStatisticName";
            this.txtStatisticName.Size = new System.Drawing.Size(205, 20);
            this.txtStatisticName.TabIndex = 4;
            this.txtStatisticName.TextChanged += new System.EventHandler(this.StatisticSizeChanged);
            //
            // txtRetrievedStatistics
            //
            this.txtRetrievedStatistics.BackColor = System.Drawing.Color.White;
            this.txtRetrievedStatistics.Location = new System.Drawing.Point(45, 157);
            this.txtRetrievedStatistics.Multiline = true;
            this.txtRetrievedStatistics.Name = "txtRetrievedStatistics";
            this.txtRetrievedStatistics.ReadOnly = true;
            this.txtRetrievedStatistics.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.txtRetrievedStatistics.Size = new System.Drawing.Size(476, 247);
            this.txtRetrievedStatistics.TabIndex = 5;
            //
            // btnRetrieveStatistic
            //
            this.btnRetrieveStatistic.Location = new System.Drawing.Point(16, 30);
            this.btnRetrieveStatistic.Name = "btnRetrieveStatistic";
            this.btnRetrieveStatistic.Size = new System.Drawing.Size(133, 23);
            this.btnRetrieveStatistic.TabIndex = 6;
            this.btnRetrieveStatistic.Text = "Retrieve Statistic";
            this.btnRetrieveStatistic.UseVisualStyleBackColor = true;
            this.btnRetrieveStatistic.Click += new System.EventHandler(this.RetrieveOneStatistic);
            //
            // groupBox1
            //
            this.groupBox1.Controls.Add(this.btnRetrieveStatistic);
            this.groupBox1.Controls.Add(this.txtStatisticName);
            this.groupBox1.Location = new System.Drawing.Point(219, 35);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(302, 105);
            this.groupBox1.TabIndex = 7;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "Single Statistic";
            //
            // SampleStatistics
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackColor = System.Drawing.SystemColors.MenuBar;
            this.ClientSize = new System.Drawing.Size(565, 439);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.txtRetrievedStatistics);
            this.Controls.Add(this.btnRetrieveStatistics);
            this.Controls.Add(this.btnGenerateStatistics);
            this.Controls.Add(this.btnStartSO);
            this.Name = "SampleStatistics";
            this.Text = "Form1";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button btnStartSO;
        private System.Windows.Forms.Button btnGenerateStatistics;
        private System.Windows.Forms.Button btnRetrieveStatistics;
        private System.Windows.Forms.TextBox txtStatisticName;
        private System.Windows.Forms.TextBox txtRetrievedStatistics;
        private System.Windows.Forms.Button btnRetrieveStatistic;
        private System.Windows.Forms.GroupBox groupBox1;
    }
}
// File STATISTICSSO.CS
using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.PointOfService;
using Microsoft.PointOfService.BaseServiceObjects;

[assembly: PosAssembly("Service Object Contractors, Inc.")]

namespace SOSamples.Statistics
{
    [ServiceObject(DeviceType.Msr,
        "SampleStatistics",
        "Sample Statistics Service Object",
        1,
        9)]

    public class StatisticsTest : MsrBase
    {
        // This will be incremented every time DeviceEnabled
        // is set so that different sets of demonstration
        // statistics can be generated.
        int enableCount = 0;

        // The name of a custom created statistic used to demonstrate
        // custom Statistic handlers.
        private const string PollingStatistic = "Polling Interval";

        // Statistic used to demonstrate IncrementStatistic.
        private const string TestIncrement = "MyIncrementableStat";

        // String returned from CheckHealth
        private string MyHealthText;

        public StatisticsTest()
        {
            DevicePath = "Sample Statistics";
        }

        // This is the delegate which will be called for each
        // statistic that we have associated with this delegate by
        // calling SetStatisticHandler().
        //
        // Delegates like this should most commonly be used
        // to get and set statistics in hardware. The delegate
        // allows the POS for .NET statistic subsystem to query
        // the value of a statistic in real time, before it is
        // returned to the application.
        private string GetHardwareInfo(string name)
        {
            // Add your code to query values from hardware here.

            // Very simple demonstration: just return the name
            // of the statistic as its value;
            return name;
        }

        // In a typical Service Object implementation, statistics
        // will be modified throughout the Service Object code. This
        // method demonstrates the methods used to modify statistic
        // values.
        public void SetDemonstrationStatistics()
        {
            // IncrementStatistic can be used to easily
            // increment a numeric statistic.
            IncrementStatistic(TestIncrement);

            switch(enableCount)
            {
                case 0:
                    SetStatisticValue(StatisticManufacturerName,
                        "Microsoft Corporation");
                    break;
                case 1:
                    SetStatisticValue(StatisticManufacturerName,
                        "Service Control Contractors, Inc.");
                    break;
                case 2:
                    SetStatisticValue(StatisticManufacturerName,
                        "Point of Service Controls .com");
                    break;
            }

            if (++enableCount == 3 )
            {
                enableCount = 0;
            }
        }

        #region PosCommon overrides
        // Returns the result of the last call to CheckHealth()

        public override void Open()
        {
            base.Open();

            // In your implementation of Open(), your Service Object
            // code should:
            //    1. Initialize statistics.
            //    2. Create custom statistics.
            //    3. Set statistic handlers for hardware Statistics.

            // 1. Initialize statistics
            SetStatisticValue(StatisticManufacturerName,
                            "Microsoft Corporation");
            SetStatisticValue(StatisticManufactureDate,
                            "2004-10-23");
            SetStatisticValue(StatisticModelName,
                            "Statistic Sample");
            SetStatisticValue(StatisticMechanicalRevision,
                            "1.0");
            SetStatisticValue(StatisticInterface,
                            "USB");

            // 2a. Create a new statistic to test Increment
            // method. No custom handler needed.
            CreateStatistic(TestIncrement, false, "blobs");

            // 2b. Create a new manufacturer statistic to demonstrate
            // custom attributes with StatisticHandlers.
            CreateStatistic(PollingStatistic, false,
                            "milliseconds");

            // 3. Set handlers for statistics stored in hardware.
            SetStatisticHandlers(PollingStatistic,
                        new GetStatistic(GetHardwareInfo), null);
            SetStatisticHandlers(StatisticSerialNumber,
                        new GetStatistic(GetHardwareInfo), null);
        }

        public override bool DeviceEnabled
        {
            get
            {
                return base.DeviceEnabled;
            }
            set
            {
                // This method will set various statistics to
                // demonstrate the statistic APIs. We are going
                // to change statistic values every time the device
                // is enabled. This operation is just for
                // demonstration and would not be found in live code.
                SetDemonstrationStatistics();

                base.DeviceEnabled = value;
            }
        }

        public override string CheckHealthText
        {
            get
            {
                // MsrBasic.VerifyState(musBeClaimed,
                // mustBeEnabled). This may throw an exception
                VerifyState(false, false);

                return MyHealthText;
            }
        }

        public override string CheckHealth(
                        HealthCheckLevel level)
        {
            // Verify that device is open, claimed, and enabled.
            VerifyState(true, true);

            // Your code here:
            // check the health of the device and return a
            // descriptive string.

            // Cache result in the CheckHealthText property.
            MyHealthText = "Ok";
            return MyHealthText;
        }

        public override DirectIOData DirectIO(
                        int command,
                        int data,
                        object obj)
        {
            // Verify that the device is open.
            VerifyState(false, false);

            return new DirectIOData(data, obj);
        }
        #endregion  PosCommon overrides

        #region MsrBasic Overrides
        protected override MsrFieldData ParseMsrFieldData(
                        byte[] track1Data,
                        byte[] track2Data,
                        byte[] track3Data,
                        byte[] track4Data,
                        CardType cardType)
        {
            // Your code here:
            // Implement this method to parse track data
            // into fields which will be returned as
            // properties to the application (e.g.,FirstName,
            // AccountNumber, etc.)
            return new MsrFieldData();
        }

        protected override MsrTrackData ParseMsrTrackData(
                        byte[] track1Data,
                        byte[] track2Data,
                        byte[] track3Data,
                        byte[] track4Data,
                        CardType cardType)
        {
            // Your code here:
            // Implement this method to convert raw track data.
            return new MsrTrackData();
        }
        #endregion MsrBasic Overrides
    }
}

Compilation du code

Voir aussi

Autres ressources