wei
2021-08-21 ec1d7cb35b99f01be0151c5b6f0c0fc2fa30ab95
HDL_ON/DAL/DriverLayer/Control.cs
@@ -26,7 +26,6 @@
    public class Control
    {
       
        static Control _control;
        public static Control Ins
        {
@@ -283,6 +282,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 +322,15 @@
                }
            }
        }
        /// <summary>
        /// 安防控制
        /// </summary>
        public void ControlArm()
        {
            DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest();
            //var pack = httpServer.GetSecurityAlarmLogList
        }
        /// <summary>
        /// 发送命令
@@ -336,10 +368,31 @@
                }
            }
            ///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.ElectricTuyaFan:
@@ -361,16 +414,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)
                {
@@ -399,6 +442,25 @@
                //远程通讯
                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);
@@ -414,29 +476,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 +569,88 @@
        /// 发送读取命令
        /// 自动判断是否为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
                } });
            }
            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);
                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);
            }
        }
@@ -551,7 +684,7 @@
            }
        }
        /// <summary>
        /// 转换通讯数据
        /// 转换发送数据
        /// </summary>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString)
        {
@@ -613,8 +746,9 @@
                //}
                receiveObj.BodyDataString = res[1];
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply)
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast)
                {
                    var bodyJObj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    if (bodyJObj == null)
                    {
@@ -645,6 +779,26 @@
                    //TODO 暂时不传正确的数据上去,如果后面要优化前面这些代码
                    UpdataFunctionStatus(receiveObj.BodyDataString, null);
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity +"_reply"
                    || receiveObj.Topic == CommunicationTopic.ct.ReadSecurityStatus + "_reply"
                    || receiveObj.Topic == CommunicationTopic.ct.SecurityStatusUp)
                {
                    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;
                            }
                        }
                        HomePage.LoadEvent_RefreshSecurityStatus();
                        ArmCenterPage.LoadEvent_RefreshSecurityStatus();
                    }
                }
                else
                {
                    //一些特殊的主题处理(为了执行速度,尽可能的别加耗时的操作)
@@ -661,15 +815,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 +824,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)
                        {
@@ -812,6 +973,27 @@
                            case SPK.SensorTVOC:
                            case SPK.SensorTemperature:
                            case SPK.SensorHumidity:
                                if(localFunction.spk == SPK.SensorTemperature)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
                                }
                                else if (localFunction.spk == SPK.SensorHumidity)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorHumi();
                                }
                                EnvironmentalPage.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);
                                break;
                            case SPK.ElectricSocket:
@@ -829,7 +1011,9 @@
                            case SPK.SensorWater:
                            case SPK.ClothesHanger:
                            case SPK.AcIr:
                            case SPK.SenesorMegahealth:
                                //设备状态推送
                                //状态更新
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                break;
                        }