using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; using ZigBee.Device; using ZigBee.Common; namespace Shared.Phone.Device.Logic { public class Send { /// /// 获取LogicId的方法 /// /// The logic identifier. public static async System.Threading.Tasks.Task> GetLogicId() { return await System.Threading.Tasks.Task.Run(async () => { List logicIdList = new List(); Action action = (topic, data) => { var gatewayID = topic.Split('/')[0]; var jObjectdata = JObject.Parse(data); if (jObjectdata == null) { return; } if (topic == $"{gatewayID}/Logic/GetLogicList_Respon") { var list = jObjectdata["Data"]["LogicList"]; if(list==null){ return; } foreach (var listIfon in list) { var logicId = int.Parse(listIfon["LogicId"].ToString()); logicIdList.Add(logicId); } } }; var mainGateWay = ZbGateway.MainGateWay; if (mainGateWay == null) { Console.WriteLine("没有主网关"); return logicIdList; } mainGateWay.GwResDataAction += action; var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2004 } }; mainGateWay?.Send("Logic/GetLogicList",jObject.ToString()); //await System.Threading.Tasks.Task.Run(async () => //{ var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 3 * 1000) { await System.Threading.Tasks.Task.Delay(100); if (logicIdList.Count != 0) { break; } } ZbGateway.MainGateWay.GwResDataAction -= action; //}); return logicIdList; }); } /// /// 获取Logic的方法 /// /// The logic identifier. public static async System.Threading.Tasks.Task GetLogic(int LogicId) { return await System.Threading.Tasks.Task.Run(async () => { Common.Logic logic = null; Action action = (topic, data) => { var gatewayID = topic.Split('/')[0]; var jObjectdata = JObject.Parse(data); if (jObjectdata == null) { return; } if (topic == $"{gatewayID}/Logic/GetLogicInfo_Respon") { logic = new Common.Logic(); var Logicifon = jObjectdata["Data"]; logic.LogicId = int.Parse(Logicifon["LogicId"]?.ToString()); logic.IsEnable = int.Parse(Logicifon["IsEnable"]?.ToString()); logic.LogicName = Logicifon["LogicName"]?.ToString(); logic.Relationship = int.Parse(Logicifon["Relationship"]?.ToString()); logic.TimeAttribute = Newtonsoft.Json.JsonConvert.DeserializeObject(Logicifon["TimeAttribute"].ToString()); logic.Conditions = Newtonsoft.Json.JsonConvert.DeserializeObject>>(Logicifon["Conditions"].ToString()); var listactions = Newtonsoft.Json.JsonConvert.DeserializeObject>>(Logicifon["Actions"].ToString()); if (listactions != null) { foreach (var actions in listactions) { Dictionary actionsdictionary = new Dictionary(); List> tasklist = new List>(); if (actions["LinkType"].ToString() == "0") { actionsdictionary.Add("LinkType", actions["LinkType"]); actionsdictionary.Add("DeviceAddr", actions["DeviceAddr"]); actionsdictionary.Add("Epoint", actions["Epoint"]); actionsdictionary.Add("Time", actions["Time"]); var list = JArray.Parse(actions["TaskList"].ToString()); foreach (var taskIfon in list) { Dictionary dictionary = new Dictionary(); dictionary.Add("TaskType", taskIfon["TaskType"].ToString()); dictionary.Add("Data1", taskIfon["Data1"].ToString()); dictionary.Add("Data2", taskIfon["Data2"].ToString()); tasklist.Add(dictionary); } actionsdictionary.Add("TaskList", tasklist); } else { actionsdictionary = actions; } logic.Actions.Add(actionsdictionary); } } }; }; var mainGateWay = ZbGateway.MainGateWay; if (mainGateWay == null) { Console.WriteLine("没有主网关"); return logic; } mainGateWay.GwResDataAction += action; try { var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2002 } }; var data = new JObject { { "LogicId",LogicId} }; jObject.Add("Data", data); ZbGateway.MainGateWay?.Send("Logic/GetLogicInfo", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 3 * 1000) { await System.Threading.Tasks.Task.Delay(100); if (logic != null) { break; } } ZbGateway.MainGateWay.GwResDataAction -= action; return logic; }); } /// /// 删除逻辑 /// public static async System.Threading.Tasks.Task DelLogic(int LogicId) { return await System.Threading.Tasks.Task.Run(async () => { //Result:0成功,1失败; int Result = 3; Action action = (topic, dataleng) => { var gatewayID = topic.Split('/')[0]; var jobject = JObject.Parse(dataleng); if (topic == gatewayID + "/" + "Logic/DelLogic_Respon") { Result = int.Parse(jobject["Data"]["Result"].ToString()); } }; var mainGateWay = ZbGateway.MainGateWay; if (mainGateWay == null) { Console.WriteLine("没有主网关"); return Result; } ZbGateway.MainGateWay.Actions += action; var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2009 } }; var data = new JObject { { "LogicId",LogicId} }; jObject.Add("Data", data); ZbGateway.MainGateWay?.Send("Logic/DelLogic", jObject.ToString()); var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 3 * 1000) { await System.Threading.Tasks.Task.Delay(100); if (Result != 3) { break; } } ZbGateway.MainGateWay.Actions -= action; return Result; }); } /// /// 添加或修改逻辑 /// public static async System.Threading.Tasks.Task AddModifyLogic(Common.Logic logic) { return await System.Threading.Tasks.Task.Run(async () => { Common.Logic Logicifon = null; Action action = (topic, datastring) => { var gatewayID = topic.Split('/')[0]; var jObjectdata = JObject.Parse(datastring); if (jObjectdata == null) { return; } if (topic == gatewayID + "/Logic/AddLogic_Respon") { try { Logicifon=new Common.Logic(); Logicifon = Newtonsoft.Json.JsonConvert.DeserializeObject(jObjectdata["Data"].ToString()); } catch (Exception ex) { var mess = ex.Message; } } }; var mainGateWay = ZbGateway.MainGateWay; if (mainGateWay == null) { Console.WriteLine("没有主网关"); return Logicifon; } ZbGateway.MainGateWay.Actions += action; try { //var bytes = new byte[64]; //var LogicNameBytes = System.Text.Encoding.UTF8.GetBytes(logic.LogicName); //Array.Copy(LogicNameBytes, 0, bytes, 0, 64 < LogicNameBytes.Length ? 64 : LogicNameBytes.Length); //logic.LogicName = System.Text.Encoding.UTF8.GetString(bytes); var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2000 } }; var selectMonthList = new JArray { }; foreach (var intvalue in logic.TimeAttribute.SelectMonDate) { selectMonthList.Add(intvalue); } var timeAttribute = new JObject{ { "Calendar",logic.TimeAttribute.Calendar}, { "Repeat", logic.TimeAttribute.Repeat} , { "WeekDay", logic.TimeAttribute.WeekDay} , { "SetYear",logic.TimeAttribute.SetYear} , { "MonthDate", logic.TimeAttribute.MonthDate} , { "SelectMonth", logic.TimeAttribute.SelectMonth} , { "SelectMonDate", selectMonthList}, }; var conditions = new JArray(); foreach (var dictionary in logic.Conditions) { var Type = int.Parse(dictionary["Type"]); // (0:时间点条件;1:设备状态变化条件;2:其他逻辑条件;3:计数器条件;4:倒计时;5:时间段条件) switch (Type) { case 0: var tInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] =int.Parse(dictionary["IsValid"]), ["DateType"] = int.Parse(dictionary["DateType"]), ["RemindTime"] = int.Parse(dictionary["RemindTime"]), ["EnDelay"] = int.Parse(dictionary["EnDelay"]), ["DelayTime"] = int.Parse(dictionary["DelayTime"]), }; if (dictionary["DateType"].ToString() == "0") { tInfo.Add("StartHour", int.Parse(dictionary["StartHour"])); tInfo.Add("StartMin", int.Parse(dictionary["StartMin"])); } else { tInfo.Add("AdjustTime", int.Parse(dictionary["AdjustTime"])); } conditions.Add(tInfo); break; case 1: var dInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["MacAddr"] = dictionary["MacAddr"], ["Epoint"] = int.Parse(dictionary["Epoint"]), ["Cluster_ID"] = int.Parse(dictionary["Cluster_ID"]), ["AttriButeId"] = int.Parse(dictionary["AttriButeId"]), ["AttriButeData1"] = int.Parse(dictionary["AttriButeData1"]), ["AttriButeData2"] = int.Parse(dictionary["AttriButeData2"]), ["Range"] = int.Parse(dictionary["Range"]), }; conditions.Add(dInfo); break; case 2: var lInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["Condition_LogicId"] = int.Parse(dictionary["Condition_LogicId"]), }; conditions.Add(lInfo); break; case 3: var cInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["MacAddr"] = dictionary["MacAddr"], ["Epoint"] = int.Parse(dictionary["Epoint"]), ["Cluster_ID"] = int.Parse(dictionary["Cluster_ID"]), ["AttriButeId"] = int.Parse(dictionary["AttriButeId"]), ["AttriButeData1"] = int.Parse(dictionary["AttriButeData1"]), ["AttriButeData2"] = int.Parse(dictionary["AttriButeData2"]), ["Range"] = int.Parse(dictionary["Range"]), ["Number"] = int.Parse(dictionary["Number"]), ["Time"] = int.Parse(dictionary["Time"]), ["Cycle"] = int.Parse(dictionary["Cycle"]), }; conditions.Add(cInfo); break; case 4: var cdInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["Time"] = int.Parse(dictionary["Time"]), }; conditions.Add(cdInfo); break; case 5: var tbInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["StartHour"] = int.Parse(dictionary["StartHour"]), ["StartMin"] = int.Parse(dictionary["StartMin"]), ["StopHour"] = int.Parse(dictionary["StopHour"]), ["StopMin"] = int.Parse(dictionary["StopMin"]), }; conditions.Add(tbInfo); break; case 6: var sInfo = new JObject { ["Type"] = int.Parse(dictionary["Type"]), ["IsValid"] = int.Parse(dictionary["IsValid"]), ["EnOrWithdrawMode"] = int.Parse(dictionary["EnOrWithdrawMode"]), ["ModeId"] = int.Parse(dictionary["ModeId"]), }; conditions.Add(sInfo); break; } } var actions = new JArray(); foreach (var dictionary in logic.Actions) { var linkType = int.Parse(dictionary["LinkType"].ToString()); switch (linkType) { case 0: var taskList = new JArray(); var TaskList = dictionary["TaskList"] as List>; foreach (var taskInfo in TaskList) { var info = new JObject { ["TaskType"] = int.Parse(taskInfo["TaskType"].ToString()), ["Data1"] = int.Parse(taskInfo["Data1"].ToString()), ["Data2"] = int.Parse(taskInfo["Data2"].ToString()), }; taskList.Add(info); } var tInfo = new JObject { ["LinkType"] = int.Parse(dictionary["LinkType"].ToString()), ["DeviceAddr"] = dictionary["DeviceAddr"].ToString(), ["Epoint"] = int.Parse(dictionary["Epoint"].ToString()), ["Time"] =int.Parse(dictionary["Time"].ToString()), ["taskList"] = taskList, }; actions.Add(tInfo); break; case 2: var dInfo = new JObject { ["LinkType"] = int.Parse(dictionary["LinkType"].ToString()), ["DeviceAddr"] = int.Parse(dictionary["DeviceAddr"].ToString()), }; actions.Add(dInfo); break; case 4: var lInfo = new JObject { ["LinkType"] = int.Parse(dictionary["LinkType"].ToString()), ["DeviceAddr"] = int.Parse(dictionary["DeviceAddr"].ToString()), ["EnableLogic"] = int.Parse(dictionary["EnableLogic"].ToString()), }; actions.Add(lInfo); break; case 6: var cdInfo = new JObject { ["LinkType"] = int.Parse(dictionary["LinkType"].ToString()), ["SecuritySetting"] = int.Parse(dictionary["SecuritySetting"].ToString()), ["SecurityModeId"] = int.Parse(dictionary["SecurityModeId"].ToString()), ["CheckIASStatus"] = int.Parse(dictionary["CheckIASStatus"].ToString()), ["IsDelayStart"] = int.Parse(dictionary["IsDelayStart"].ToString()), ["Password"] = dictionary["Password"].ToString(), }; actions.Add(cdInfo); break; } } var data = new JObject{ { "LogicId",logic.LogicId}, { "IsEnable", logic.IsEnable} , { "LogicName", logic.LogicName}, { "Relationship",logic.Relationship} , { "TimeAttribute", timeAttribute} , { "Conditions", conditions }, { "Actions", actions }, }; jObject.Add("Data", data); ZbGateway.MainGateWay?.Send("Logic/AddLogic", jObject.ToString()); } catch (Exception e) { var dd = e.Message; } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 3*1000) { await System.Threading.Tasks.Task.Delay(100); if (Logicifon != null) { break; } } ZbGateway.MainGateWay.Actions -= action; return Logicifon; }); } /// /// 通过设备找到区域(房间)名称 /// /// Btnregionname. /// Device. public static void RoomNmae(Button btnregionname, CommonDevice device) { var room = new Common.Room(); var roomlistname = room.GetRoomListNameByDevice(device); if (roomlistname.Count == 0) { btnregionname.Text = Language.StringByID(R.MyInternationalizationString.customroom); } else { foreach (var roomname in roomlistname) { btnregionname.Text += roomname + ","; } btnregionname.Text = btnregionname.Text.TrimEnd(','); } } } }