コード例 #1
0
        public ActionResult <GetNextTaskResponse> Post(GetNextTask request)
        {
            GetNextTaskResponse ret = new GetNextTaskResponse();

            lock (host)
            {
                GXSelectArgs arg = GXSelectArgs.Select <GXTask>(c => c.Id, q => q.Start == DateTime.MinValue);
                arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id);
                arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id);
                //Don't get meters that are mapped to other readers.
                arg.Joins.AddLeftJoin <GXDevice, GXDeviceToReader>(a => a.Id, b => b.DeviceId);
                if (request.DeviceId != 0)
                {
                    arg.Where.And <GXDevice>(q => q.Id == request.DeviceId);
                }
                if (!request.Listener)
                {
                    arg.Where.And <GXDevice>(q => q.Dynamic == false);
                }
                arg.OrderBy.Add <GXTask>(q => q.Id);
                GXSelectArgs onProgress = GXSelectArgs.Select <GXObject>(c => c.DeviceId, q => q.Removed == DateTime.MinValue);
                onProgress.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id);
                onProgress.Where.And <GXTask>(q => q.Start != DateTime.MinValue && q.End == DateTime.MinValue);
                arg.Where.And <GXObject>(q => !GXSql.Exists <GXObject, GXDevice>(a => a.DeviceId, b => b.Id, onProgress));
                GXTask task = host.Connection.SingleOrDefault <GXTask>(arg);
                if (task != null)
                {
                    //Get task device ID and creation time.
                    arg = GXSelectArgs.SelectAll <GXTask>(q => q.Id == task.Id);
                    arg.Columns.Add <GXObject>();
                    arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id);
                    arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id);
                    task = host.Connection.SingleOrDefault <GXTask>(arg);
                    //Get all tasks that are created at the same time for same meter.
                    arg = GXSelectArgs.SelectAll <GXTask>(q => q.Generation == task.Generation);
                    arg.Where.And <GXDevice>(q => q.Id == task.Object.DeviceId);
                    arg.Where.And <GXObject>(q => q.Removed == DateTime.MinValue);
                    arg.Columns.Add <GXObject>();
                    arg.Columns.Add <GXDevice>();
                    arg.Columns.Add <GXAttribute>();
                    arg.Joins.AddInnerJoin <GXTask, GXObject>(a => a.Object, b => b.Id);
                    arg.Joins.AddInnerJoin <GXObject, GXDevice>(a => a.DeviceId, b => b.Id);
                    arg.Joins.AddInnerJoin <GXObject, GXAttribute>(a => a.Id, b => b.ObjectId);
                    ret.Tasks = host.Connection.Select <GXTask>(arg).ToArray();
                    DateTime now = DateTime.Now;
                    foreach (GXTask it in ret.Tasks)
                    {
                        it.Start = now;
                        host.Connection.Update(GXUpdateArgs.Update(it, q => q.Start));
                    }
                    host.SetChange(TargetType.Tasks, DateTime.Now);
                }
            }
            return(ret);
        }
