コード例 #1
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
 internal bool Remove(SensorDataServerRequest Request)
 {
     lock (this.requests)
     {
         return(this.requests.Remove(Request.Key));
     }
 }
コード例 #2
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void PerformReadout(SensorDataServerRequest Request)
        {
            Request.Started = true;

            SensorDataReadoutEventHandler h = this.OnExecuteReadoutRequest;

            if (h == null)
            {
                this.client.SendMessage(MessageType.Normal, Request.RemoteJID, "<done xmlns='" + SensorClient.NamespaceSensorData + "' id='" +
                                        XML.Encode(Request.Id) + "'/>", string.Empty, string.Empty, string.Empty, string.Empty, string.Empty);

                lock (this.requests)
                {
                    this.requests.Remove(Request.Key);
                }
            }
            else
            {
                try
                {
                    h(this, Request);
                }
                catch (Exception ex)
                {
                    Request.ReportErrors(true, new ThingError(string.Empty, string.Empty, string.Empty, DateTime.Now, ex.Message));
                }
            }
        }
コード例 #3
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void StartReadout(object P)
        {
            SensorDataServerRequest Request = (SensorDataServerRequest)P;

            this.client.SendMessage(MessageType.Normal, Request.RemoteJID, "<started xmlns='" + SensorClient.NamespaceSensorData + "' id='" +
                                    XML.Encode(Request.Id) + "'/>", string.Empty, string.Empty, string.Empty, string.Empty, string.Empty);

            this.PerformReadout(Request);
        }
コード例 #4
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void TriggerSubscription(Subscription Subscription)
        {
            string Key = Subscription.From + " " + Subscription.Id;

            SensorDataServerRequest Request = new SensorDataServerRequest(Subscription.Id, this, Subscription.From,
                                                                          Subscription.From, Subscription.NodeReferences, Subscription.FieldTypes, Subscription.FieldNames,
                                                                          DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue, Subscription.ServiceToken, Subscription.DeviceToken,
                                                                          Subscription.UserToken);
            bool NewRequest;

            lock (this.requests)
            {
                if (NewRequest = !this.requests.ContainsKey(Key))
                {
                    this.requests[Key] = Request;
                }
            }

            this.PerformReadout(Request);
            this.UpdateSubscriptionTimers(Subscription.LastTrigger, Subscription);
        }
コード例 #5
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void AcceptRequest(SensorDataServerRequest Request, IqEventArgs e, string Id)
        {
            string Key = e.From + " " + Id;
            bool   NewRequest;

            lock (this.requests)
            {
                if (NewRequest = !this.requests.ContainsKey(Key))
                {
                    this.requests[Key] = Request;
                }
            }

            if (Request.When > DateTime.Now)
            {
                e.IqResult("<accepted xmlns='" + SensorClient.NamespaceSensorData + "' id='" + XML.Encode(Id) + "' queued='true'/>");
                Request.When = this.scheduler.Add(Request.When, this.StartReadout, Request);
            }
            else
            {
                e.IqResult("<accepted xmlns='" + SensorClient.NamespaceSensorData + "' id='" + XML.Encode(Id) + "'/>");
                this.PerformReadout(Request);
            }
        }
コード例 #6
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void PerformSubscription(bool Req, IqEventArgs e, string Id, Dictionary <string, FieldSubscriptionRule> FieldNames,
                                         ThingReference[] Nodes, FieldType FieldTypes, string ServiceToken, string DeviceToken, string UserToken,
                                         Duration MaxAge, Duration MinInterval, Duration MaxInterval)
        {
            DateTime     Now = DateTime.Now;
            Subscription Subscription;

            if (Req)
            {
                string   Key = e.From + " " + Id;
                string[] Fields2;

                if (FieldNames == null)
                {
                    Fields2 = null;
                }
                else
                {
                    Fields2 = new string[FieldNames.Count];
                    FieldNames.Keys.CopyTo(Fields2, 0);
                }

                SensorDataServerRequest Request = new SensorDataServerRequest(Id, this, e.From, e.From,
                                                                              Nodes, FieldTypes, Fields2, DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue,
                                                                              ServiceToken, DeviceToken, UserToken);
                bool NewRequest;

                lock (this.requests)
                {
                    if (NewRequest = !this.requests.ContainsKey(Key))
                    {
                        this.requests[Key] = Request;
                    }
                }

                if (Request.When > Now)
                {
                    e.IqResult("<accepted xmlns='" + SensorClient.NamespaceSensorData + "' id='" + XML.Encode(Id) + "' queued='true'/>");
                    Request.When = this.scheduler.Add(Request.When, this.StartReadout, Request);
                }
                else
                {
                    e.IqResult("<accepted xmlns='" + SensorClient.NamespaceSensorData + "' id='" + XML.Encode(Id) + "'/>");
                    this.PerformReadout(Request);
                }
            }

            if (Nodes == null)
            {
                Nodes = new ThingReference[] { ThingReference.Empty }
            }
            ;

            lock (this.subscriptionsByThing)
            {
                Subscription = new Subscription(Id, e.From, Nodes, FieldNames, FieldTypes, MaxAge, MinInterval, MaxInterval,
                                                ServiceToken, DeviceToken, UserToken);

                foreach (ThingReference Thing in Nodes)
                {
                    if (!subscriptionsByThing.TryGetValue(Thing, out LinkedList <Subscription> Subscriptions))
                    {
                        Subscriptions = new LinkedList <Subscription>();
                        subscriptionsByThing[Thing] = Subscriptions;
                    }

                    LinkedListNode <Subscription> Next, Loop = Subscriptions.First;
                    while (Loop != null)
                    {
                        Next = Loop.Next;

                        if (Loop.Value.From == e.From)
                        {
                            if (Loop.Value.RemoveNode(Thing))
                            {
                                this.RemoveSubscriptionLocked(e.From, Loop.Value.Id, false);
                            }

                            Subscriptions.Remove(Loop);
                            break;
                        }

                        Loop = Next;
                    }

                    Subscriptions.AddLast(Subscription);
                }

                if (!subscriptionsByJID.TryGetValue(e.From, out Dictionary <string, Subscription> Subscriptions2))
                {
                    Subscriptions2             = new Dictionary <string, Subscription>();
                    subscriptionsByJID[e.From] = Subscriptions2;
                }

                Subscriptions2[Subscription.Id] = Subscription;
            }

            if (!Req)
            {
                e.IqResult("<accepted xmlns='" + SensorClient.NamespaceSensorData + "' id='" + XML.Encode(Id) + "'/>");
            }

            this.UpdateSubscriptionTimers(Now, Subscription);
        }
