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(',');
}
}
}
}