wxr
2024-09-27 acc8caee31c4be90bd38d1af18136b0e84f6fe94
HDL_ON/DAL/DriverLayer/Control.cs
@@ -111,7 +111,7 @@
                    {
                        //修改主页连接状态
                        HomePage.LoadEvent_CheckLinkStatus();
                        MainPage.Log($"网关局域网在线,刷新设备状态");
                        //MainPage.Log($"网关局域网在线,刷新设备状态");
                        new System.Threading.Thread(() =>
                        {
                            System.Threading.Thread.Sleep(1000);
@@ -127,7 +127,7 @@
                }
                else
                {
                    MainPage.Log($"状态一致,不更新数据(本地)");
                    //MainPage.Log($"状态一致,不更新数据(本地)");
                }
            }
        }
@@ -261,6 +261,7 @@
        /// </summary>
        public void OpenTcpClent()
        {
            return;
            if (myTcpClient == null)
            {
                myTcpClient = new Control_TcpClient(reportIp);
@@ -275,8 +276,8 @@
        public void SearchLoaclGateway()
        {
            //2021-01-15 : 住宅没有绑定网关的时候不用搜索,并且不能链接mqtt
            if (DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId) ||
                    !UserInfo.Current.IsLogin)
            if (DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId))
                //|| !UserInfo.Current.IsLogin)
            {
                return;
            }
@@ -403,7 +404,7 @@
                    }
                    asd.status = status1;
                    upDataObj.objects.Add(asd);
                    revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                    revString = JsonConvert.SerializeObject(upDataObj);
                    UpdataFunctionStatus(revString, null, true);
                }
                return;
@@ -443,7 +444,7 @@
            //如果是控制调光的开时,亮度值不能为0
            if (commandDictionary.Count > 2)
            if (commandDictionary.Count >= 2)
            {
                if (commandDictionary.ContainsKey(FunctionAttributeKey.OnOff) && commandDictionary.ContainsKey(FunctionAttributeKey.Brightness))
                {
@@ -479,12 +480,12 @@
                }
                asd.status = status1;
                upDataObj.objects.Add(asd);
                revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                revString = JsonConvert.SerializeObject(upDataObj);
                UpdataFunctionStatus(revString, null, true);
                return true;
            }
            //MainPage.Log($"发送数据:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}");
            //MainPage.Log($"发送数据:{JsonConvert.SerializeObject(commandDictionary)}");
            ///第三方涂鸦设备统一使用远程控制
            switch (function.spk)
@@ -531,11 +532,11 @@
                    else
                    {
                        var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary);
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj);
                        var functionControlDataJson = JsonConvert.SerializeObject(functionControlDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson);
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id, resend);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                            Ins.myTcpClient.SendMessage(sendBytes);
                            //Ins.myTcpClient.SendMessage(sendBytes);
                    }
                }
                //远程通讯
@@ -625,6 +626,10 @@
            {
                foreach (var temp in functions)
                {
                    if((temp.trait_on_off.state.ToString() ==  "on" && open)|| temp.trait_on_off.state.ToString() == "off"&& !open)
                    {
                        continue;
                    }
                    var apiControlData = temp.GetApiControlData(d);
                    actionObjs.Add(apiControlData);
                    count++;
@@ -636,7 +641,10 @@
                        System.Threading.Thread.Sleep(100);
                    }
                }
                var pack = pm.ControlDevice(actionObjs);
                if (actionObjs.Count > 0)
                {
                    var pack = pm.ControlDevice(actionObjs);
                }
            }
        }
@@ -656,7 +664,7 @@
            if (pack != null && pack.Data != null)
            {
                //待测试2021-03-04
                var ddd = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AlinkStatusData>>(pack.Data.ToString());
                var ddd = JsonConvert.DeserializeObject<List<AlinkStatusData>>(pack.Data.ToString());
                if (ddd != null)
                {
                    foreach (var function in ddd)
@@ -716,7 +724,7 @@
                                        },
                            time_stamp = Utlis.GetTimestamp()
                        };
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                        var functionControlDataJson = JsonConvert.SerializeObject(readDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
@@ -724,8 +732,18 @@
                }
                else
                {
                    var pm = new DAL.Server.HttpServerRequest();
                    var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
                    var pm = new HttpServerRequest();
                    try
                    {
                        pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
                    }catch(Exception ex)
                    {
                        MainPage.Log($"远程读取设备状态异常:{ex.Message}");
                    }
                    finally
                    {
                        pm = null;
                    }
                }
            }
        }
