xm
2021-12-01 6d73bf6e816570291865674bef8bce8972e4de3f
HDL_ON/DAL/DriverLayer/Control.cs
@@ -26,7 +26,6 @@
    public class Control
    {
       
        static Control _control;
        public static Control Ins
        {
@@ -39,6 +38,11 @@
                return _control;
            }
        }
        /// <summary>
        /// 记录接收到的消息,方便zb的工程师调试他们的设备
        /// </summary>
        public List<string> MsgInfoList = new List<string>();
        int _msg_id = 1;
        /// <summary>
        /// 通讯ID
@@ -64,7 +68,19 @@
        /// 是否搜索本地网关成功
        /// </summary>
        public bool IsSearchLocalGatewaySuccessful = false;
        /// <summary>
        /// 是否本地加密,目前只对A网关有用
        /// </summary>
        public bool IsLocalEncrypt;
        /// <summary>
        /// 判断是否本地加密并且加密key不为空
        /// </summary>
        public bool IsLocalEncryptAndGetAesKey {
            get {
                return IsLocalEncrypt && (!string.IsNullOrEmpty(DB_ResidenceData.Instance.CurrentRegion.localSecret));
            }
        }
        bool _GatewayOnline_Local = false;
        /// <summary>
        /// 网关在线-局域网
@@ -268,6 +284,7 @@
                        else if (DB_ResidenceData.Instance.GatewayType == 1)
                        {
                            new Control_Udp().SearchLocalGateway();
                            new Control_Udp().SearchLocalGateway(true);
                        }
                        System.Threading.Thread.Sleep(500);
                    }
@@ -283,6 +300,30 @@
        /// </summary>
        public void ControlScene(Scene scene)
        {
            //体验模式
            if(MainPage.NoLoginMode)
            {
                foreach(var sceneFunction in scene.functions)
                {
                    var revString = "";
                    var upDataObj = new AlinkFunctionStatusObj();
                    upDataObj.id = "999";
                    upDataObj.objects = new List<AlinkStatusData>();
                    var asd = new AlinkStatusData() { deviceId = sceneFunction.localFunction.deviceId, sid = sceneFunction.sid };
                    var status1 = new List<AttributesStatus>();
                    foreach (var dic in sceneFunction.status)
                    {
                        status1.Add(new AttributesStatus() { key = dic.key, value = dic.value });
                    }
                    asd.status = status1;
                    upDataObj.objects.Add(asd);
                    revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                    UpdataFunctionStatus(revString, null, true);
                }
                return;
            }
            //远程或者控制link网关场景
            if (!Ins.GatewayOnline_Local || DB_ResidenceData.Instance.GatewayType == 1)
            {
                new System.Threading.Thread(() =>
@@ -299,6 +340,15 @@
                }
            }
        }
        /// <summary>
        /// 安防控制
        /// </summary>
        public void ControlArm()
        {
            DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest();
            //var pack = httpServer.GetSecurityAlarmLogList
        }
        /// <summary>
        /// 发送命令
@@ -309,7 +359,7 @@
        /// <param name="function"></param>
        /// <param name="useRemote">是否直接使用远程发送</param>
        /// <returns></returns>
        public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false)
        public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false,int resend = 3)
        {
            function.controlCounter++;
            function.refreshTime = DateTime.Now;
@@ -336,15 +386,39 @@
                }
            }
            ///dome控制
            if (MainPage.NoLoginMode)
            {
                var revString = "";
                var upDataObj = new AlinkFunctionStatusObj();
                upDataObj.id = "999";
                upDataObj.objects = new List<AlinkStatusData>();
                var asd = new AlinkStatusData() { deviceId = function.deviceId, sid = function.sid };
                var status1 = new List<AttributesStatus>();
                foreach (var dic in commandDictionary)
                {
                    status1.Add(new AttributesStatus() { key = dic.Key, value = dic.Value });
                }
                asd.status = status1;
                upDataObj.objects.Add(asd);
                revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                UpdataFunctionStatus(revString, null, true);
                return;
            }
            //MainPage.Log($"发送数据:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}");
            ///第三方涂鸦设备统一使用远程控制
            switch(function.spk)
            switch (function.spk)
            {
                case SPK.ElectricTuyaAirCleaner:
                case SPK.ElectricTuyaAirCleaner2:
                case SPK.ElectricTuyaFan:
                case SPK.ElectricTuyaFan2:
                case SPK.ElectricTuyaWaterValve:
                case SPK.ElectricTuyaWeepRobot:
                case SPK.ElectricTuyaWeepRobot2:
                    useRemote = true;
                    break;
            }