コード例 #7
0
ファイル: SensorServer.cs プロジェクト: wu-xian/IoTGateway
        private void ReqHandler(object Sender, IqEventArgs e)
        {
            List <ThingReference> Nodes      = null;
            List <string>         Fields     = null;
            XmlElement            E          = e.Query;
            FieldType             FieldTypes = (FieldType)0;
            DateTime From         = DateTime.MinValue;
            DateTime To           = DateTime.MaxValue;
            DateTime When         = DateTime.MinValue;
            string   ServiceToken = string.Empty;
            string   DeviceToken  = string.Empty;
            string   UserToken    = string.Empty;
            string   NodeId;
            string   SourceId;
            string   Partition;
            string   Id = string.Empty;
            bool     b;

            foreach (XmlAttribute Attr in E.Attributes)
            {
                switch (Attr.Name)
                {
                case "id":
                    Id = Attr.Value;
                    break;

                case "from":
                    if (!XML.TryParse(Attr.Value, out From))
                    {
                        From = DateTime.MinValue;
                    }
                    break;

                case "to":
                    if (!XML.TryParse(Attr.Value, out To))
                    {
                        To = DateTime.MaxValue;
                    }
                    break;

                case "when":
                    if (!XML.TryParse(Attr.Value, out When))
                    {
                        When = DateTime.MinValue;
                    }
                    break;

                case "st":
                    ServiceToken = Attr.Value;
                    break;

                case "dt":
                    DeviceToken = Attr.Value;
                    break;

                case "ut":
                    UserToken = Attr.Value;
                    break;

                case "all":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.All;
                    }
                    break;

                case "h":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Historical;
                    }
                    break;

                case "m":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Momentary;
                    }
                    break;

                case "p":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Peak;
                    }
                    break;

                case "s":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Status;
                    }
                    break;

                case "c":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Computed;
                    }
                    break;

                case "i":
                    if (CommonTypes.TryParse(Attr.Value, out b) && b)
                    {
                        FieldTypes |= FieldType.Identity;
                    }
                    break;
                }
            }

            foreach (XmlNode N in E.ChildNodes)
            {
                switch (N.LocalName)
                {
                case "nd":
                    if (Nodes == null)
                    {
                        Nodes = new List <ThingReference>();
                    }

                    E         = (XmlElement)N;
                    NodeId    = XML.Attribute(E, "id");
                    SourceId  = XML.Attribute(E, "src");
                    Partition = XML.Attribute(E, "pt");

                    Nodes.Add(new ThingReference(NodeId, SourceId, Partition));
                    break;

                case "f":
                    if (Fields == null)
                    {
                        Fields = new List <string>();
                    }

                    Fields.Add(XML.Attribute((XmlElement)N, "n"));
                    break;
                }
            }

            SensorDataServerRequest Request = new SensorDataServerRequest(Id, this, e.From, e.From, Nodes?.ToArray(), FieldTypes,
                                                                          Fields?.ToArray(), From, To, When, ServiceToken, DeviceToken, UserToken);

            if (this.provisioningClient != null)
            {
                this.provisioningClient.CanRead(e.FromBareJid, Request.Types, Request.Nodes, Request.FieldNames,
                                                Request.ServiceToken.Split(space, StringSplitOptions.RemoveEmptyEntries),
                                                Request.DeviceToken.Split(space, StringSplitOptions.RemoveEmptyEntries),
                                                Request.UserToken.Split(space, StringSplitOptions.RemoveEmptyEntries),
                                                (sender2, e2) =>
                {
                    if (e2.Ok && e2.CanRead)
                    {
                        Request.Nodes      = e2.Nodes;
                        Request.FieldNames = e2.FieldsNames;
                        Request.Types      = e2.FieldTypes;

                        this.AcceptRequest(Request, e, Id);
                    }
                    else
                    {
                        e.IqError("<error type='cancel'><forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>" +
                                  "<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' xml:lang='en'>Access denied.</text></error>");
                    }
                }, null);
            }
            else
            {
                this.AcceptRequest(Request, e, Id);
            }
        }