@@ -788,7 +806,7 @@
                            objects = objects,
                            time_stamp = Utlis.GetTimestamp()
                        };
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                        var functionControlDataJson = JsonConvert.SerializeObject(readDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
@@ -832,7 +850,7 @@
                        },
                    time_stamp = Utlis.GetTimestamp()
                };
                var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData);
                var aLinkJson = JsonConvert.SerializeObject(aLinkData);
                var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlSeurity, aLinkJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id);
            }
@@ -862,7 +880,7 @@
                        },
                    time_stamp = Utlis.GetTimestamp()
                };
                var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData);
                var aLinkJson = JsonConvert.SerializeObject(aLinkData);
                var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlScene, aLinkJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id, 0);
            }
@@ -886,7 +904,7 @@
                    objects = objects,
                    time_stamp = Utlis.GetTimestamp()
                };
                var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                var functionControlDataJson = JsonConvert.SerializeObject(readDataObj);
                var sendBytes = Ins.ConvertSendBodyData($"/base/{DB_ResidenceData.Instance.HomeGateway.gatewayId}/thing/service/MusicPlayGroupListGet/down", functionControlDataJson);
                MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
@@ -904,7 +922,7 @@
            var sendId = Ins.msg_id.ToString();
            var sendObj = new { objects = objects1, id = sendId, time_stamp = Utlis.GetTimestamp() };
            var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(sendObj);
            var aLinkJson = JsonConvert.SerializeObject(sendObj);
            var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.AuthGateway, aLinkJson);
            new Control_Udp().SendLocalHdlLinkData(sendBytes, Ins.msg_id.ToString());
        }
@@ -960,10 +978,10 @@
        /// <returns></returns>
        public void ConvertReceiveData(byte[] receiveBytes, string ip)
        {
            if (!UserInfo.Current.IsLogin)
            {
                return;
            }
            //if (!UserInfo.Current.IsLogin)
            //{
            //    return;
            //}
            var reString = Encoding.UTF8.GetString(receiveBytes);
            AnalysisReceiveData(reString, receiveBytes, ip);
        }
@@ -1011,7 +1029,7 @@
                if (receiveObj.Topic == CommunicationTopic.ct.HeartBeat + "_reply")
                {
                    Ins.myTcpClient.ClearHeartBeatLog();
                    //Ins.myTcpClient.ClearHeartBeatLog();
                    MainPage.Log("tcp心跳回复");
                    return null;
                }
@@ -1055,19 +1073,19 @@
                    }
                    else
                    {
                        MainPage.Log($"局域网信息: 明文:" + receiveObj.BodyDataString);
                        //MainPage.Log($"局域网信息: 明文:" + receiveObj.BodyDataString);
                    }
                }
                try
                {
                    var idMsg = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    var idMsg = JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    var hasProcess = hasItBeenProcessed(idMsg.id);
                    if (hasProcess)
                    {
                        return null;
                    }
                    MainPage.Log($"处理局域网数据id:{idMsg.id}");
                    //MainPage.Log($"处理局域网数据id:{idMsg.id}");
                }
                catch (Exception ex)
@@ -1078,16 +1096,16 @@
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast)
                {
                    var bodyJObj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    var bodyJObj = JsonConvert.DeserializeObject<ResponsePack>(res[1]);
                    if (bodyJObj == null)
                    {
                        return receiveObj;
                    }
                    var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString());
                    var device = JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString());
                    if (device.device_mac.ToUpper() == DB_ResidenceData.Instance.HomeGateway.mac.ToUpper())
                    {
                        MainPage.Log("本地搜索网关成功");
                        MainPage.Log("本地搜索网关成功:"+ receiveObj.Topic);
                        Ins.IsSearchLocalGatewaySuccessful = true;
                        Ins.GatewayOnline_Local = true;
                        if (!string.IsNullOrEmpty(device.gatewayId))
@@ -1106,8 +1124,8 @@
                        //2021-09-23 新增获取当前网关是否本地加密
                        Ins.IsLocalEncrypt = device.isLocalEncrypt;
                        //MainPage.Log("网关本地加密状态:" + device.local_encrypt.ToString());
                        //登录网关Tcp
                        OpenTcpClent();
                        //登录网关Tcp  tcp连接网关
                        //OpenTcpClent();
                    }