@@ -361,16 +435,6 @@
            }
            else
            {
                ////远程通讯
                //if (Ins.GatewayOnline_Local == false && Ins.GatewayOnline_Cloud == true)
                //{
                //    DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest();
                //    //ALink控制、Bus控制使用同一个接口控制,由云端负责解析
                //    var apiControlData = function.GetApiControlData(commandDictionary);
                //    var actionObjs = new List<ApiAlinkControlActionObj>();
                //    actionObjs.Add(apiControlData);
                //    var pack = httpServer.ControlDevice(actionObjs);
                //}
                //本地通讯
                if (Ins.GatewayOnline_Local)
                {
@@ -392,19 +456,39 @@
                        var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary);
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson);
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id);
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id,resend);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                    }
                }
                //远程通讯
                else
                {
                    //Bug修复:一端口远程控制调光设备的调光属性时,无法控制到0,反复横跳。
                    //因为On + 远程控制发送给云端使用的是link协议数据,杨涛中转给高胜处理时候逻辑上有冲突,导致无法单独控制亮度值,需要同时发送开关值与亮度值。
                    if (DB_ResidenceData.Instance.GatewayType == 0)
                    {
                        if (commandDictionary.Count == 1)
                        {
                            if (commandDictionary.ContainsKey(FunctionAttributeKey.Brightness))
                            {
                                commandDictionary.Add(FunctionAttributeKey.OnOff, commandDictionary[FunctionAttributeKey.Brightness] == "0" ? "off" : "on");
                            }
                        }
                        if(function.spk == SPK.LightCCT)
                        {
                            if (!commandDictionary.ContainsKey(FunctionAttributeKey.CCT))
                            {
                                commandDictionary.Add(FunctionAttributeKey.CCT, function.GetAttrState(FunctionAttributeKey.CCT));
                            }
                        }
                    }
                    DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest();
                    //ALink控制、Bus控制使用同一个接口控制,由云端负责解析
                    var apiControlData = function.GetApiControlData(commandDictionary);
                    var actionObjs = new List<ApiAlinkControlActionObj>();
                    actionObjs.Add(apiControlData);
                    var pack = httpServer.ControlDevice(actionObjs);
                    MainPage.Log($"远程控制反馈:{pack.message}");
                }
            }
@@ -414,29 +498,59 @@
        /// </summary>
        public void SwtichFunctions(bool open,List<Function> functions)
        {
            //dome模式控制
            if(MainPage.NoLoginMode)
            {
                new System.Threading.Thread(() =>
                {
                    foreach (var temp in functions)
                    {
                        Dictionary<string, string> d1 = new Dictionary<string, string>();
                        d1.Add(FunctionAttributeKey.OnOff, open ? "on" : "off");
                        SendWriteCommand(temp, d1);
                        System.Threading.Thread.Sleep(100);
                    }
                })
                { IsBackground = true }.Start();
                return;
            }
            var count = 0;
            var logString = open ? "打开\r\n" : "关闭\r\n";
            List<ApiAlinkControlActionObj> actionObjs = new List<ApiAlinkControlActionObj>();
            Dictionary<string, string> d = new Dictionary<string, string>();
            d.Add(FunctionAttributeKey.OnOff, open ? "on" : "off");
            var pm = new DAL.Server.HttpServerRequest();
            foreach (var temp in functions)
            //一端口全开全关需要延时发送
            if (DB_ResidenceData.Instance.GatewayType == 0)
            {
                logString += temp.spk + ":" + temp.sid + "\r\n";
                var apiControlData = temp.GetApiControlData(d);
                actionObjs.Add(apiControlData);
                count++;
                if (count > 9)
                new System.Threading.Thread(() =>
                {
                    var result = pm.ControlDevice(actionObjs);
                    actionObjs = new List<ApiAlinkControlActionObj>();
                    count = 0;
                    MainPage.Log(logString);
                    logString = "";
                }
                    foreach (var temp in functions)
                    {
                        var apiControlData = temp.GetApiControlData(d);
                        var result = pm.ControlDevice(new List<ApiAlinkControlActionObj>() { apiControlData });
                        System.Threading.Thread.Sleep(100);
                    }
                })
                { IsBackground = true }.Start();
            }
            var pack = pm.ControlDevice(actionObjs);
            MainPage.Log(logString);
            else
            {
                foreach (var temp in functions)
                {
                    var apiControlData = temp.GetApiControlData(d);
                    actionObjs.Add(apiControlData);
                    count++;
                    if (count > 9)
                    {
                        var result = pm.ControlDevice(actionObjs);
                        actionObjs = new List<ApiAlinkControlActionObj>();
                        count = 0;
                        System.Threading.Thread.Sleep(100);
                    }
                }
                var pack = pm.ControlDevice(actionObjs);
            }
        }
        public void SendApiReadCommand(List<string> functionIds)
