예제 #1
0
        public List <ObjectDefinition> GetObjectDefinitions(int organisationID)
        {
            List <ObjectDefinition>   result       = new List <ObjectDefinition>();
            ObjectDefinitionLookups   lookups      = GetLookups();
            Dictionary <Guid, object> alreadyAdded = new Dictionary <Guid, object>();

            foreach (ObjectDefinition item in lookups.DefaultObjectDefinitions)
            {
                ObjectDefinition objectDefinition = lookups.GetObjectDefinition(organisationID, item.ObjectID);
                result.Add(objectDefinition);
                alreadyAdded.Add(objectDefinition.ObjectDefinitionID, null);
            }
            List <ObjectDefinition> objectDefinitions = lookups.GetObjectDefinitions(organisationID);

            if (objectDefinitions != null)
            {
                foreach (ObjectDefinition item in objectDefinitions)
                {
                    if (!alreadyAdded.ContainsKey(item.ObjectDefinitionID))
                    {
                        result.Add(item);
                    }
                }
            }
            result.Sort(SortObjectDefinition);
            return(result);
        }
예제 #2
0
 public void SaveObjectDefinitions(List <ObjectDefinition> objectDefinitions, TObjectState state)
 {
     if (state == TObjectState.Add)
     {
         ObjectDefinitionLookups lookups = GetLookups();
         foreach (ObjectDefinition item in objectDefinitions)
         {
             int organisationID = 0;
             if (item.OrganisationID.HasValue)
             {
                 organisationID = item.OrganisationID.Value;
             }
             ObjectDefinition existingObjectDefinition = lookups.GetObjectDefinition(organisationID, item.ObjectID);
             if (existingObjectDefinition != null)
             {
                 int existingOrganisationID = 0;
                 if (existingObjectDefinition.OrganisationID.HasValue)
                 {
                     existingOrganisationID = existingObjectDefinition.OrganisationID.Value;
                 }
                 if (organisationID == existingOrganisationID)
                 {
                     throw new ConflictException();
                 }
             }
         }
     }
     DataAccessFactory.ObjectDefinitions.SaveObjectDefinitions(objectDefinitions, state);
 }
예제 #3
0
        public ObjectDefinition GetObjectDefinition(int organisationID, Guid objectDefinitionID)
        {
            ObjectDefinition        result           = null;
            ObjectDefinitionLookups lookups          = GetLookups();
            ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);

            if (objectDefinition != null && (!objectDefinition.OrganisationID.HasValue || (objectDefinition.OrganisationID.Value == organisationID)))
            {
                result = objectDefinition;
            }
            return(result);
        }
예제 #4
0
        public ObjectDefinitionLookups GetLookups()
        {
            ObjectDefinitionLookups result = _CachedLookups;

            if (result == null)
            {
                result = new ObjectDefinitionLookups();
                IMongoDatabase database = GetDatabase(DATABASE_NAME, false);
                LoadObjectDefinition(database, result);
                _CachedLookups = result;
            }
            return(result);
        }
