using System;
|
using System.Collections.Generic;
|
using Newtonsoft.Json.Linq;
|
using ZigBee.Device;
|
using ZigBee.Common;
|
|
namespace Shared.Phone.Device.Logic
|
{
|
public class Send
|
{
|
/// <summary>
|
/// 获取LogicId的方法
|
/// </summary>
|
/// <returns>The logic identifier.</returns>
|
public static async System.Threading.Tasks.Task<List<int>> GetLogicId()
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
List<int> logicIdList = new List<int>();
|
Action<string, string> 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;
|
});
|
}
|
/// <summary>
|
/// 获取Logic的方法
|
/// </summary>
|
/// <returns>The logic identifier.</returns>
|
public static async System.Threading.Tasks.Task<Common.Logic> GetLogic(int LogicId)
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
Common.Logic logic = null;
|
Action<string, string> 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<Common.TimeAttributeObj>(Logicifon["TimeAttribute"].ToString());
|
logic.Conditions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(Logicifon["Conditions"].ToString());
|
var listactions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(Logicifon["Actions"].ToString());
|
if (listactions != null)
|
{
|
foreach (var actions in listactions)
|
{
|
Dictionary<string, object> actionsdictionary = new Dictionary<string, object>();
|
List<Dictionary<string, string>> tasklist = new List<Dictionary<string, string>>();
|
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<string, string> dictionary = new Dictionary<string, string>();
|
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;
|
});
|
}
|
///<summary>
|
/// 删除逻辑
|
/// </summary>
|
public static async System.Threading.Tasks.Task<int> DelLogic(int LogicId)
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
//Result:0成功,1失败;
|
int Result = 3;
|
Action<string, string> 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;
|
});
|
}
|
/// <summary>
|
/// 添加或修改逻辑
|
/// </summary>
|
public static async System.Threading.Tasks.Task<Common.Logic> AddModifyLogic(Common.Logic logic)
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
Common.Logic Logicifon = null;
|
Action<string, string> 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<Common.Logic>(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<Dictionary<string, string>>;
|
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;
|
});
|
}
|
/// <summary>
|
/// 单独控制自动化开关属性
|
/// </summary>
|
/// <returns></returns>
|
public static async System.Threading.Tasks.Task<int> LogicControlSwitch(Common.Logic logic)
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
int intvalue = 3;
|
Action<string, string> action = (topic, data) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
var jObjectdata = JObject.Parse(data);
|
if (jObjectdata == null)
|
{
|
return;
|
}
|
|
if (topic == $"{gatewayID}/Logic/ReviseAttribute_Respon")
|
{
|
intvalue = int.Parse(jObjectdata["Data"]["Result"].ToString());
|
}
|
};
|
var mainGateWay = ZbGateway.MainGateWay;
|
if (mainGateWay == null)
|
{
|
Console.WriteLine("没有主网关");
|
return intvalue;
|
}
|
mainGateWay.GwResDataAction += action;
|
|
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2001 } };
|
var date = new JObject();
|
jObject.Add("Data", date);
|
date.Add("LogicId", logic.LogicId);
|
date.Add("IsEnable", logic.IsEnable);
|
//date.Add("LogicName", logic.LogicName);
|
//date.Add("Relationship", logic.Relationship);
|
mainGateWay?.Send("Logic/ReviseAttribute", 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 (intvalue != 3)
|
{
|
break;
|
}
|
}
|
ZbGateway.MainGateWay.GwResDataAction -= action;
|
//});
|
return intvalue;
|
});
|
}
|
/// <summary>
|
/// 获取Logic列表的方法
|
/// </summary>
|
/// <returns>The logic identifier.</returns>
|
public static async System.Threading.Tasks.Task<List<Common.Logic>> ReadList(int sum)
|
{
|
return await System.Threading.Tasks.Task.Run(async () =>
|
{
|
|
var listLogic = new List<Common.Logic>();
|
bool @bool = false;
|
Action<string, string> action = (topic, data) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
var jObjectdata = JObject.Parse(data);
|
if (jObjectdata == null)
|
{
|
return;
|
}
|
|
if (topic == $"{gatewayID}/Logic/GetAllLogicListInfo_Respon")
|
{
|
|
var 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<Common.TimeAttributeObj>(Logicifon["TimeAttribute"].ToString());
|
logic.Conditions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(Logicifon["Conditions"].ToString());
|
List<Dictionary<string, object>> listactions = new List<Dictionary<string, object>>();
|
listactions = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(Logicifon["Actions"].ToString());
|
|
if (listactions != null)
|
{
|
foreach (var actions in listactions)
|
{
|
Dictionary<string, object> actionsdictionary = new Dictionary<string, object>();
|
List<Dictionary<string, string>> tasklist = new List<Dictionary<string, string>>();
|
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<string, string> dictionary = new Dictionary<string, string>();
|
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);
|
}
|
|
}
|
|
lock (listLogic)
|
{
|
var @null = listLogic.Find((o) => { return o.LogicId == logic.LogicId; });
|
if (@null == null)
|
{
|
listLogic.Add(logic);
|
}
|
}
|
|
}
|
if (topic == $"{gatewayID}/Logic/AllLogicNum_Respon")
|
{
|
@bool = true;
|
}
|
};
|
var mainGateWay = ZbGateway.MainGateWay;
|
if (mainGateWay == null)
|
{
|
Console.WriteLine("没有主网关");
|
return listLogic;
|
}
|
mainGateWay.GwResDataAction += action;
|
try
|
{
|
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 2015 } };
|
ZbGateway.MainGateWay?.Send("Logic/GetAllLogicListInfo", jObject.ToString());
|
}
|
catch { }
|
var dateTime = DateTime.Now;
|
while ((DateTime.Now - dateTime).TotalMilliseconds < 8 * 1000)
|
{
|
await System.Threading.Tasks.Task.Delay(100);
|
//if (sum == listLogic.Count)
|
//{
|
// break;
|
//}
|
if (@bool)
|
{
|
break;
|
}
|
}
|
ZbGateway.MainGateWay.GwResDataAction -= action;
|
return listLogic;
|
});
|
}
|
// <summary>
|
/// 通过设备找到区域(房间)名称
|
/// </summary>
|
/// <param name="btnregionname">Btnregionname.</param>
|
/// <param name="device">Device.</param>
|
public static void RoomNmae(Button btnregionname, CommonDevice device)
|
{
|
var room = new Common.Room();
|
btnregionname.Text = room.GetRoomNameByDevice(device);
|
}
|
}
|
}
|