@@ -477,47 +591,90 @@
        /// 发送读取命令
        /// 自动判断是否为A协议设备
        /// </summary>
        public void SendReadCommand(Function function)
        public void SendReadCommand(Function function ,bool forceRemote = false)
        {
            function.refreshTime = DateTime.Now;
            if (Ins.GatewayOnline_Local)
            if (forceRemote)
            {
                if (DB_ResidenceData.Instance.GatewayType == 0)
                var pm = new DAL.Server.HttpServerRequest();
                var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
            }
            else
            {
                if (Ins.GatewayOnline_Local)
                {
                    try
                    if (DB_ResidenceData.Instance.GatewayType == 0)
                    {
                        new Control_Udp().ReadBusData(function);
                        try
                        {
                            new Control_Udp().ReadBusData(function);
                        }
                        catch (Exception ex)
                        {
                            MainPage.Log($"发送数据异常: {ex.Message}");
                        }
                    }
                    catch (Exception ex)
                    else
                    {
                        MainPage.Log($"发送数据异常: {ex.Message}");
                        var readKey = new Dictionary<string, string>();
                        readKey.Add("sid", function.sid);
                        var readDataObj = new AlinkReadFunctionStatusObj()
                        {
                            id = Ins.msg_id.ToString(),
                            objects = new List<Dictionary<string, string>>()
                                        {
                                            readKey
                                        },
                            time_stamp = Utlis.GetTimestamp()
                        };
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
                    }
                }
                else
                {
                    var readKey = new Dictionary<string, string>();
                    readKey.Add("sid", function.sid);
                    var readDataObj = new AlinkReadFunctionStatusObj()
                    {
                        id = Ins.msg_id.ToString(),
                        objects = new List<Dictionary<string, string>>()
                        {
                            readKey
                        },
                        time_stamp = Utlis.GetTimestamp()
                    };
                    var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                    var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                    MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                    new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
                    var pm = new DAL.Server.HttpServerRequest();
                    var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
                }
            }
        }
        /// <summary>
        /// 安防控制
        /// </summary>
        public void ControlSecurity(SecurityAlarm securityAlarm,string state)
        {
            if (!Ins.GatewayOnline_Local)//网关本地不在线
            {
                var pm = new DAL.Server.HttpServerRequest();
                var result = pm.SetSecurityStatus(new List<SecurityState>() { new SecurityState() {
                 gatewayId = DB_ResidenceData.Instance.HomeGateway.gatewayId,
                  sid = securityAlarm.sid, status = state, userSecurityId = securityAlarm.userSecurityId
                } });
                MainPage.Log($"安防控制结果:{result.Code}");
            }
            else
            {
                var pm = new DAL.Server.HttpServerRequest();
                var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
                Dictionary<string, string> keys = new Dictionary<string, string>();
                keys.Add("sid", securityAlarm.sid);
                keys.Add("status", state);
                keys.Add("alarm", securityAlarm.alarm.ToString());
                var aLinkData = new AlinkReadFunctionStatusObj()
                {
                    id = Ins.msg_id.ToString(),
                    objects = new List<Dictionary<string, string>>()
                        {
                            keys
                        },
                    time_stamp = Utlis.GetTimestamp()
                };
                var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData);
                var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlSeurity, aLinkJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id);
            }
        }
@@ -547,21 +704,66 @@
                };
                var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData);
                var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlScene, aLinkJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id,0);
            }
        }
        /// <summary>
        /// 转换通讯数据
        /// 网关进入配网模式
        /// </summary>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString)
        public void AuthGateway()
        {
            string topicString = "Topic:" + topic + "\r\n";
            byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString);
            string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            var objects1 = new { spk = "", time = "180" };
            //{"objects":[{"spk":"","time":"180"}],"id":"8","time_stamp":"1635241216669"}
            var sendId = Ins.msg_id.ToString();
            var sendObj = new { objects = objects1, id = sendId, time_stamp = Utlis.GetTimestamp() };
            string sendDataString = topicString + lengthString + bodyDataString;
            byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString);
            MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(sendObj);
            var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.AuthGateway, aLinkJson);
            new Control_Udp().SendLocalHdlLinkData(sendBytes, Ins.msg_id.ToString());
        }
        /// <summary>
        /// 转换发送数据
        /// </summary>
        /// <param name="topic">主题</param>
        /// <param name="bodyDataString">body内容数据</param>
        /// <param name="isEncryption">是否要对body加密</param>
        /// <returns></returns>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString, bool isEncryption = true)
        {
            //string topicString = "Topic:" + topic + "\r\n";
            //byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString);
            //string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            //string sendDataString = topicString + lengthString + bodyDataString;
            //byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString);
            //MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            //***************************************************************
            //2021-09-23 增加本地通信加密处理
            //1.拼接头
            string topicString = "Topic:" + topic + "\r\n";
            //2.Body字符串转为byte数组
            byte[] bodyBytes = Encoding.UTF8.GetBytes(bodyDataString);
            //判断是否需加密Body数据
            if (isEncryption && IsLocalEncryptAndGetAesKey)
            {
                bodyBytes = Securitys.EncryptionService.AesEncryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                //bodyDataString = Encoding.UTF8.GetString(bodyBytes);
                //MainPage.Log($"转换HDL-Link数据 加密key:" + DB_ResidenceData.Instance.CurrentRegion.localSecret);
            }
            //3.拼接body的Length长度数据
            string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            string topicAndLengthString = topicString + lengthString;
            byte[] topicAndLengthBytes = Encoding.UTF8.GetBytes(topicAndLengthString);
            //4.拼接合并 Topic 和 body的byte数组数据
            byte[] sendDataBytes = new byte[topicAndLengthBytes.Length + bodyBytes.Length];
            topicAndLengthBytes.CopyTo(sendDataBytes, 0);
            bodyBytes.CopyTo(sendDataBytes, topicAndLengthBytes.Length);
            //var sendDataString = Encoding.UTF8.GetString(sendDataBytes);
            //MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            //***************************************************************
            return sendDataBytes;
        }
@@ -569,18 +771,22 @@
        /// 转换接收到的数据
        /// </summary>
        /// <returns></returns>
        public void ConvertReceiveData(byte[] receiveBytes)
        public void ConvertReceiveData(byte[] receiveBytes,string ip)
        {
            var reString = Encoding.UTF8.GetString(receiveBytes);
            AnalysisReceiveData(reString);
            AnalysisReceiveData(reString, receiveBytes,ip);
        }
        /// <summary>
        /// 转换接收到的数据
        /// </summary>
        /// <param name="receiveString">转String后的数据</param>
        /// <param name="originalReceiveBytes"原始Bytes数据</param>
        /// <returns></returns>
        public LocalCommunicationData AnalysisReceiveData(string receiveString)
        public LocalCommunicationData AnalysisReceiveData(string receiveString, byte[] originalReceiveBytes , string sIp = null)
        {
            LocalCommunicationData receiveObj = new LocalCommunicationData();
            MainPage.Log($"局域网信息: \r\n{receiveString}");
            var res = receiveString.Split("\r\n\r\n");
@@ -602,8 +808,7 @@
                    }
                }
                MainPage.Log($"局域网信息: {receiveObj.Topic}  : 内容: {res[1]}");
                //MainPage.Log($"局域网信息: {receiveObj.Topic}  : 内容: {res[1]}");
                //验证有效数据长度
                //if (res[1].Length != receiveObj.Length)