예제 #5
0
        public bool ExecuteResource(Guid clientID, Guid objectDefinitionID, string instanceID, Guid propertyDefinitionID)
        {
            bool result = false;

            try
            {
                LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);
                if (client != null)
                {
                    ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
                    ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);
                    if (objectDefinition != null)
                    {
                        int objectID;
                        if (int.TryParse(objectDefinition.ObjectID, out objectID))
                        {
                            Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                            if (objectType != null)
                            {
                                PropertyDefinition propertyDefinition = objectDefinition.GetProperty(propertyDefinitionID);
                                if (propertyDefinition != null)
                                {
                                    Request  request  = client.NewPostRequest(objectType, instanceID, propertyDefinition.PropertyID, -1, null);
                                    Response response = client.SendRequest(request).WaitForResponse(LWM2MClient.REQUEST_TIMEOUT);
                                    if (response == null)
                                    {
                                        throw new TimeoutException();
                                    }
                                    else
                                    {
                                        if (response.StatusCode == StatusCode.Changed)
                                        {
                                            result = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
            }
            return(result);
        }
예제 #6
0
        public Property GetObjectProperty(Guid clientID, Guid objectDefinitionID, string instanceID, Guid propertyDefinitionID)
        {
            Property result = null;

            try
            {
                LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);
                if (client != null)
                {
                    ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
                    ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);
                    if (objectDefinition != null)
                    {
                        int objectID;
                        if (int.TryParse(objectDefinition.ObjectID, out objectID))
                        {
                            Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                            if (objectType != null)
                            {
                                PropertyDefinition propertyDefinition = objectDefinition.GetProperty(propertyDefinitionID);
                                if (propertyDefinition != null)
                                {
                                    Request  request  = client.NewGetRequest(objectType, instanceID, propertyDefinition.PropertyID);
                                    Response response = client.SendRequest(request).WaitForResponse(LWM2MClient.REQUEST_TIMEOUT);
                                    if (response != null && response.StatusCode == StatusCode.Content)
                                    {
                                        BusinessLogicFactory.Clients.UpdateClientActivity(client);
                                        result = ParseProperty(objectDefinition, propertyDefinition, request.Accept, response);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
            }
            return(result);
        }
예제 #7
0
 public void CancelObserveObjectProperty(Guid clientID, Guid objectDefinitionID, string instanceID, Guid propertyDefinitionID, bool useReset)
 {
     try
     {
         LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);
         if (client != null)
         {
             ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
             ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);
             if (objectDefinition != null)
             {
                 int objectID;
                 if (int.TryParse(objectDefinition.ObjectID, out objectID))
                 {
                     Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                     if (objectType != null)
                     {
                         if (propertyDefinitionID != Guid.Empty)
                         {
                             PropertyDefinition propertyDefinition = objectDefinition.GetProperty(propertyDefinitionID);
                             if (propertyDefinition != null)
                             {
                                 client.CancelObserve(objectType, instanceID, propertyDefinition.PropertyID, useReset);
                             }
                         }
                         else
                         {
                             client.CancelObserve(objectType, instanceID, null, useReset);
                         }
                     }
                 }
             }
         }
     }
     catch (Exception ex)
     {
         ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
     }
 }
예제 #8
0
        private void LoadObjectDefinition(IMongoDatabase database, ObjectDefinitionLookups lookups)
        {
            IMongoCollection <BsonDocument> collection  = database.GetCollection <BsonDocument>("ObjectDefinition");
            IAsyncCursor <BsonDocument>     mongoCursor = collection.FindSync(new BsonDocument());

            while (mongoCursor.MoveNext())
            {
                foreach (BsonDocument item in mongoCursor.Current)
                {
                    ObjectDefinition objectDefinition = new ObjectDefinition();
                    objectDefinition.ObjectDefinitionID = BsonHelper.GetGuid(item, "_id");
                    objectDefinition.ObjectID           = BsonHelper.GetString(item, "ObjectID");
                    objectDefinition.OrganisationID     = BsonHelper.GetInteger(item, "OrganisationID");
                    if (objectDefinition.OrganisationID.HasValue && (objectDefinition.OrganisationID.Value == 0))
                    {
                        objectDefinition.OrganisationID = null;
                    }
                    objectDefinition.Name              = BsonHelper.GetString(item, "Name");
                    objectDefinition.MIMEType          = BsonHelper.GetString(item, "MIMEType");
                    objectDefinition.Description       = BsonHelper.GetString(item, "Description");
                    objectDefinition.SerialisationName = BsonHelper.GetString(item, "SerialisationName");
                    objectDefinition.Singleton         = BsonHelper.GetBoolean(item, "Singleton");
                    if (item.Contains("Properties"))
                    {
                        BsonArray array = item["Properties"].AsBsonArray;
                        foreach (BsonValue arrayItem in array)
                        {
                            BsonDocument propertyItem = arrayItem.AsBsonDocument;
                            if (propertyItem != null)
                            {
                                if (objectDefinition.Properties == null)
                                {
                                    objectDefinition.Properties = new List <PropertyDefinition>();
                                }
                                PropertyDefinition property = new PropertyDefinition();
                                property.PropertyDefinitionID = BsonHelper.GetGuid(propertyItem, "_id");
                                property.PropertyID           = BsonHelper.GetString(propertyItem, "PropertyID");
                                property.Name        = BsonHelper.GetString(propertyItem, "Name");
                                property.Description = BsonHelper.GetString(propertyItem, "Description");
                                property.DataType    = (TPropertyDataType)propertyItem["DataType"].AsInt32;
                                if (propertyItem.Contains("DataTypeLength"))
                                {
                                    property.DataTypeLength = propertyItem["DataTypeLength"].AsInt32;
                                }
                                property.MIMEType     = BsonHelper.GetString(propertyItem, "MIMEType");
                                property.MinValue     = BsonHelper.GetString(propertyItem, "MinValue");
                                property.MaxValue     = BsonHelper.GetString(propertyItem, "MaxValue");
                                property.Units        = BsonHelper.GetString(propertyItem, "Units");
                                property.IsCollection = BsonHelper.GetBoolean(propertyItem, "IsCollection");
                                property.IsMandatory  = BsonHelper.GetBoolean(propertyItem, "IsMandatory");
                                property.Access       = (TAccessRight)propertyItem["Access"].AsInt32;
                                if (propertyItem.Contains("SortOrder"))
                                {
                                    property.SortOrder = propertyItem["SortOrder"].AsInt32;
                                }
                                property.SerialisationName = BsonHelper.GetString(propertyItem, "SerialisationName");
                                property.CollectionItemSerialisationName = BsonHelper.GetString(propertyItem, "CollectionItemSerialisationName");
                                objectDefinition.Properties.Add(property);
                            }
                        }
                    }
                    lookups.AddObjectDefinition(objectDefinition);
                }
            }
        }
예제 #9
0
 private void OnNotification(object sender, NotificationEventArgs e)
 {
     _CachedLookups = null;
 }
예제 #10
0
        public bool SetNotificationParameters(Guid clientID, Guid objectDefinitionID, string instanceID, Guid propertyDefinitionID, NotificationParameters notificationParameters)
        {
            bool result = false;

            try
            {
                LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);
                if (client != null)
                {
                    ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
                    ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);
                    if (objectDefinition != null)
                    {
                        int objectID;
                        if (int.TryParse(objectDefinition.ObjectID, out objectID))
                        {
                            Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                            if (objectType != null)
                            {
                                PropertyDefinition propertyDefinition = objectDefinition.GetProperty(propertyDefinitionID);
                                if (propertyDefinition != null)
                                {
                                    Request request = client.NewPutRequest(objectType, instanceID, propertyDefinition.PropertyID, -1, null);
                                    if (notificationParameters.MinimumPeriod.HasValue)
                                    {
                                        request.AddUriQuery(string.Concat("pmin=", notificationParameters.MinimumPeriod.Value.ToString()));
                                    }
                                    if (notificationParameters.MaximumPeriod.HasValue)
                                    {
                                        request.AddUriQuery(string.Concat("pmax=", notificationParameters.MaximumPeriod.Value.ToString()));
                                    }
                                    if (notificationParameters.GreaterThan.HasValue)
                                    {
                                        request.AddUriQuery(string.Concat("gt=", notificationParameters.GreaterThan.Value.ToString("0.0")));
                                    }
                                    if (notificationParameters.LessThan.HasValue)
                                    {
                                        request.AddUriQuery(string.Concat("lt=", notificationParameters.LessThan.Value.ToString("0.0")));
                                    }
                                    if (notificationParameters.Step.HasValue)
                                    {
                                        request.AddUriQuery(string.Concat("stp=", notificationParameters.Step.Value.ToString("0.0")));
                                    }
                                    Response response = client.SendRequest(request).WaitForResponse(LWM2MClient.REQUEST_TIMEOUT);
                                    if (response == null)
                                    {
                                        throw new TimeoutException();
                                    }
                                    else
                                    {
                                        if (response.StatusCode == StatusCode.Changed)
                                        {
                                            result = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ApplicationEventLog.WriteEntry("Flow", ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
            }
            return(result);
        }
예제 #11
0
        public void SaveObjectProperty(Guid clientID, Guid objectDefinitionID, string instanceID, Property property, TObjectState state)
        {
            LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);

            if (client == null)
            {
                ApplicationEventLog.Write(LogLevel.Warning, string.Concat("SaveObject - Client not found ", clientID.ToString()));
                throw new NoLongerAvailableException("Device not connected");
            }
            else
            {
                ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
                ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(objectDefinitionID);
                if (objectDefinition != null)
                {
                    int objectID;
                    if (int.TryParse(objectDefinition.ObjectID, out objectID))
                    {
                        Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                        if (objectType != null)
                        {
                            PropertyDefinition propertyDefinition = objectDefinition.GetProperty(property.PropertyDefinitionID);
                            if (propertyDefinition != null)
                            {
                                byte[] payload     = null;
                                int    contentType = TlvConstant.CONTENT_TYPE_TLV;
                                if (state != TObjectState.Delete)
                                {
                                    if ((property.Value != null) || (property.Values != null))
                                    {
                                        if ((property.Value != null) && (LWM2MClient.DataFormat == MediaType.TextPlain))
                                        {
                                            contentType = LWM2MClient.DataFormat;
                                            //contentType = TlvConstant.CONTENT_TYPE_PLAIN;
                                            string text = SerialiseProperty(propertyDefinition, property);
                                            if (text != null)
                                            {
                                                payload = Encoding.UTF8.GetBytes(text);
                                            }
                                        }
                                        else
                                        {
                                            Model.Object lwm2mObject = new Model.Object();
                                            lwm2mObject.Properties.Add(property);
                                            payload = SerialiseObject(objectDefinition, lwm2mObject);
                                        }
                                    }
                                }
                                Request request = null;
                                switch (state)
                                {
                                case TObjectState.NotChanged:
                                    break;

                                case TObjectState.Add:
                                    request = client.NewPostRequest(objectType, instanceID, propertyDefinition.PropertyID, contentType, payload);
                                    break;

                                case TObjectState.Update:
                                    request = client.NewPutRequest(objectType, instanceID, propertyDefinition.PropertyID, contentType, payload);
                                    break;

                                case TObjectState.Delete:
                                    request = client.NewDeleteRequest(objectType, instanceID, propertyDefinition.PropertyID);
                                    break;

                                default:
                                    break;
                                }
                                Response response = client.SendRequest(request).WaitForResponse(LWM2MClient.REQUEST_TIMEOUT);
                                if (response == null)
                                {
                                    throw new TimeoutException();
                                }
                                else
                                {
                                    BusinessLogicFactory.Clients.UpdateClientActivity(client);
                                    if (response.StatusCode != StatusCode.Changed)
                                    {
                                        throw new BadRequestException();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #12
0
        public string SaveObject(Guid clientID, Model.Object item, TObjectState state)
        {
            string      result = null;
            LWM2MClient client = BusinessLogicFactory.Clients.GetClient(clientID);

            if (client == null)
            {
                ApplicationEventLog.Write(LogLevel.Warning, string.Concat("SaveObject - Client not found ", clientID.ToString()));
                throw new NoLongerAvailableException("Device not connected");
            }
            else
            {
                ObjectDefinitionLookups lookups          = BusinessLogicFactory.Clients.GetLookups();
                ObjectDefinition        objectDefinition = lookups.GetObjectDefinition(item.ObjectDefinitionID);
                if (objectDefinition == null)
                {
                    ApplicationEventLog.Write(LogLevel.Warning, string.Concat("SaveObject - Metadata not found ", item.ObjectDefinitionID.ToString(), " client ", client.Address.ToString()));
                }
                else
                {
                    int objectID;
                    if (int.TryParse(objectDefinition.ObjectID, out objectID))
                    {
                        Model.ObjectType objectType = client.SupportedTypes.GetObjectType(objectID);
                        if (objectType != null)
                        {
                            Request request = null;
                            switch (state)
                            {
                            case TObjectState.NotChanged:
                                break;

                            case TObjectState.Add:
                                ushort instanceID;
                                if (ushort.TryParse(item.InstanceID, out instanceID))
                                {
                                    request = client.NewPostRequest(objectType, null, null, TlvConstant.CONTENT_TYPE_TLV, SerialiseObject(objectDefinition, item, instanceID));
                                }
                                else
                                {
                                    request = client.NewPostRequest(objectType, null, null, TlvConstant.CONTENT_TYPE_TLV, SerialiseObject(objectDefinition, item));
                                }
                                break;

                            case TObjectState.Update:
                                request = client.NewPostRequest(objectType, item.InstanceID, null, TlvConstant.CONTENT_TYPE_TLV, SerialiseObject(objectDefinition, item));
                                break;

                            case TObjectState.Delete:
                                request = client.NewDeleteRequest(objectType, item.InstanceID, null);
                                break;

                            default:
                                break;
                            }
                            ApplicationEventLog.Write(LogLevel.Information, string.Concat("SaveObject - Send request ", string.Concat(objectType.Path, "/", item.InstanceID), " client ", client.Address.ToString()));

                            Response response = client.SendRequest(request).WaitForResponse(LWM2MClient.REQUEST_TIMEOUT);
                            if (response == null)
                            {
                                throw new TimeoutException();
                            }
                            else
                            {
                                BusinessLogicFactory.Clients.UpdateClientActivity(client);
                                if (response.StatusCode == StatusCode.Created)
                                {
                                    if (!string.IsNullOrEmpty(response.LocationPath) && (response.LocationPath.StartsWith(request.UriPath)))
                                    {
                                        int startIndex = request.UriPath.Length + 1;
                                        if (startIndex < response.LocationPath.Length)
                                        {
                                            result = response.LocationPath.Substring(startIndex);
                                        }
                                    }
                                }
                                else if (response.StatusCode == StatusCode.Changed)
                                {
                                }
                                else if ((response.StatusCode == StatusCode.NotFound) && (state == TObjectState.Delete))
                                {
                                }
                                else
                                {
                                    throw new BadRequestException();
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }