WJC
2020-03-23 bba578c2f0acf2eca747edcb69426771e0cadd32
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs
@@ -194,10 +194,207 @@
            var deviceAddr = receiveData.Value<string>("DeviceAddr");
            var deviceEpoint = receiveData.Value<int>("Epoint");
            var tempDevice = new CommonDevice { DeviceAddr = deviceAddr, DeviceEpoint = deviceEpoint };
            tempDevice.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.DeviceStatusReportData>(receiveData["Data"].ToString());
            var report = new CommonDevice { DeviceAddr = deviceAddr, DeviceEpoint = deviceEpoint };
            report.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.DeviceStatusReportData>(receiveData["Data"].ToString());
            if (report.DeviceStatusReport.AttriBute.Count == 0)
            {
                //网关有些奇葩,没有属性它也会发过来
                return;
            }
            this.DeviceReportPush(tempDevice, ReceiveComandDiv.A设备属性上报);
            //处理网关上报的数据,然后变更本地缓存
            var locadevice = Common.LocalDevice.Current.GetDevice(deviceAddr, deviceEpoint);
            if (locadevice != null)
            {
                //有反馈,这个设备肯定是在线的
                locadevice.IsOnline = 1;
                locadevice.LastDateTime = DateTime.Now;
                #region ■ 开关功能
                //开关功能
                if (report.DeviceStatusReport.CluterID == 6)
                {
                    if (locadevice is LightBase)
                    {
                        locadevice.DeviceStatusReport = report.DeviceStatusReport;
                        ((LightBase)locadevice).OnOffStatus = report.DeviceStatusReport.AttriBute[0].AttriButeData;
                        //已经接收到状态
                        locadevice.HadReadDeviceStatu = true;
                    }
                }
                #endregion
                #region ■ 窗帘数据
                //窗帘数据
                else if (report.DeviceStatusReport.CluterID == 258)
                {
                    //窗帘类型
                    if (report.DeviceStatusReport.AttriBute[0].AttributeId == 0)
                    {
                        locadevice.DeviceStatusReport = report.DeviceStatusReport;
                        ((Rollershade)locadevice).WcdType = report.DeviceStatusReport.AttriBute[0].AttriButeData;
                        //这个东西要保存
                        locadevice.ReSave();
                    }
                    //窗帘百分比
                    else if (report.DeviceStatusReport.AttriBute[0].AttributeId == 8)
                    {
                        locadevice.DeviceStatusReport = report.DeviceStatusReport;
                        ((Rollershade)locadevice).WcdCurrentPositionLiftPercentage = report.DeviceStatusReport.AttriBute[0].AttriButeData;
                        //已经接收到状态
                        locadevice.HadReadDeviceStatu = true;
                    }
                }
                #endregion
                #region ■ 空调数据
                //空调数据
                else if (report.DeviceStatusReport.CluterID == 513)
                {
                    locadevice.DeviceStatusReport = report.DeviceStatusReport;
                    foreach (var attData in report.DeviceStatusReport.AttriBute)
                    {
                        var curTemp = attData.AttriButeData / 100;
                        if (attData.AttributeId == 0)
                        {
                            //此属性表明室内当前的温度 * 100,实际温度为“LocalTemperature / 100”,单位:℃
                            ((AC)locadevice).currentLocalTemperature = curTemp;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                        else if (attData.AttributeId == 17)
                        {
                            //此属性表明室内当前的温度 * 100,实际温度为“LocalTemperature / 100”,单位:℃
                            ((AC)locadevice).currentCoolingSetpoint = curTemp;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                        else if (attData.AttributeId == 18)
                        {
                            //此属性表明此设备当前的制热温度,实际温度为“HeatingSetpoint / 100”,单位:℃。
                            ((AC)locadevice).currentHeatingSetpoint = curTemp;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                        else if (attData.AttributeId == 28)
                        {
                            //此属性描述恒温设备正处于哪种模式
                            ((AC)locadevice).currentSystemMode = attData.AttriButeData;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                        else if (attData.AttributeId == 4096)
                        {
                            //此属性表明此设备当前的自动温度,实际温度为“AutoSetpoint / 100”,单位:℃。
                            ((AC)locadevice).currentAutoSetpoint = curTemp;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                    }
                }
                //空调数据
                else if (report.DeviceStatusReport.CluterID == 514)
                {
                    locadevice.DeviceStatusReport = report.DeviceStatusReport;
                    foreach (var attData in report.DeviceStatusReport.AttriBute)
                    {
                        if (attData.AttributeId == 0)
                        {
                            //风扇模式
                            ((AC)locadevice).currentFanMode = attData.AttriButeData;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                        else if (attData.AttributeId == 4096)
                        {
                            //风扇扫风
                            ((AC)locadevice).currentFanSwingMode = attData.AttriButeData;
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                    }
                }
                #endregion
                #region ■ 亮度数据
                //亮度数据
                else if (report.DeviceStatusReport.CluterID == 8)
                {
                    locadevice.DeviceStatusReport = report.DeviceStatusReport;
                    if (report.DeviceStatusReport.AttriBute[0].AttributeId == 0)
                    {
                        //此属性表明当前亮度程度
                        ((DimmableLight)locadevice).Level = report.DeviceStatusReport.AttriBute[0].AttriButeData;
                        //已经接收到状态
                        locadevice.HadReadDeviceStatu = true;
                    }
                }
                #endregion
                #region ■ 温度数据
                //温度数据
                else if (report.DeviceStatusReport.CluterID == 1026)
                {
                    foreach (var attData in report.DeviceStatusReport.AttriBute)
                    {
                        //温度
                        if (attData.AttributeId == (int)AttriButeId.MeasuredValue)
                        {
                            if (attData.AttriButeData == 0)
                            {
                                ((TemperatureSensor)locadevice).Temperatrue = 0;
                            }
                            else if (attData.AttriButeData > 32767)
                            {
                                //负数(特殊处理)
                                string strValue = (attData.AttriButeData - 65536).ToString();
                                //小数点需要一位
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                ((TemperatureSensor)locadevice).Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                            }
                            else
                            {
                                //小数点需要一位
                                string strValue = attData.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                ((TemperatureSensor)locadevice).Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                            }
                            //已经接收到状态
                            locadevice.HadReadDeviceStatu = true;
                        }
                    }
                }
                #endregion
                #region ■ 湿度数据
                //湿度数据
                else if (report.DeviceStatusReport.CluterID == 1029)
                {
                    foreach (var attData in report.DeviceStatusReport.AttriBute)
                    {
                        //湿度
                        if (attData.AttributeId == (int)AttriButeId.MeasuredValue)
                        {
                            if (attData.AttriButeData == 0)
                            {
                                ((TemperatureSensor)locadevice).Humidity = 0;
                            }
                            else
                            {
                                //小数点需要一位(湿度没有负数)
                                string strValue = attData.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                ((TemperatureSensor)locadevice).Humidity = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                            }
                        }
                        //已经接收到状态
                        locadevice.HadReadDeviceStatu = true;
                    }
                }
                #endregion
            }
            this.DeviceReportPush(report, ReceiveComandDiv.A设备属性上报);
        }
        #endregion
@@ -218,6 +415,15 @@
            {
                //保存安防报警信息到本地
                HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(ias);
            }
            //处理网关上报的数据,然后变更本地缓存
            var locadevice = Common.LocalDevice.Current.GetDevice(ias.DeviceAddr, ias.DeviceEpoint);
            if (locadevice != null)
            {
                ((IASZone)locadevice).iASInfo = ias.iASInfo;
                //记录回复时间
                locadevice.LastDateTime = DateTime.Now;
            }
            this.DeviceReportPush(ias, ReceiveComandDiv.A传感器上报);
@@ -260,7 +466,17 @@
            }
            var tempDevice = new CommonDevice() { DeviceAddr = receiveData.Value<string>("DeviceAddr"), DeviceEpoint = receiveData.Value<int>("Epoint") };
            tempDevice.IsOnline = Convert.ToInt32(receiveData["Data"]["IsOnline"].ToString());
            //处理网关上报的数据,然后变更本地缓存
            var locadevice = Common.LocalDevice.Current.GetDevice(tempDevice.DeviceAddr, tempDevice.DeviceEpoint);
            if (locadevice != null)
            {
                locadevice.IsOnline = tempDevice.IsOnline;
                //记录回复时间
                locadevice.LastDateTime = DateTime.Now;
                locadevice.ReSave();
            }
            this.DeviceReportPush(tempDevice, ReceiveComandDiv.A设备在线上报);
        }
@@ -517,11 +733,11 @@
        #region ■ 一般方法___________________________
        /// <summary>
        /// 设备上报推送
        /// 设备上报推送(调用此方法,他会推送到各自的界面)
        /// </summary>
        /// <param name="common"></param>
        /// <param name="comand"></param>
        private void DeviceReportPush(CommonDevice common, ReceiveComandDiv comand)
        public void DeviceReportPush(CommonDevice common, ReceiveComandDiv comand)
        {
            if (this.dicDeviceEvent.Count == 0)
            {