@@ -1119,6 +1137,7 @@
                    receiveObj.Topic.Contains(CommunicationTopic.ct.GatewayUpSortTopic))
                {
                    //TODO 暂时不传正确的数据上去,如果后面要优化前面这些代码
                    //Console.WriteLine($"{receiveObj.Topic}\r\n{receiveObj.BodyDataString}");
                    UpdataFunctionStatus(receiveObj.BodyDataString, null);
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity + "_reply"
@@ -1131,7 +1150,7 @@
                        var tt = "";
                        lock (tt)
                        {
                            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityStatusObj>(receiveObj.BodyDataString);
                            var temp = JsonConvert.DeserializeObject<SecurityStatusObj>(receiveObj.BodyDataString);
                            if (temp != null)
                            {
                                Control_Udp.ReceiveRepeatManager(temp.id, null);
@@ -1156,7 +1175,7 @@
                }
                else if (receiveObj.Topic == $"/user/{GatewayId}/custom/gateway/login_reply")
                {
                    var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(receiveObj.BodyDataString);
                    var temp = JsonConvert.DeserializeObject<JObject>(receiveObj.BodyDataString);
                    if (temp.GetValue("objects").ToString().Contains("success"))
                    {
                        LocalTcpClientLogin = true;
@@ -1209,7 +1228,7 @@
        /// <summary>
        /// 更新设备状态
        /// 更新群控设备状态
        /// A协议数据
        /// </summary>
        public void UpdataGroupControlStatus(string revString, byte[] usefulBytes, bool isCloudData = false)
@@ -1228,7 +1247,7 @@
                        {
                            continue;
                        }
                        MainPage.Log($"收到数据:{revString}");
                        MainPage.Log($"收到群控数据:{revString}");
                        foreach (var attr in updateTemp.status)
                        {
                            localFunction.time_stamp = temp.time_stamp;
@@ -1271,7 +1290,7 @@
            //    return;
            //}
            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString);
            var temp = JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString);
            if (temp != null)
            {
                Control_Udp.ReceiveRepeatManager(temp.id, usefulBytes);
@@ -1304,16 +1323,6 @@
                        }
                        MainPage.Log(localFunction.name);
                        if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
                        {
                            if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk) && !SPK.MusicSpkList().Contains(localFunction.spk))
                            {
                                //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理........");
                                return;
                            }
                        }
                        //if (SPK.MusicSpkList().Contains(localFunction.spk))
                        //{
                        //    if (updateTemp.status.Count < 3)
@@ -1328,8 +1337,17 @@
                        {
                            localFunction.time_stamp = temp.time_stamp;
                            localFunction.SetAttrState(attr.key, attr.value);
                        }
                        if(localFunction.spk == SPK.AirSwitchP3)
                        {
                            localFunction.online = updateTemp.online;
                        }
                        if (SPK.LightSpkList().Contains(localFunction.spk))
                        {
                            localFunction.updateTime = DateTime.Now;
                        }
                        //更新界面状态
                        switch (localFunction.spk)
@@ -1341,12 +1359,23 @@
                                AcstParentPage.UpdateAcstSubInfo(localFunction);
                                AcstSubPage.UpdateStatus(localFunction);
                                break;
                            case SPK.WaterHeaterJinmao:
                                AcstParentPage.UpdateAcstSubInfo(localFunction);
                                WaterHeaterJinmaoPage.UpdateStatus();
                                break;
                            case SPK.InverterJinmao:
                                InverterJinmaoPage.UpdateStatus(localFunction);
                                break;
                            case SPK.AirSwitch:
                                AirSwitchPage.UpdataState(localFunction);
                                if (localFunction.GetAttribute(FunctionAttributeKey.Power) != null)//如果是带电量的空开也要更新能源界面
                                {
                                    EnergyMainPage.UpdataStatus(localFunction);
                                }
                                break;
                            case SPK.AirSwitchP3:
                                AirSwitchP3Page.UpdataState(localFunction);
                                AirSwitchP3SubloopEnergyPage.UpdataStatus(localFunction);
                                break;
                            case SPK.ElectricEnergy:
                                EnergyMainPage.UpdataStatus(localFunction);
@@ -1402,7 +1431,7 @@
                                VenetianBlindsPage.UpdataState(localFunction);
                                break;
                            case SPK.AcStandard:
                            case SPK.HvacAC:
                            case SPK.HvacAC:case SPK.HvacAcPanel:
                            case SPK.AcIr:
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                if (localFunction != null)
@@ -1445,7 +1474,7 @@
                                }
                                break;
                            case SPK.HvacFloorHeat:
                            case SPK.HvacFloorHeat:case SPK.HvacFloorHeatPanel:
                            case SPK.FloorHeatStandard:
                                localFunction.lastState = "";
                                switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
