public Item(DeviceMonitorData deviceMonitorData)
        {
            DeviceId        = deviceMonitorData.DeviceId;
            Name            = deviceMonitorData.Name;
            Uuid            = deviceMonitorData.Uuid;
            AgentInstanceId = deviceMonitorData.AgentInstanceId;
            Address         = deviceMonitorData.Address;
            Port            = deviceMonitorData.Port;
            Timestamp       = deviceMonitorData.Timestamp;

            Available      = deviceMonitorData.Available;
            Connected      = deviceMonitorData.Connected;
            EStop          = deviceMonitorData.EStop;
            ControllerMode = deviceMonitorData.ControllerMode;
            SystemStatus   = deviceMonitorData.SystemStatus;
            SystemMessage  = deviceMonitorData.SystemMessage;
            Execution      = deviceMonitorData.Execution;
            Program        = deviceMonitorData.Program;

            SpindleRotaryVelocity = deviceMonitorData.SpindleRotaryVelocity;
            SpindleLoad           = deviceMonitorData.SpindleLoad;
            PathFeedrate          = deviceMonitorData.PathFeedrate;

            XPos             = deviceMonitorData.XPos;
            YPos             = deviceMonitorData.YPos;
            ZPos             = deviceMonitorData.ZPos;
            AAngle           = deviceMonitorData.AAngle;
            BAngle           = deviceMonitorData.BAngle;
            CAngle           = deviceMonitorData.CAngle;
            XAxisFeedrate    = deviceMonitorData.XAxisFeedrate;
            YAxisFeedrate    = deviceMonitorData.YAxisFeedrate;
            ZAxisFeedrate    = deviceMonitorData.ZAxisFeedrate;
            ARotaryVelocity  = deviceMonitorData.ARotaryVelocity;
            BRotaryVelocity  = deviceMonitorData.BRotaryVelocity;
            CRotaryVelocity  = deviceMonitorData.CRotaryVelocity;
            XLoad            = deviceMonitorData.XLoad;
            YLoad            = deviceMonitorData.YLoad;
            ZLoad            = deviceMonitorData.ZLoad;
            ALoad            = deviceMonitorData.ALoad;
            BLoad            = deviceMonitorData.BLoad;
            CLoad            = deviceMonitorData.CLoad;
            Power            = deviceMonitorData.Power;
            ElectricalEnergy = deviceMonitorData.ElectricalEnergy;
            ChatterVibration = deviceMonitorData.ChatterVibration;
        }
 private void initDeviceMonitorData(DeviceMonitorData monitorData)
 {
     monitorData.DeviceId              = "";
     monitorData.Name                  = "";
     monitorData.Uuid                  = "";
     monitorData.AgentInstanceId       = 123;
     monitorData.Address               = "";
     monitorData.Port                  = 80;
     monitorData.Timestamp             = DateTime.Now;
     monitorData.Available             = false;
     monitorData.Connected             = false;
     monitorData.EStop                 = "";
     monitorData.ControllerMode        = "";
     monitorData.SystemStatus          = "";
     monitorData.SystemMessage         = "";
     monitorData.Execution             = "";
     monitorData.Program               = "";
     monitorData.SpindleRotaryVelocity = "";
     monitorData.SpindleLoad           = "";
     monitorData.PathFeedrate          = "";
     monitorData.XPos                  = "";
     monitorData.YPos                  = "";
     monitorData.ZPos                  = "";
     monitorData.AAngle                = "";
     monitorData.BAngle                = "";
     monitorData.CAngle                = "";
     monitorData.XAxisFeedrate         = "";
     monitorData.YAxisFeedrate         = "";
     monitorData.ZAxisFeedrate         = "";
     monitorData.ARotaryVelocity       = "";
     monitorData.BRotaryVelocity       = "";
     monitorData.CRotaryVelocity       = "";
     monitorData.XLoad                 = "";
     monitorData.YLoad                 = "";
     monitorData.ZLoad                 = "";
     monitorData.ALoad                 = "";
     monitorData.BLoad                 = "";
     monitorData.CLoad                 = "";
     monitorData.Power                 = "";
     monitorData.ElectricalEnergy      = "";
     monitorData.ChatterVibration      = "";
 }
        //请求的响应
        public bool GetResponse(Uri requestUri, Stream stream)
        {
            var query = new RequestQuery(requestUri);

            if (query.IsValid)
            {
                log.Info("Monitors Request Received : " + query.DeviceId);

                try
                {
                    var      sent = new List <Item>();
                    DateTime from = query.From;

                    //如果DeviceId不为空,则读取DevcieId的Connection连接
                    if (!string.IsNullOrEmpty(query.DeviceId))
                    {
                        var connection = Database.ReadConnection(query.DeviceId);
                        if (connection != null)
                        {
                            bool write    = true;
                            var  deviceId = connection.DeviceId;

                            //新建监控数据对象
                            DeviceMonitorData monitorData = new DeviceMonitorData();

                            initDeviceMonitorData(monitorData);

                            if (!string.IsNullOrEmpty(deviceId))
                            {
                                monitorData.DeviceId = deviceId;
                                monitorData.Address  = connection.Address;
                                monitorData.Port     = connection.Port;

                                //从数据库检索Agent代理信息
                                var agent = Database.ReadAgent(deviceId);
                                if (agent != null)
                                {
                                    monitorData.AgentInstanceId = agent.InstanceId;
                                    monitorData.Timestamp       = agent.Timestamp;
                                }

                                //检索Device信息,此处检索name和uuid
                                var device = Database.ReadDevice(deviceId, monitorData.AgentInstanceId);
                                if (device != null)
                                {
                                    monitorData.Name = device.Name;
                                    monitorData.Uuid = device.Uuid;
                                }

                                //数据库检索Status
                                var status = Database.ReadStatus(deviceId);
                                if (status != null)
                                {
                                    monitorData.Available = status.Available;
                                    monitorData.Connected = status.Connected;
                                    monitorData.Timestamp = status.Timestamp;
                                }

                                //如果机床Available可用并且Connected上代理进行数据的检索
                                if (monitorData.Available && monitorData.Connected)
                                {
                                    //数据库检索Sample
                                    var samples = Database.ReadSamples(query.DataItems, deviceId, from, query.To, query.At, query.Count);

                                    if (!samples.IsNullOrEmpty())
                                    {
                                        foreach (var sample in samples)
                                        {
                                            //根据约定的数据的id命名规则来判断数据项具体属于DeviceMonitorData的哪一个成员
                                            //急停
                                            if (sample.Id.Contains("_estop"))
                                            {
                                                monitorData.EStop = sample.CDATA;
                                            }


                                            //控制器模式
                                            if (sample.Id.Contains("_controller_mode"))
                                            {
                                                monitorData.ControllerMode = sample.CDATA;
                                            }


                                            //系统报警状态Fault、Warning等
                                            if (sample.Id.Contains("_system_status"))
                                            {
                                                monitorData.SystemStatus = sample.CDATA;
                                            }

                                            //系统报警具体信息
                                            if (sample.Id.Contains("_system_message"))
                                            {
                                                monitorData.SystemMessage = sample.CDATA;
                                            }

                                            //程序执行状态
                                            if (sample.Id.Contains("_execution"))
                                            {
                                                monitorData.Execution = sample.CDATA;
                                            }


                                            //程序名
                                            if (sample.Id.Contains("_program"))
                                            {
                                                monitorData.Execution = sample.CDATA;
                                            }


                                            //主轴转速
                                            if (sample.Id.Contains("_spindle_rotary_velocity"))
                                            {
                                                monitorData.SpindleRotaryVelocity = sample.CDATA;
                                            }


                                            //主轴负载
                                            if (sample.Id.Contains("_spindle_load"))
                                            {
                                                monitorData.SpindleLoad = sample.CDATA;
                                            }


                                            //进给速度
                                            if (sample.Id.Contains("_path_feedrate"))
                                            {
                                                monitorData.PathFeedrate = sample.CDATA;
                                            }


                                            //XYZABC进给轴位置
                                            if (sample.Id.Contains("_xpos"))
                                            {
                                                monitorData.XPos = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_ypos"))
                                            {
                                                monitorData.YPos = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_zpos"))
                                            {
                                                monitorData.ZPos = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_aangle"))
                                            {
                                                monitorData.AAngle = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_bangle"))
                                            {
                                                monitorData.BAngle = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_cangle"))
                                            {
                                                monitorData.CAngle = sample.CDATA;
                                            }


                                            //XYZABC进给轴速度
                                            if (sample.Id.Contains("_xvelocity"))
                                            {
                                                monitorData.XAxisFeedrate = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_yvelocity"))
                                            {
                                                monitorData.YAxisFeedrate = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_zvelocity"))
                                            {
                                                monitorData.ZAxisFeedrate = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_arotary_velocity"))
                                            {
                                                monitorData.ARotaryVelocity = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_brotary_velocity"))
                                            {
                                                monitorData.BRotaryVelocity = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_crotary_velocity"))
                                            {
                                                monitorData.CRotaryVelocity = sample.CDATA;
                                            }


                                            //XYZABC进给轴负载
                                            if (sample.Id.Contains("_xload"))
                                            {
                                                monitorData.XLoad = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_yload"))
                                            {
                                                monitorData.YLoad = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_zload"))
                                            {
                                                monitorData.ZLoad = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_aload"))
                                            {
                                                monitorData.ALoad = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_bload"))
                                            {
                                                monitorData.BLoad = sample.CDATA;
                                            }


                                            if (sample.Id.Contains("_cload"))
                                            {
                                                monitorData.CLoad = sample.CDATA;
                                            }


                                            //传感器功率、能耗
                                            if (sample.Id.Contains("_power"))
                                            {
                                                monitorData.Power = sample.CDATA;
                                            }

                                            if (sample.Id.Contains("_electrical_energy"))
                                            {
                                                monitorData.ElectricalEnergy = sample.CDATA;
                                            }


                                            //传感器监测的机床颤振信息
                                            if (sample.Id.Contains("_chatter_vibration"))
                                            {
                                                monitorData.ChatterVibration = sample.CDATA;
                                            }
                                        }
                                    }
                                }
                            }

                            var item = new Item(monitorData);
                            sent.Add(item);

                            if (write)
                            {
                                string json  = Json.Convert.ToJson(item, true);
                                var    bytes = Encoding.UTF8.GetBytes(json);
                                stream.Write(bytes, 0, bytes.Length);
                                stream.Flush();
                            }
                            else
                            {
                                stream.WriteByte(32);
                            }
                        }
                    }
                    else
                    {
                        var connections = Database.ReadConnections();
                        if (connections != null)
                        {
                            //根据连接的代理来获取数据
                            foreach (var connection in connections)
                            {
                                bool write    = true;
                                var  deviceId = connection.DeviceId;

                                //新建监控数据对象
                                DeviceMonitorData monitorData = new DeviceMonitorData();

                                initDeviceMonitorData(monitorData);

                                if (!string.IsNullOrEmpty(deviceId))
                                {
                                    monitorData.DeviceId = deviceId;
                                    monitorData.Address  = connection.Address;
                                    monitorData.Port     = connection.Port;

                                    //从数据库检索Agent代理信息
                                    var agent = Database.ReadAgent(deviceId);
                                    if (agent != null)
                                    {
                                        monitorData.AgentInstanceId = agent.InstanceId;
                                        monitorData.Timestamp       = agent.Timestamp;
                                    }

                                    //检索Device信息,此处检索name和uuid
                                    var device = Database.ReadDevice(deviceId, monitorData.AgentInstanceId);
                                    if (device != null)
                                    {
                                        monitorData.Name = device.Name;
                                        monitorData.Uuid = device.Uuid;
                                    }

                                    //数据库检索Status
                                    var status = Database.ReadStatus(deviceId);
                                    if (status != null)
                                    {
                                        monitorData.Available = status.Available;
                                        monitorData.Connected = status.Connected;
                                    }

                                    //如果机床Available可用并且Connected上代理进行数据的检索
                                    if (monitorData.Available && monitorData.Connected)
                                    {
                                        //数据库检索Sample
                                        var samples = Database.ReadSamples(query.DataItems, deviceId, from, query.To, query.At, query.Count);

                                        if (!samples.IsNullOrEmpty())
                                        {
                                            foreach (var sample in samples)
                                            {
                                                //根据约定的数据的id命名规则来判断数据项具体属于DeviceMonitorData的哪一个成员
                                                //急停
                                                if (sample.Id.Contains("_estop"))
                                                {
                                                    monitorData.EStop = sample.CDATA;
                                                }


                                                //控制器模式
                                                if (sample.Id.Contains("_controller_mode"))
                                                {
                                                    monitorData.ControllerMode = sample.CDATA;
                                                }


                                                //系统报警状态Fault、Warning等
                                                if (sample.Id.Contains("_system_status"))
                                                {
                                                    monitorData.SystemStatus = sample.CDATA;
                                                }

                                                //系统报警具体信息
                                                if (sample.Id.Contains("_system_message"))
                                                {
                                                    monitorData.SystemMessage = sample.CDATA;
                                                }

                                                //程序执行状态
                                                if (sample.Id.Contains("_execution"))
                                                {
                                                    monitorData.Execution = sample.CDATA;
                                                }


                                                //程序名
                                                if (sample.Id.Contains("_program"))
                                                {
                                                    monitorData.Execution = sample.CDATA;
                                                }


                                                //主轴转速
                                                if (sample.Id.Contains("_spindle_rotary_velocity"))
                                                {
                                                    monitorData.SpindleRotaryVelocity = sample.CDATA;
                                                }


                                                //主轴负载
                                                if (sample.Id.Contains("_spindle_load"))
                                                {
                                                    monitorData.SpindleLoad = sample.CDATA;
                                                }


                                                //进给速度
                                                if (sample.Id.Contains("_path_feedrate"))
                                                {
                                                    monitorData.PathFeedrate = sample.CDATA;
                                                }


                                                //XYZABC进给轴位置
                                                if (sample.Id.Contains("_xpos"))
                                                {
                                                    monitorData.XPos = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_ypos"))
                                                {
                                                    monitorData.YPos = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_zpos"))
                                                {
                                                    monitorData.ZPos = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_aangle"))
                                                {
                                                    monitorData.AAngle = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_bangle"))
                                                {
                                                    monitorData.BAngle = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_cangle"))
                                                {
                                                    monitorData.CAngle = sample.CDATA;
                                                }


                                                //XYZABC进给轴速度
                                                if (sample.Id.Contains("_xvelocity"))
                                                {
                                                    monitorData.XAxisFeedrate = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_yvelocity"))
                                                {
                                                    monitorData.YAxisFeedrate = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_zvelocity"))
                                                {
                                                    monitorData.ZAxisFeedrate = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_arotary_velocity"))
                                                {
                                                    monitorData.ARotaryVelocity = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_brotary_velocity"))
                                                {
                                                    monitorData.BRotaryVelocity = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_crotary_velocity"))
                                                {
                                                    monitorData.CRotaryVelocity = sample.CDATA;
                                                }


                                                //XYZABC进给轴负载
                                                if (sample.Id.Contains("_xload"))
                                                {
                                                    monitorData.XLoad = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_yload"))
                                                {
                                                    monitorData.YLoad = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_zload"))
                                                {
                                                    monitorData.ZLoad = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_aload"))
                                                {
                                                    monitorData.ALoad = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_bload"))
                                                {
                                                    monitorData.BLoad = sample.CDATA;
                                                }


                                                if (sample.Id.Contains("_cload"))
                                                {
                                                    monitorData.CLoad = sample.CDATA;
                                                }


                                                //传感器功率、能耗
                                                if (sample.Id.Contains("_power"))
                                                {
                                                    monitorData.Power = sample.CDATA;
                                                }

                                                if (sample.Id.Contains("_electrical_energy"))
                                                {
                                                    monitorData.ElectricalEnergy = sample.CDATA;
                                                }


                                                //传感器监测的机床颤振信息
                                                if (sample.Id.Contains("_chatter_vibration"))
                                                {
                                                    monitorData.ChatterVibration = sample.CDATA;
                                                }
                                            }
                                        }
                                    }
                                }

                                var item = new Item(monitorData);
                                sent.Add(item);

                                if (write)
                                {
                                    string json = Json.Convert.ToJson(item, true);
                                    json += "\r\n";
                                    var bytes = Encoding.UTF8.GetBytes(json);
                                    stream.Write(bytes, 0, bytes.Length);
                                    stream.Flush();
                                }
                                else
                                {
                                    stream.WriteByte(32);
                                }
                            }
                        }
                        if (from > DateTime.MinValue)
                        {
                            from = DateTime.UtcNow;
                        }

                        if (query.Interval <= 0)
                        {
                        }
                        else
                        {
                            Thread.Sleep(query.Interval);
                        }
                    }
                    return(true);
                }
                catch (Exception ex)
                {
                    log.Trace(ex);
                }
            }

            return(false);
        }