From d5b9ff8bf8cc36f5b13c46b66682f5988d3a6f36 Mon Sep 17 00:00:00 2001 From: 陈嘉乐 <cjl@hdlchina.com.cn> Date: 星期五, 15 五月 2020 11:36:11 +0800 Subject: [PATCH] 2020-05-15-1 --- ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs | 408 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 378 insertions(+), 30 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs index df7711c..edd263e 100755 --- a/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs +++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs @@ -37,6 +37,10 @@ /// </summary> public string currentSelectFloorId = string.Empty; /// <summary> + /// 褰撳墠閫夋嫨鐨勬埧闂碔D銆愭柊椋庨潰鏉裤�� + /// </summary> + public string currentSelectRoomId = string.Empty; + /// <summary> /// 褰撳墠寮�鍏虫ā寮� /// </summary> public string CurrentSwitchMode = ""; @@ -61,7 +65,7 @@ public string RoomId = ""; /// <summary> - /// 褰撳墠鎴块棿ID + /// 褰撳墠閫変腑鐨勫満鏅疘D /// </summary> public string curSelectSceneID = ""; @@ -155,6 +159,7 @@ /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para> /// </summary> public List<int> privateFuncThirdLevelList = new List<int>(); + #region 鑾峰彇闈㈡澘鐨勭鏈変俊鎭�. /// <summary> ///鑾峰彇闈㈡澘鐨勭鏈変俊鎭� @@ -746,10 +751,14 @@ if (command == "0002") { var tempD = new ResponseData(); - tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); - result = new ResponseAllData { responseData = tempD }; - System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0400_{ topic}"); + if (tempD.command == "0400") + { + result = new ResponseAllData { responseData = tempD }; + System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0400_{ topic}"); + } + } } } @@ -920,10 +929,13 @@ if (command == "0002") { var tempD = new ResponseData(); - tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); - result = new ResponseAllData { responseData = tempD }; - System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0401_{ topic}"); + if (tempD.command == "0401") + { + result = new ResponseAllData { responseData = tempD }; + DebugPrintLog($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0401_{ topic}"); + } } } } @@ -1295,10 +1307,13 @@ if (command == "0002") { var tempD = new ResponseData(); - tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); - result = new ResponseAllData { responseData = tempD }; - System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0402_{ topic}"); + if (tempD.command == "0402") + { + result = new ResponseAllData { responseData = tempD }; + DebugPrintLog($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0402_{ topic}"); + } } } } @@ -1392,7 +1407,7 @@ ///<summary > /// 閰嶇疆鎸夐敭鎸囩ず鐏潰鏉胯妭鑳芥ā寮� /// <para>modeEnable:鑺傝兘妯″紡浣胯兘</para> - /// <para>modeTime:鏃犳搷浣滆繘鍏ヨ妭鑳芥ā寮忔椂闂� 0-ff</para> + /// <para>modeTime:鏃犳搷浣滆繘鍏ヨ妭鑳芥ā寮忔椂闂� 0-ffff</para> /// <para>鑺傝兘妯″紡浜害:0-100</para> /// </summary> public async System.Threading.Tasks.Task<ResponseAllData> SetKeyModeAsync(bool modeEnable, int modeTime, int level) @@ -1446,10 +1461,13 @@ if (command == "0002") { var tempD = new ResponseData(); - tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); - result = new ResponseAllData { responseData = tempD }; - System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0403_{ topic}"); + if (tempD.command == "0403") + { + result = new ResponseAllData { responseData = tempD }; + System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0403_{ topic}"); + } } } } @@ -1496,11 +1514,11 @@ string SetPanelModeModeData(bool modeEnable, int modeTime, int modelevel) { string data = ""; - string dataLength = "07"; + string dataLength = "08"; string dataComand1 = "03"; string dataComand2 = "04"; string dataSerialNum = "01"; - string addDataLength = "03"; + string addDataLength = "04"; string mode = ""; string time = ""; string level = ""; @@ -1514,17 +1532,30 @@ { mode = "00"; } - var sbString1 = new System.Text.StringBuilder(); - string temp = Convert.ToString(modeTime, 16); - switch (temp.Length) + + if (modeTime == -1) { - case 1: - time = "0" + temp; - break; - case 2: - time = temp; - break; + //褰撹妭鑳芥ā寮忔病鏈夌粰鏃堕棿锛岄粯璁ょ粰60绉� + modeTime = 60; } + + var tempBytes = new byte[2]; + for (int i = 0; i < 2; i++) + { + tempBytes[i] = (byte)(modeTime >> (i * 8) & 0xff); + } + var time1 = Convert.ToString(tempBytes[0], 16); + var time2 = Convert.ToString(tempBytes[1], 16); + if (time1.Length == 1) + { + time1 = "0" + time1; + } + if (time2.Length == 1) + { + time2 = "0" + time2; + } + + time = (time1 + time2).ToUpper(); var sbString2 = new System.Text.StringBuilder(); string temp2 = Convert.ToString(modelevel, 16); @@ -1538,10 +1569,147 @@ break; } - sbString1.Append(time.ToUpper()); sbString2.Append(level.ToUpper()); data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + - mode + sbString1 + sbString2; + mode + time + sbString2; + } + catch { }; + + return data; + } + #endregion + + #region 閰嶇疆鎺ヨ繎浼犳劅 + ///<summary > + /// 閰嶇疆鎺ヨ繎浼犳劅 + /// <para>sensorEnable:浼犳劅鍣ㄤ娇鑳�</para> + /// </summary> + public async System.Threading.Tasks.Task<ResponseAllData> SetProximitySensor(bool sensorEnable) + { + ResponseAllData result = null; + if (Gateway == null) + { + result = new ResponseAllData { errorMessageBase = "褰撳墠娌℃湁缃戝叧" }; + return result; + } + return await System.Threading.Tasks.Task.Run(async () => + { + Action<string, string> action = (topic, message) => + { + var gatewayID = topic.Split('/')[0]; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + + if (topic == gatewayID + "/" + "Error_Respon") + { + var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString()); + + if (temp == null) + { + result = new ResponseAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" }; + } + + else + { + result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; + } + } + + if (topic == gatewayID + "/" + "ZbDataPassthrough") + { + var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") }; + gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString()); + + if (gatewayTemp.clientDataPassthroughResponseData == null) + { + result = new ResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" }; + } + else + { + if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) + { + var data = gatewayTemp.clientDataPassthroughResponseData.PassData; + if (data.Length == 16) + { + var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); + if (command == "0002") + { + var tempD = new ResponseData(); + tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); + tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); + if (tempD.command == "0500") + { + result = new ResponseAllData { responseData = tempD }; + DebugPrintLog($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0500_{ topic}"); + } + } + } + } + } + } + }; + + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + var passData = SetProximitySensorData(sensorEnable); + var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + var dateTime = DateTime.Now; + while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime) + { + await System.Threading.Tasks.Task.Delay(10); + if (result != null) + { + break; + } + } + if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) + { + result = new ResponseAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" }; + } + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + + return result; + }); + } + + /// <summary> + /// 閰嶇疆鎺ヨ繎浼犳劅 + /// [璇ユ潯鍗忚鍙﹀2涓弬鏁癠I鍜岃澶囬兘涓嶉渶瑕侊紝璁惧閮藉悓浜嬭姹備紶鎰熷櫒璺濈鍜屼紶鎰熷櫒瑙﹀彂寤惰繜鏃堕棿閮介粯璁ゆ槸FFFF] + /// </summary> + /// <param name="sensorEnable">浼犳劅鍣ㄤ娇鑳� 0-disable 1-enable</param> + /// <returns></returns> + string SetProximitySensorData(bool sensorEnable) + { + string data = ""; + string dataLength = "09"; + string dataComand1 = "00"; + string dataComand2 = "05"; + string dataSerialNum = "01"; + string addDataLength = "05"; + string sEnable = ""; + try + { + if (sensorEnable) + { + sEnable = "01"; + } + else + { + sEnable = "00"; + } + + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + sEnable + "FFFFFFFF"; } catch { }; @@ -2002,7 +2170,7 @@ if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) { var data = gatewayTemp.clientDataPassthroughResponseData.PassData; - if (data.Length == 16) + if (data.Length == 18) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0409") @@ -2016,8 +2184,8 @@ { tempR.enable = false; } - tempR.time = Convert.ToInt32(data[12].ToString() + data[13].ToString(), 16); - tempR.level = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); + tempR.time = Convert.ToInt32(data[14].ToString() + data[15].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempR.level = Convert.ToInt32(data[16].ToString() + data[17].ToString(), 16); panelSaveEnergyModeInfo = tempR; result = new PanelSwitchLevelResponInfo { panelSaveEnergyModeInfo = tempR }; System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0408_{ topic}"); @@ -2132,6 +2300,186 @@ } #endregion + #region 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆 + ///<summary > + ///鑾峰彇鎺ヨ繎浼犳劅閰嶇疆 + /// </summary> + public async System.Threading.Tasks.Task<PanelProximitySensorResponInfo> GetProximitySensorAsync(string reserve = "01") + { + PanelProximitySensorResponInfo result = null; + if (Gateway == null) + { + result = new PanelProximitySensorResponInfo { errorMessageBase = "褰撳墠娌℃湁缃戝叧" }; + return result; + } + return await System.Threading.Tasks.Task.Run(async () => + { + Action<string, string> action = (topic, message) => + { + var gatewayID = topic.Split('/')[0]; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + + if (topic == gatewayID + "/" + "Error_Respon") + { + var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString()); + + if (temp == null) + { + result = new PanelProximitySensorResponInfo { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" }; + } + + else + { + result = new PanelProximitySensorResponInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; + } + } + + if (topic == gatewayID + "/" + "ZbDataPassthrough") + { + var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") }; + gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString()); + + if (gatewayTemp.clientDataPassthroughResponseData == null) + { + result = new PanelProximitySensorResponInfo { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" }; + } + else + { + if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) + { + var data = gatewayTemp.clientDataPassthroughResponseData.PassData; + if (data.Length == 20) + { + var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); + if (command == "0502") + { + var tempR = new PanelProximitySensorInfo(); + if (data[10].ToString() + data[11].ToString() == "01") + { + tempR.enable = true; + } + else + { + tempR.enable = false; + } + tempR.sensorDistance = Convert.ToInt32(data[14].ToString() + data[15].ToString() + data[12].ToString() + data[13].ToString(), 16); + tempR.sensorDelayTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16); + panelProximitySensorInfo = tempR; + result = new PanelProximitySensorResponInfo { panelProximitySensorInfo = tempR }; + System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0408_{ topic}"); + } + } + } + } + } + }; + + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + var passData = SendProiximitySensorData(reserve); + var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + var dateTime = DateTime.Now; + while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) + { + await System.Threading.Tasks.Task.Delay(10); + if (result != null) + { + break; + } + } + if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)// WaitReceiveDataTime) + { + result = new PanelProximitySensorResponInfo { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" }; + } + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + + return result; + }); + } + + /// <summary> + /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁 + /// </summary> + string SendProiximitySensorData(string reserve) + { + string data = ""; + string dataLength = "05"; + string dataComand1 = "01"; + string dataComand2 = "05"; + string dataSerialNum = "01"; + string addDataLength = "01"; + string reserveData = reserve; + + try + { + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + reserveData; + } + catch { }; + + return data; + } + + /// <summary> + /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁鍥炲 + /// </summary> + [System.Serializable] + public class PanelProximitySensorResponInfo + { + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public string errorMessageBase; + /// <summary> + /// 缃戝叧淇℃伅閿欒鍙嶉 + /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para> + /// </summary> + public ErrorResponData errorResponData; + /// <summary> + /// <para>鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁</para> + /// </summary> + public PanelProximitySensorInfo panelProximitySensorInfo; + } + + /// <summary> + /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆 + /// </summary> + public PanelProximitySensorInfo panelProximitySensorInfo; + /// <summary> + /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁 + /// </summary> + [System.Serializable] + public class PanelProximitySensorInfo + { + /// <summary> + /// 浼犳劅鍣ㄤ娇鑳� + ///false-disable true-enable + /// </summary> + public bool enable; + + /// <summary> + ///浼犳劅鍣ㄨ窛绂� + /// </summary> + public int sensorDistance = -1; + + /// <summary> + /// 浼犳劅鍣ㄨЕ鍙戝欢杩熸椂闂� + /// </summary> + public int sensorDelayTime = -1; + } + #endregion + #region 閰嶇疆鎸夐敭鎸囩ず鐏潯鐪犵粍鍒嗭紙鏆傛椂涓嶅仛锛� ///<summary > ///鑾峰彇鎸夐敭鎸囩ず鐏潯鐪犵粍 -- Gitblit v1.8.0