@@ -1470,11 +1499,13 @@
                                FloorHeatingPage.UpdataStates(localFunction);
                                break;
                            case SPK.SensorPm25:
                            case SPK.SensorPm10:
                            case SPK.SensorCO2:
                            case SPK.SensorTVOC:
                            case SPK.SensorTemperature:
                            case SPK.SensorHumidity:
                            case SPK.SensorHcho:
                            case SPK.SensorLight:
                                if (localFunction.spk == SPK.SensorTemperature)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
@@ -1515,7 +1546,6 @@
                            case SPK.ElectricTuyaWeepRobot2:
                            case SPK.ElectricTuyaWaterValve:
                            case SPK.ElectricTuyaWaterValve2:
                            case SPK.SensorPir:
                            case SPK.SensorDoorWindow:
                            case SPK.SensorSmoke:
                            case SPK.SensorWater:
@@ -1530,6 +1560,22 @@
                                //状态更新
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                break;
                            case SPK.SensorPir:
                            case SPK.SensorPirHold:
                                var tempPirStatus = localFunction.attributes.Find((sta) => sta.key == "people_status");
                                if (tempPirStatus != null)
                                {
                                    if(tempPirStatus.state == "true")
                                    {
                                        localFunction.lastState = Language.StringByID(StringId.Someone);
                                    }
                                    else
                                    {
                                        localFunction.lastState = Language.StringByID(StringId.wuren);
                                    }
                                }
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                break;
                            case SPK.SenesorMegahealth:
                            case SPK.SenesorMegahealth2:
                            case SPK.SensorMmvPose:
@@ -1541,7 +1587,7 @@
                                    switch (tempStatus.state)
                                    {//0空,1走,2跑,3坐,4跌倒,5站
                                        case "0":
                                            localFunction.lastState = Language.StringByID(StringId.SensorNormalState);
                                            localFunction.lastState = Language.StringByID(StringId.wuren);
                                            break;
                                        case "1":
                                            localFunction.lastState = Language.StringByID(StringId.SomeoneIn);
@@ -1578,6 +1624,17 @@
                            case SPK.MusicStandard:
                                //UI.Music.MusicMain.mMusicMain.RefreshView(updateTemp);
                                Console.WriteLine("音乐播放器显示状态=======" + revString);
                                foreach (var music in UI.Music.A31MusicModel.A31MusicModelList)//每次收到数据都要更新一下时间
                                {
                                    if (music.functionMusic.sid == localFunction.sid)
                                    {
                                        music.LastDateTime = DateTime.Now;
                                    }
                                }
                                if (UI.Music.A31MusicModel.Current != null)
                                {
                                    UI.Music.A31MusicModel.Current.LastDateTime = DateTime.Now;
                                }
                                //wjc
                                break;
                            case SPK.Inverter:
@@ -1585,11 +1642,12 @@
                                var status = new Dictionary<string, object> { ["method"] = "status", ["data"] = temp.objects };
                                Application.RunOnMainThread(() =>
                                {
                                    Inverter.Ins.H5Page.CallJS($"nativeToJs(\'{Newtonsoft.Json.JsonConvert.SerializeObject(status)}\')");
                                    Inverter.Ins.H5Page.CallJS($"nativeToJs(\'{JsonConvert.SerializeObject(status)}\')");
                                });
                                break;
                        }
                        HomePage.UpdataFunctionStates(localFunction);
                        RoomPage.UpdataStates(localFunction);
                        FunctionPage.UpdataStates(localFunction);
@@ -1617,7 +1675,7 @@
            {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                var functionControlDataObj = doorlock.GetGatewayAlinkDoorlockData(UserInfo.Current.ID, extStr);
                var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj);
                var functionControlDataJson = JsonConvert.SerializeObject(functionControlDataObj);
                var sendBytes = Ins.ConvertSendBodyData($"/base/{Control.Ins.GatewayId}/thing/service/doorRemoteOpen/down", functionControlDataJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id, 0);
            }
@@ -1650,7 +1708,7 @@
                    var pack = HttpUtil.RequestHttpsPost("/home-wisdom/app/device/door/pwdConfirm", requestJson);
                    if (pack.Code == StateCode.SUCCESS)
                    {
                        Newtonsoft.Json.Linq.JObject pairs = Newtonsoft.Json.Linq.JObject.Parse(pack.Data.ToString());
                        JObject pairs = JObject.Parse(pack.Data.ToString());
                        var scrip = pairs.GetValue("scrip");
                        d = new Dictionary<string, object>();