@@ -613,8 +818,47 @@
                //}
                receiveObj.BodyDataString = res[1];
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply)
                //2021-09-23 过滤不需要解密的主题 目前搜索网关主题不加密
                if (receiveObj.Topic != CommunicationTopic.SearchLoaclGatewayReply)
                {
                    //判断当前网关是否开启了本地加密
                    if (IsLocalEncryptAndGetAesKey)
                    {
                        MainPage.Log($"局域网信息 开始解密");
                        if (originalReceiveBytes != null)
                        {
                            //拿到原始Bytes数据去解密
                            byte[] topicBytes = Encoding.UTF8.GetBytes(res[0]);
                            byte[] bodyBytes = new byte[receiveObj.Length];
                            Array.Copy(originalReceiveBytes, topicBytes.Length + 4, bodyBytes, 0, receiveObj.Length);
                            byte[] receiveBytes = Securitys.EncryptionService.AesDecryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                            var revString = Encoding.UTF8.GetString(receiveBytes);
                            receiveObj.BodyDataString = revString;
                            MainPage.Log($"局域网信息: 解密后:" + receiveObj.BodyDataString);
                            if(receiveObj.Topic.EndsWith("/thing/property/up"))
                            {
                                MsgInfoList.Add(revString + "\r\n");
                            }
                        }
                        else
                        {
                            //目前不拿原始Bytes数据 解密不了
                            //byte[] receiveBytes = Encoding.UTF8.GetBytes(res[1]);
                            //MainPage.Log($"局域网信息 receiveBytes {receiveBytes.Length}");
                            //receiveBytes = Securitys.EncryptionService.AesDecryptPayload(receiveBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                            //MainPage.Log($"局域网信息 解密后:receiveBytes {receiveBytes.Length}");
                            //var revString = Encoding.UTF8.GetString(receiveBytes);
                            //receiveObj.BodyDataString = revString;
                            //MainPage.Log($"局域网信息: 解密后:" + receiveObj.BodyDataString);
                        }
                    }
                }
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast)
                {
                    var bodyJObj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    if (bodyJObj == null)
                    {
@@ -635,15 +879,54 @@
                        {
                            Ins.GatewayId = device.device_mac;
                        }
                        reportIp = "239.0.168.188";// device.ip_address;//主播地址也能控制设备
                        if (!string.IsNullOrEmpty(sIp))
                        {
                            device.ip_address = sIp;
                        }
                        reportIp = device.ip_address;//主播地址也能控制设备//"239.0.168.188";//
                        //2021-09-23 新增获取当前网关是否本地加密
                        Ins.IsLocalEncrypt = device.isLocalEncrypt;
                        //MainPage.Log("网关本地加密状态:" + device.local_encrypt.ToString());
                    }
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ReadStatus + "_reply" ||
                    receiveObj.Topic == CommunicationTopic.ct.ControlFunctionTopic + "_reply" ||
                    receiveObj.Topic == CommunicationTopic.ct.GatewayUpStatus)
                    receiveObj.Topic == CommunicationTopic.ct.GatewayUpStatus ||
                    receiveObj.Topic.Contains( CommunicationTopic.ct.GatewayUpSortTopic))
                {
                    //TODO 暂时不传正确的数据上去,如果后面要优化前面这些代码
                    UpdataFunctionStatus(receiveObj.BodyDataString, null);
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity +"_reply"
                    || receiveObj.Topic == CommunicationTopic.ct.ReadSecurityStatus + "_reply"
                    || receiveObj.Topic == CommunicationTopic.ct.SecurityStatusUp)
                {
                    try
                    {
                        MainPage.Log($"局域网安防信息: {receiveObj.Topic}  : 内容: {res[1]}");
                        var tt = "";
                        lock (tt) {
                            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityStatusObj>(receiveObj.BodyDataString);
                            if (temp != null)
                            {
                                Control_Udp.ReceiveRepeatManager(temp.id, null);
                                foreach (var updataSecurity in temp.objects)
                                {
                                    var updataLocalSecurity = FunctionList.List.securities.Find((obj) => obj.sid == updataSecurity.sid);
                                    if (updataLocalSecurity != null)
                                    {
                                        updataLocalSecurity.status = updataSecurity.status;
                                        updataLocalSecurity.alarm = updataSecurity.alarm;
                                        ArmCenterPage.LoadEvent_RefreshSecurityStatus(updataLocalSecurity);
                                    }
                                }
                                HomePage.LoadEvent_RefreshSecurityStatus();
                            }
                        }
                    }
                    catch (Exception ex){
                        MainPage.Log($"安防局域网异常:{ex.Message}");
                    }
                }
                else
                {
@@ -661,15 +944,6 @@
        /// <param name="updateBytes"></param>
        public void UpdataFunctionStatus(string revString, byte[] usefulBytes,bool isCloudData = false)
        {
            if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
            {
                if (FunctionList.List.GetDeviceFunctionList(SPK.BrandType.Tuya).Count == 0)
                {
                    //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理...");
                    return;
                }
            }
            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString);
            if (temp != null)
            {
@@ -679,6 +953,22 @@
                {
                    try
                    {
                        if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
                        {
                            if (FunctionList.List.OtherBrandFunction.Count != 0)
                            {
                                if (FunctionList.List.OtherBrandFunction.Find((obj) => obj.sid == updateTemp.sid) == null)
                                {
                                    //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理...");
                                    return;
                                }
                            }
                        }
                        var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid);
                        if (localFunction == null)
                        {
@@ -692,7 +982,7 @@
                                return;
                            }
                        }
                        MainPage.Log($"A协议更新状态:{revString}");
                        //MainPage.Log($"A协议更新状态:{revString}");
                        foreach (var attr in updateTemp.status)
                        {
                            localFunction.time_stamp = temp.time_stamp;
@@ -700,9 +990,15 @@
                        }
                        //更新界面状态
                        Function localObj = null;
                        switch (localFunction.spk)
                        {
                            case SPK.AirSwitch:
                                AirSwitchPage.UpdataState(localFunction);
                                if(localFunction.GetAttribute(FunctionAttributeKey.Power)!=null)//如果是带电量的空开也要更新能源界面
                                {
                                    EnergyMainPage.UpdataStatus(localFunction);
                                }
                                break;
                            case SPK.ElectricEnergy:
                                EnergyMainPage.UpdataStatus(localFunction);
                                break;
@@ -715,6 +1011,7 @@
                                DimmerPage.UpdataStates(localFunction);
                                break;
                            case SPK.ElectricFan:
                            case SPK.HvacFan:
                                localFunction.lastState = Language.StringByID(StringId.Level) + " : " +
                                   localFunction.GetAttrState(FunctionAttributeKey.OpenLevel);
                                FanPage.UpdataState(localFunction);
@@ -744,6 +1041,8 @@
                            case SPK.CurtainShades:
                                break;
                            case SPK.AcStandard:
                            case SPK.HvacAC:
                            case SPK.AcIr:
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                if (localFunction != null)
                                {
@@ -782,10 +1081,12 @@
                                            break;
                                    }
                                    localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new AC().GetTempUnitString(localFunction);
                                    ACPage.UpdataStates(localFunction);
                                }
                                break;
                            case SPK.HvacFloorHeat:
                            case SPK.FloorHeatStandard:
                                localFunction.lastState = "";
                                switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
                                {
                                    case "normal":
@@ -812,6 +1113,7 @@
                            case SPK.SensorTVOC:
                            case SPK.SensorTemperature:
                            case SPK.SensorHumidity:
                            case SPK.SensorHcho:
                                if(localFunction.spk == SPK.SensorTemperature)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
@@ -821,23 +1123,48 @@
                                    HomePage.LoadEvent_RefreshEnvirIndoorHumi();
                                }
                                EnvironmentalPage.LoadEvent_UpdataStatus(localFunction);
                                //A_EnvironmentalDataCenter.LoadEvent_UpdataStatus(localFunction);
                                break;
                            case SPK.SensorEnvironment:
                            case SPK.SensorEnvironment2:
                            case SPK.SensorEnvironment3:
                                if (localFunction.GetAttributes().Contains(FunctionAttributeKey.Temperature))
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
                                }
                                if (localFunction.GetAttributes().Contains(FunctionAttributeKey.Humidity))
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorHumi();
                                }
                                EnvironmentalPage.LoadEvent_UpdataStatus(localFunction);
                                //A_EnvironmentalDataCenter.LoadEvent_UpdataStatus(localFunction);
                                break;
                            case SPK.ElectricSocket:
                            case SPK.PanelSocket:
                                SocketPage.UpdataState(localFunction);
                                break;
                            case SPK.ElectricTV:
                                break;
                            case SPK.ElectricTuyaAirCleaner:
                            case SPK.ElectricTuyaAirCleaner2:
                            case SPK.ElectricTuyaFan:
                            case SPK.ElectricTuyaFan2:
                            case SPK.ElectricTuyaWeepRobot:
                            case SPK.ElectricTuyaWeepRobot2:
                            case SPK.ElectricTuyaWaterValve:
                            case SPK.ElectricTuyaWaterValve2:
                            case SPK.SensorPir:
                            case SPK.SensorDoorWindow:
                            case SPK.SensorSmoke:
                            case SPK.SensorWater:
                            case SPK.ClothesHanger:
                            case SPK.AcIr:
                            case SPK.SenesorMegahealth:
                            case SPK.SenesorMegahealth2:
                            case SPK.AirFreshStandard:
                            case SPK.HvacAirFresh:
                            case SPK.SensorGas:
                                //设备状态推送
                                //状态更新
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                break;
                        }