public AgilorResponseData GetTargetValueByTargetName(string targetNames)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }
            try
            {
                var body = agilorACI.QuerySnapshots(targetNames.Split(';'));
                for (int i = 0; i < body.Count; i++)
                {
                    if (body[i].Type == Agilor.Interface.Val.Value.Types.STRING)
                    {
                        body[i].Val = ((string)body[i].Val).Remove(((string)body[i].Val).IndexOf("\0"));
                    }
                }
                response.responseBody    = body;
                response.responseMessage = "Get Target Values By Target Names Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }
            return(response);
        }
        public AgilorResponseData watch(dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            // 关闭清理线程
            SubscribeManager.StopSubscribeClearThread();
            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }
            try
            {
                List <string> targetsName = obj.targetsName.ToObject <List <string> >();
                int           timeout     = obj.timeout.ToObject <int>();
                response.responseBody    = SubscribeManager.addSubscribe(targetsName, timeout);
                response.responseMessage = "Watch Success! Targets Count:" + targetsName.Count.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }
            // 开启订阅清理线程
            SubscribeManager.StartUpSubscribeClearThread();
            return(response);
        }
        public AgilorResponseData removeTargets(int id)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                agilorACI.removeTarget(id);
                response.responseMessage = "Remove Targets Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData GetAllTargetsIDAndNameByDeviceName(string deviceName)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                var result = agilorACI.getTargetsByDevice(deviceName);
                response.responseBody    = result;
                response.responseMessage = "Get All Targets By Device Name Success! Targets Count:" + result.Count.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData GetTargetHistoryByTargetName(string targetName)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                response.responseBody    = agilorACI.QueryTagHistory(targetName, DateTime.Now.AddMonths(-1), DateTime.Now);
                response.responseMessage = "Get Target History Information By Target Name Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData SetTargetValue(string targetName, dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                response.responseMessage = "Set Target Value Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;

                object val = null;
                try
                {
                    switch (agilorACI.GetTarget(targetName).Type)
                    {
                    case Agilor.Interface.Val.Value.Types.BOOL:
                        val = obj.targetValue.ToObject <bool>();
                        break;

                    case Agilor.Interface.Val.Value.Types.FLOAT:
                        val = obj.targetValue.ToObject <float>();
                        break;

                    case Agilor.Interface.Val.Value.Types.LONG:
                        val = obj.targetValue.ToObject <int>();
                        break;

                    case Agilor.Interface.Val.Value.Types.STRING:
                        val = obj.targetValue.ToObject <string>();
                        break;
                    }
                }
                catch (Exception ex)
                {
                    response.responseMessage = ex.ToString();
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_TARGET_VALUE_ERROR;
                    return(response);
                }

                agilorACI.SetValue(new Agilor.Interface.Val.Value(targetName, val));
                response.responseBody = agilorACI.QuerySnapshots(targetName);
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData addTargets(dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                bool isOverride = true;
                try
                {
                    isOverride = obj.isOverride.ToObject <bool>();
                }
                catch { }

                Target[] targets = null;
                try
                {
                    targets = obj.targets.ToObject <Target[]>();
                }
                catch
                {
                    response.responseMessage = "Miss targets!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }

                foreach (var target in targets)
                {
                    agilorACI.addTarget(target, isOverride);
                }

                response.responseBody = new Dictionary <string, object>
                {
                    { "NewTargetsCount", targets.Length },
                    { "isOverride", isOverride }
                };
                response.responseMessage = "Add New Targets Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData Get()
        {
            AgilorResponseData response = new AgilorResponseData();

            response.responseMessage = "Hello, Agilor!";
            response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            response.responseBody    = new string[]
            {
                "devices",
            };

            return(response);
        }
        public AgilorResponseData Get()
        {
            AgilorResponseData response = new AgilorResponseData();

            response.responseMessage = "Hello, I'm " + ACI_SERVER_NAME + ":" + ACI_SERVER_IP;
            response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            response.responseBody    = new string[]
            {
                "devices",
                "targets",
                "watch",
                "poll"
            };
            return(response);
        }
        public AgilorResponseData GetTargetHistoryByTargetName(string targetName, string start = null, string end = null, int step = 0)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }
            try
            {
                DateTime start_t, end_t;
                if (!DateTime.TryParse(end, out end_t))
                {
                    end_t = DateTime.Now;
                }
                if (!DateTime.TryParse(start, out start_t))
                {
                    int minutes = 1;
                    int.TryParse(ConfigurationManager.AppSettings["AgilorQueryHistoryDefaultIntervalMinute"], out minutes);
                    start_t = end_t.AddMinutes(-1 * minutes);
                }
                if (end_t >= start_t)
                {
                    var body = agilorACI.QueryTagHistory(targetName, start_t, end_t, step);
                    if (body.Count > 0 && body[0].Type == Agilor.Interface.Val.Value.Types.STRING)
                    {
                        for (int i = 0; i < body.Count; i++)
                        {
                            body[i].Val = ((string)body[i].Val).Remove(((string)body[i].Val).IndexOf("\0"));
                        }
                    }
                    body.Reverse();
                    response.responseBody = body;
                }
                response.responseMessage = "Get Target History Information By Target Name Success! start: " + start_t.ToString() + ", end: " + end_t.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }
            return(response);
        }
        public AgilorResponseData poll(dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }

            try
            {
                string subscriberGuid = obj.guid.ToObject <string>();
                if (DateTime.Now.Subtract(SubscribeManager.subscribers[subscriberGuid].lastPollTime).Duration().TotalSeconds > SubscribeManager.subscribers[subscriberGuid].timeout)
                {
                    // 订阅过期
                    response.responseMessage = "Sorry, Your Subscribe Is Timeout!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_SUBSCRIBE_TIMEOUT_ERROR;
                    return(response);
                }

                bool isRefresh = obj.isRefresh.ToObject <bool>();
                //response.responseBody = SubscribeManager.getSubscribeTargetsValue(subscriberGuid, isRefresh);
                var result = SubscribeManager.getSubscribeTargetsValue(subscriberGuid, isRefresh);
                response.responseBody = new Dictionary <string, object>
                {
                    { "SubscribeTargetValues", result },
                    { "Timeout", SubscribeManager.subscribers[subscriberGuid].timeout }
                };

                response.responseMessage = "Get Subscribe Targets Value Success! Targets Count:" + result.Count.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }

            return(response);
        }
        public AgilorResponseData addOneTarget(dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }
            try
            {
                Target target = null;
                try
                {
                    target = new Target(obj.Type.ToObject <Agilor.Interface.Val.Value.Types>());
                }
                catch
                {
                    response.responseMessage = "Miss Target Type!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }
                try
                {
                    target.Name = obj.Name.ToObject <string>();
                }
                catch
                {
                    response.responseMessage = "Miss Target Name!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }
                try
                {
                    target.SourceName = obj.SourceName.ToObject <string>();
                }
                catch
                {
                    response.responseMessage = "Miss Target SourceName!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }
                try
                {
                    target.Device = obj.Device.ToObject <string>();
                }
                catch
                {
                    response.responseMessage = "Miss Target Device!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }
                try
                {
                    target.Scan = obj.Scan.ToObject <Target.Status>();
                }
                catch
                {
                    response.responseMessage = "Miss Target Scan!";
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_MISS_TARGET_PROPERTY_ERROR;
                    return(response);
                }
                // 可选
                bool isOverride = true;
                target.LastTime    = DateTime.Now;
                target.DateCreated = DateTime.Now;
                try
                {
                    target.Descriptor = obj.Descriptor.ToObject <string>();
                }
                catch { }
                try
                {
                    target.SourceGroup = obj.SourceGroup.ToObject <string>();
                }
                catch { }
                try
                {
                    target.Id = obj.Id.ToObject <int>();
                }
                catch { }
                try
                {
                    target.Archiving = obj.Archiving.ToObject <bool>();
                }
                catch { }
                try
                {
                    target.Compressing = obj.Compressing.ToObject <bool>();
                }
                catch { }
                try
                {
                    target.HihiLimit = obj.HihiLimit.ToObject <float>();
                }
                catch { }
                try
                {
                    target.HiLimit = obj.HiLimit.ToObject <float>();
                }
                catch { }
                try
                {
                    target.LoLimit = obj.LoLimit.ToObject <float>();
                }
                catch { }
                try
                {
                    target.LoloLimit = obj.LoloLimit.ToObject <float>();
                }
                catch { }
                try
                {
                    isOverride = obj.isOverride.ToObject <bool>();
                }
                catch { }
                agilorACI.addTarget(target, isOverride);
                response.responseBody    = target;
                response.responseMessage = "Add New Target Success! 'isOverride' IS " + isOverride.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }
            return(response);
        }
        public AgilorResponseData SetTargetValue(string targetName, dynamic obj)
        {
            AgilorResponseData response = new AgilorResponseData();

            if (!checkACIObject())
            {
                response.responseMessage = "Get All Device Names And Status ERROR: ACI IS NULL, Server Need Be Restart!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_AGILOR_ACI_IS_NULL;
                return(response);
            }
            try
            {
                response.responseMessage = "Set Target Value Success!";
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_NORMAL;
                object val = null;
                try
                {
                    switch (agilorACI.GetTarget(targetName).Type)
                    {
                    case Agilor.Interface.Val.Value.Types.BOOL:
                        val = obj.targetValue.ToObject <bool>();
                        break;

                    case Agilor.Interface.Val.Value.Types.FLOAT:
                        val = obj.targetValue.ToObject <float>();
                        break;

                    case Agilor.Interface.Val.Value.Types.LONG:
                        val = obj.targetValue.ToObject <int>();
                        break;

                    case Agilor.Interface.Val.Value.Types.STRING:
                        val = obj.targetValue.ToObject <string>();
                        break;
                    }
                }
                catch (Exception ex)
                {
                    response.responseMessage = ex.ToString();
                    response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_TARGET_VALUE_ERROR;
                    return(response);
                }

                Agilor.Interface.Val.Value setVal = new Agilor.Interface.Val.Value(targetName, val);
                if (agilorSlaveACIs.Count > 0)
                {
                    // 向 slave 发起二次请求
                    string[]    slaveIps    = ConfigurationManager.AppSettings["AgilorServerSlaveIp"].Split(';');
                    HttpContent httpContent = new StringContent("{\"targetValue\": \"" + val.ToString() + "\"}");
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    HttpClient httpClient = new HttpClient();
                    foreach (string slaveIp in slaveIps)
                    {
                        httpClient.PostAsync("http://" + slaveIp + ":8098/Agilor/targets/" + targetName + "/set", httpContent);
                    }
                }
                else
                {
                    Thread thread = new Thread(() => ThreadMainWithParameters(agilorACI, setVal));
                    thread.Start();
                }
                //Thread thread = new Thread(() => ThreadMainWithParameters(agilorACI, setVal));
                //thread.Start();
                //foreach (ACI slaveAci in agilorSlaveACIs)
                //{
                //    thread = new Thread(() => ThreadMainWithParameters(slaveAci, setVal));
                //    thread.Start();
                //}

                /*
                 * agilorACI.SetValue(new Agilor.Interface.Val.Value(targetName, val));
                 * foreach (ACI slaveAci in agilorSlaveACIs)
                 * {
                 *  try { slaveAci.SetValue(new Agilor.Interface.Val.Value(targetName, val)); } catch { }
                 * }
                 */
                response.responseBody = GetTargetValueByTargetName(targetName).responseBody;
            }
            catch (Exception ex)
            {
                response.responseMessage = ex.ToString();
                response.responseCode    = (int)AgilorResponseData.RESPONSE_CODE.RESPONSE_UNKNOWN_ERROR;
            }
            return(response);
        }