コード例 #2
0
 internal static void Read(ILogger _logger, System.Net.Http.HttpClient client, GXDLMSReader reader, GXTask task, IGXMedia net, GXDLMSObject obj)
 {
     AddValue v;
     System.Net.Http.HttpResponseMessage response;
     if (_logger != null)
     {
         _logger.LogInformation("Reading: " + obj.ToString());
     }
     Console.WriteLine("Reading: " + obj.ToString());
     object val;
     if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2 && GetReadTime(task.Object) != DateTime.MinValue && IsSortedByDateTime(task.Object))
     {
         //Read profile generic using range.
         DateTime now = DateTime.Now;
         now = now.AddSeconds(-now.Second);
         now = now.AddMinutes(-now.Minute);
         now = now.AddHours(1);
         val = reader.ReadRowsByRange((GXDLMSProfileGeneric)obj, task.Object.Attributes[GetBufferIndex(task.Object)].Read, now);
     }
     else
     {
         val = reader.Read(obj, task.Index);
     }
     if (val is Enum)
     {
         //Enum values are saved as interger.
         val = Convert.ToString(Convert.ToInt32(val));
     }
     else if (val is byte[])
     {
         DataType dt = (DataType)task.Object.Attributes[GetBufferIndex(task.Object)].UIDataType;
         if (dt == DataType.String)
         {
             val = ASCIIEncoding.ASCII.GetString((byte[])val);
         }
         else if (dt == DataType.StringUTF8)
         {
             val = ASCIIEncoding.UTF8.GetString((byte[])val);
         }
         else
         {
             val = GXCommon.ToHex((byte[])val);
         }
     }
     else if (val is GXDateTime)
     {
         val = ((GXDateTime)val).ToFormatString();
     }
     if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2)
     {
         //Make own value from each row.
         if (val != null)
         {
             UInt64 attributeId = task.Object.Attributes[GetBufferIndex(task.Object)].Id;
             List<GXValue> list = new List<GXValue>();
             DateTime latest = task.Object.Attributes[GetBufferIndex(task.Object)].Read;
             DateTime first = latest;
             Boolean read = false;
             int period = -1;
             foreach (GXStructure row in (GXArray)val)
             {
                 DateTime dt = DateTime.MinValue;
                 task.Data = GXDLMSTranslator.ValueToXml(row);
                 for (int pos = 0; pos != row.Count; ++pos)
                 {
                     if (row[pos] is byte[])
                     {
                         row[pos] = GXDLMSClient.ChangeType((byte[])row[pos], DataType.DateTime);
                         if (pos == 0)
                         {
                             dt = ((GXDateTime)row[pos]).Value.LocalDateTime;
                             //If we have already read this row.
                             if (dt <= first)
                             {
                                 read = true;
                                 break;
                             }
                             if (dt > latest)
                             {
                                 latest = dt;
                             }
                         }
                     }
                     //Some meters are returning null as date time to save bytes...
                     if (pos == 0 && row[pos] == null)
                     {
                         if (period == -1)
                         {
                             period = GetCapturePeriod(task.Object);
                             if (period == -1)
                             {
                                 throw new Exception("Invalid capture period.");
                             }
                         }
                         row[pos] = latest.AddMinutes(period);
                     }
                 }
                 if (_logger != null)
                 {
                     _logger.LogInformation("Read: " + task.Data);
                 }
                 if (!read)
                 {
                     list.Add(new GXValue()
                     {
                         Read = dt,
                         Value = task.Data,
                         AttributeId = attributeId
                     });
                 }
             }
             if (list.Count != 0)
             {
                 v = new AddValue() { Items = list.ToArray() };
                 response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result;
                 Helpers.CheckStatus(response);
                 ListDevicesResponse r = response.Content.ReadAsAsync<ListDevicesResponse>().Result;
             }
         }
     }
     else
     {
         if (!(val is string))
         {
             val = Convert.ToString(val);
         }
         task.Data = (string)val;
         if (_logger != null)
         {
             _logger.LogInformation("Read: " + (string)val);
         }
         int index = GetAttributeIndex(task.Object, task.Index);
         if (index != -1)
         {
             UInt64 attributeId = task.Object.Attributes[index].Id;
             v = new AddValue()
             {
                 Items = new GXValue[] {new GXValue(){
                     AttributeId = attributeId,
                     Read = DateTime.Now,
                     Value = (string)val}
                 }
             };
             response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result;
             Helpers.CheckStatus(response);
             AddValueResponse r = response.Content.ReadAsAsync<AddValueResponse>().Result;
         }
         else
         {
             if (_logger != null)
             {
                 _logger.LogInformation("Invalid task index: " + task.Index);
             }
         }
     }
 }
コード例 #3
0
 private async void DoWork(object state)
 {
     _logger.LogWarning("Timed Background Service is working.");
     try
     {
         DateTime now = DateTime.Now;
         ListSchedulesResponse list = null;
         using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/schedule/ListSchedules", new ListSchedules()))
         {
             Helpers.CheckStatus(response);
             list = await response.Content.ReadAsAsync <ListSchedulesResponse>();
         }
         List <GXTask> tasks = new List <GXTask>();
         foreach (GXSchedule it in list.Schedules)
         {
             GXDateTime dt = new GXDateTime(it.Start);
             if (it.ExecutionTime == DateTime.MinValue)
             {
                 it.ExecutionTime = now;
             }
             if (Equals(dt, now))
             {
                 _logger.LogTrace("+");
                 foreach (GXObject obj in it.Objects)
                 {
                     foreach (GXAttribute a in obj.Attributes)
                     {
                         GXTask t = new GXTask()
                         {
                             Object   = obj,
                             TaskType = TaskType.Read,
                             Index    = a.Index
                         };
                         tasks.Add(t);
                     }
                 }
                 it.ExecutionTime = now;
                 UpdateScheduleExecutionTime us = new UpdateScheduleExecutionTime();
                 us.Id   = it.Id;
                 us.Time = now;
                 using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/schedule/UpdateScheduleExecutionTime", us))
                 {
                     Helpers.CheckStatus(response);
                     UpdateScheduleExecutionTime r = await response.Content.ReadAsAsync <UpdateScheduleExecutionTime>();
                 }
             }
             else if (now.Minute == 0)
             {
                 Console.WriteLine(dt.ToFormatString());
                 Console.WriteLine(now.ToString());
             }
         }
         if (tasks.Count != 0)
         {
             AddTask at = new AddTask();
             at.Actions = tasks.ToArray();
             using (System.Net.Http.HttpResponseMessage response = await Helpers.client.PostAsJsonAsync(Startup.ServerAddress + "/api/task/AddTask", at))
             {
                 Helpers.CheckStatus(response);
             }
         }
     }
     catch (Exception ex)
     {
         _logger.LogInformation(ex.Message);
     }
 }