using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json.Linq;
namespace ZigBee.Device
{
[System.Serializable]
public class Scene
{
///
/// 当前主网关的ID
///
public string GateWayId;
///
/// 网关返回场景的命令标识
///
public int DataID;
///
/// 网关反馈的时间戳
///
public int Time;
///
/// 当前场景的ID
///
[System.Serializable]
public class SceneBase
{
///
/// 场景的I
///
public int SceneId;
}
///
/// 等待从网关接收数据的时间
///
/// The wait receive data time.
public static int WaitReceiveDataTime
{
get
{
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
return 3000;
}
else if (mainGateway.IsVirtual)
{
return 6000;
}
else
{
return 3000;
}
}
}
///
/// 网关信息错误反馈的内容
///
static string ErrorMess(int err)
{
string message = "";
switch (err)
{
case 1:
message = " 网关无法解析命令数据。";
break;
case 2:
message = " 协调器正在升级或备份 / 恢复数据。";
break;
case 3:
message = "操作设备 / 组 / 场景不存在";
break;
case 4:
message = " 其他错误";
break;
case 5:
message = " 数据传输错误(在某次客户端向网关发送数据的过程中,网关在合理时间范围内接收客户端数据不完整导致该错误发生。如客户端向网关一次发送100个字节的数据,但网关等待接收了一秒只接收了80个字节。发生该错误,网关将主动关闭客户端连接)";
break;
default:
break;
}
return message;
}
#region 在从网关中发场景的命令的反馈
///
///在从网关中发场景的命令的反馈
///
public SceneErrorRespon sceneErrorRespon;
///
///在从网关中发场景的命令的反馈
///
[System.Serializable]
public class SceneErrorRespon
{
///
/// 非主网关不能使用场景指令。
///
public int Data_ID;
}
#endregion
#region 创建一个空场景
///
/// 创建一个空场景.(仅用于主网关接口)
/// sceneName:取该场景的名字
///
public static async System.Threading.Tasks.Task GetSceneNewIdAsync(string sceneName)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
GetSceneIdAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new GetSceneIdAllData {errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new GetSceneIdAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new GetSceneIdAllData { errorResponData = temp , errorMessageBase = ErrorMess(temp.Error)};
}
}
if (topic == gatewayID + "/" + "Scene/GetNewId_Respon")
{
var getSceneIdData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (getSceneIdData == null)
{
d = new GetSceneIdAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
GetSceneAllInfoAsync();
d = new GetSceneIdAllData { getSceneIdData = getSceneIdData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/GetNewId_Actions 启动" + System.DateTime.Now.ToString());
try{
var bytes = new byte[32];
var reamarkGwBytes = System.Text.Encoding.UTF8.GetBytes(sceneName);
System.Array.Copy(reamarkGwBytes, 0, bytes, 0, 32 < reamarkGwBytes.Length ? 32 : reamarkGwBytes.Length);
sceneName = System.Text.Encoding.UTF8.GetString(bytes);
var jObject = new Newtonsoft.Json.Linq.JObject() {
{ "Cluster_ID", 0 },
{ "Command", 800 }
};
var data = new JObject { { "ScenesName", sceneName } };
jObject.Add("Data", data);
mainGateway.Send("Scene/GetNewId", jObject.ToString());
}
catch
{ }
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new GetSceneIdAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/GetNewId_Actions 退出" + System.DateTime.Now.ToString());
return d;
});
}
///
/// 创建一个空场景返回的数据,网关反馈信息
///
public GetSceneIdAllData getSceneIdAllData;
///
/// 创建一个空场景返回的数据,网关反馈信息
///
[System.Serializable]
public class GetSceneIdAllData:CommonDevice.ErrorResponCommon
{
///
/// 创建一个空场景返回的数据
///
public GetSceneIdData getSceneIdData;
}
///
/// 创建一个空场景返回的数据
///
public GetSceneIdData getSceneIdData;
///
/// 创建一个空场景返回的数据
///
[System.Serializable]
public class GetSceneIdData
{
///
/// 新的场景id
///
public int NewScenesId;
///
/// 场景名称 ,不大于32个字节。
///
public string ScenesName;
}
#endregion
#region 获取一个场景的所有信息
///
///获取一个场景的所有信息 .
///
public static async System.Threading.Tasks.Task GetSceneAllInfoAsync()
{
return await System.Threading.Tasks.Task.Run(async () => {
GetSceneAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new GetSceneAllData { errorMessageBase = "当前没有主网关" };
return d;
}
var dateTime = DateTime.Now;
Action action = (topic, message) => {
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new GetSceneAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new GetSceneAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error)};
}
}
if (topic == gatewayID + "/" + "Scene/GetAllInfo_Respon")
{
dateTime = DateTime.Now;
var sceneGetAllInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (sceneGetAllInfo == null)
{
d = new GetSceneAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new GetSceneAllData { getSceneAllInfo = sceneGetAllInfo };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/GetAllInfo_Actions 启动" + System.DateTime.Now.ToString());
try{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 807 } };
mainGateway.Send(("Scene/GetAllInfo"), jObject.ToString());
}
catch {}
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(100);
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/GetAllInfo_Actions 退出" + System.DateTime.Now.ToString());
return d;
});
}
///
/// 获取所有场景的所有信息,网关反馈信息
///
public GetSceneAllData getSceneAllData;
///
/// 获取所有场景的所有信息,网关反馈信息
///
[System.Serializable]
public class GetSceneAllData:CommonDevice.ErrorResponCommon
{
///
/// 获取所有场景的所有信息
///
public GetSceneAllInfo getSceneAllInfo;
}
///
/// 获取所有场景的所有信息
///
public GetSceneAllInfo sceneGetAllInfo;
///
/// 获取所有场景的所有信息
///
[System.Serializable]
public class GetSceneAllInfo
{
///
///场景总数
///
public int ScenesSum;
///
///表示当前发送的是第几个场景信息。ScenesNum从0开始,每发送一个场景信息将自加1,当ScenesNum等于ScenesSum时,表示所有信息发送完毕。
///
public int ScenesNum;
///
/// 场景ID
///
public int ScenesId;
///
/// 场景是否处于开启状态
/// 0:场景没有开启
///1:场景处于开启状态
///
public int IsOpen;
///
/// 场景名称
///
public string ScenesName;
///
/// 当前场景的设备数量
///
public int DeviceSum;
///
/// 场景列表
///
public List DeviceList = new List();
}
///
/// 场景列表数据
///
[System.Serializable]
public class DeviceListData
{
///
/// 成员类型
///0:设备成员
///1:场景成员
///2:延时成员
///
public int Type;
///
/// 设备mac地址 ,
///当Type=0时存在。
///
public string DeviceAddr;
///
/// 设备端口号
///当Type=0时存在。
///
public int Epoint;
///
/// 设备列表
/// 当Type=0时存在
///
public List TaskList = new List();
///
/// 场景成员的场景id
/// 当Type=1时存在
///
public int ElseScenesId;
///
///延时执行时间,单位秒。
///
public int DelayTime;
///
/// 场景动作序号,表示第几个动作
///
public int MemberNumber;
}
#endregion
#region 只能获取场景信息,没有场景中的设备信息
///
/// 只能获取场景信息,没有场景中的设备信息
///
///
//static async System.Threading.Tasks.Task GetSceneInfoAsync()
//{
//if (ZbGateway.MainGateWay == null)
//{
// return null;
//}
//return await System.Threading.Tasks.Task.Run(async () =>
//{
//var d = new GetOnlySceneAllData { };
//Action 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("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = ZbGateway.MainGateWay.GwId };
// var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
// if (temp == null)
// {
// d.errorMessageBase = "网关错误回复,且数据是空";
// }
// else
// {
// d.errorResponData = temp;
// d.errorMessageBase = ErrorMess(temp.Error);
// }
//}
//if (topic == gatewayID + "/" + "Scene/GetInfo_Respon")
//{
//var scene = new Scene() { DataID = jobject.Value("Data_ID"), GateWayId = ZbGateway.MainGateWay?.CurrentGateWayId };
//scene.sceneGetInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
//if (scene.sceneGetInfo == null)
//{
// d.errorMessageBase = "网关返回的数据为空";
//}
//else
//{
//if (ZbGateway.MainGateWay?.SceneList.Count == 0)
//{
// ZbGateway.MainGateWay.SceneList.Add(scene.sceneGetInfo);
//}
//else
//{
// foreach (var a in ZbGateway.MainGateWay.SceneList)
// {
// a.ScenesList = scene.sceneGetInfo.ScenesList;
// }
//}
//d.getSceneInfo = scene.sceneGetInfo;
// }
// }
//};
//ZbGateway.MainGateWay.Actions += action;
//System.Console.WriteLine("Scene/GetInfo_Actions 启动" + System.DateTime.Now.ToString());
//var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 805 } };
//ZbGateway.MainGateWay?.Send(("Scene/GetInfo"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
//var dateTime = DateTime.Now;
//while ((DateTime.Now - dateTime).TotalMilliseconds < 1000)
//{
// await System.Threading.Tasks.Task.Delay(10);
// if (d.getSceneInfo != null)
// {
// break;
// }
//}
//if ((DateTime.Now - dateTime).TotalMilliseconds > 10000)
//{
// d.errorMessageBase = " 回复超时,请重新操作";
//}
//ZbGateway.MainGateWay.Actions -= action;
//System.Console.WriteLine("Scene/GetInfo_Actions 退出" + System.DateTime.Now.ToString());
//return d;
//});
// }
///
///获取场景信息,网关反馈信息
///
[System.Serializable]
class GetOnlySceneAllData:CommonDevice.ErrorResponCommon
{
///
/// 获取场景信息
///
public GetSceneInfo getSceneInfo;
}
///
/// 获取场景信息
///
public GetSceneInfo sceneGetInfo;
///
/// 获取场景信息
///
[System.Serializable]
public class GetSceneInfo
{
///
///场景总数
///
public int ScenesSum;
///
/// 场景列表
///
public List ScenesList = new List();
}
///
/// 场景列表中的具体信息
///
[System.Serializable]
public class ScenesListInfo:CommonDevice
{
///
/// 场景ID
///
public int ScenesId;
///
/// 名称
///
public string ScenesName;
///
/// 是否处于开启状态
///0:场景没有被开启
///1:场景处于开启状态
///
public int IsOpen;
}
#endregion
#region 获取当前场景中的设备列表信息
///
///获取当前场景中的设备列表信息
///
public static async System.Threading.Tasks.Task GetSceneDeviceListAsync(int scenesId)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
GetSceneDeviceListAllInfo d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new GetSceneDeviceListAllInfo { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new GetSceneDeviceListAllInfo { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new GetSceneDeviceListAllInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/GetDeviceList_Respon")
{
var sceneGetDeviceListObj = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (sceneGetDeviceListObj == null)
{
d = new GetSceneDeviceListAllInfo { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new GetSceneDeviceListAllInfo { getSceneDeviceListInfo = sceneGetDeviceListObj };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/GetDeviceList_Actions 启动" + System.DateTime.Now.ToString());
try
{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 806 } };
var data = new JObject { { "ScenesId", scenesId } };
jObject.Add("Data", data);
mainGateway.Send(("Scene/GetDeviceList"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}
catch { }
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new GetSceneDeviceListAllInfo { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/GetDeviceList_Actions退出" + System.DateTime.Now.ToString());
return d;
});
}
///
///获取场景的设备列表信息,网关反馈信息
///
public GetSceneDeviceListAllInfo getSceneDeviceListAllInfo;
///
///获取场景的设备列表信息,网关反馈信息
///
[System.Serializable]
public class GetSceneDeviceListAllInfo : CommonDevice.ErrorResponCommon
{
///
/// 获取场景的设备列表信息
///
public GetSceneDeviceListInfo getSceneDeviceListInfo;
}
///
/// 获取场景的设备列表信息
///
public GetSceneDeviceListInfo sceneGetDeviceListObj;
///
/// 获取场景的设备列表信息
///
[System.Serializable]
public class GetSceneDeviceListInfo
{
///
///场景ID
///
public int ScenesId;
///
///场景是否处于开启状态
///0:场景没有开启
///1:场景处于开启状态
///
public int IsOpen;
///
///场景的设备数量
///
public int DeviceSum;
///
/// 设备列表
///
public List DeviceList = new List();
}
#endregion
#region 场景中添加的成员
///
/// 添加目标到网关到场景中。
/// 返回结果Result 1 加入成功
/// 返回结果Result 0 加入失败
///
/// The scene member.
/// Scenes identifier.
public static async System.Threading.Tasks.Task AddSceneMemberAsync(AddSceneMemberData sceneMemberData)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
AddSceneMemberResponseAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new AddSceneMemberResponseAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new AddSceneMemberResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new AddSceneMemberResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/AddMember_Respon")
{
var addSceneMemberData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (addSceneMemberData == null)
{
d = new AddSceneMemberResponseAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new AddSceneMemberResponseAllData { addSceneMemberResponseData = addSceneMemberData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/AddMember_Actions 启动" + System.DateTime.Now.ToString());
try{
if (sceneMemberData != null)
{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 820 } };
var data = new JObject { };
if (sceneMemberData.Type == 0)
{
var taskList = new JArray { };
foreach (var taskInfo in sceneMemberData.TaskList)
{
var tInfo = new JObject{
{ "TaskType", taskInfo.TaskType},
{ "Data1", taskInfo.Data1},
{ "Data2",taskInfo.Data2}
};
taskList.Add(tInfo);
}
data = new JObject {
{ "ScenesId",sceneMemberData.ScenesId},
{ "Type", sceneMemberData.Type} ,
{ "DeviceAddr",sceneMemberData.DeviceAddr} ,
{ "Epoint", sceneMemberData.Epoint} ,
{ "TaskList", taskList },
{ "DelayTime", sceneMemberData.DelayTime} ,
{ "MemberNumber",sceneMemberData.MemberNumber},
};
}
else if (sceneMemberData.Type == 1)
{
data = new JObject {
{ "ScenesId",sceneMemberData.ScenesId},
{ "Type", sceneMemberData.Type} ,
{ "ElseScenesId", sceneMemberData.ElseScenesId },
{ "DelayTime", sceneMemberData.DelayTime} ,
{ "MemberNumber",sceneMemberData.MemberNumber},
};
}
else if (sceneMemberData.Type == 2)
{
data = new JObject {
{ "Type", sceneMemberData.Type} ,
{ "ScenesId",sceneMemberData.ScenesId},
{ "DelayTime", sceneMemberData.DelayTime} ,
{ "MemberNumber",sceneMemberData.MemberNumber},
};
}
jObject.Add("Data", data);
mainGateway.Send(("Scene/AddMember"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}
}
catch{}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new AddSceneMemberResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/AddMember_Actions 退出" + System.DateTime.Now.ToString());
return d;
});
}
///
/// 获取场景中添加的成员,网关反馈信息
///
public AddSceneMemberResponseAllData addSceneMemberResponseAllData;
///
/// 获取场景中添加的成员,网关反馈信息
///
[System.Serializable]
public class AddSceneMemberResponseAllData : CommonDevice.ErrorResponCommon
{
///
/// 获取场景中添加的成员
///
public AddSceneMemberResponseData addSceneMemberResponseData;
}
///
/// 获取场景中添加的成员
///
public AddSceneMemberResponseData addSceneMemberData;
///
/// 获取添加成员到场景或更新场景
///
[System.Serializable]
public class AddSceneMemberResponseData
{
///
/// 1 加入成功
/// 0 加入失败
///
public int Result;
///
/// 场景ID
///
public int ScenesId;
///
/// 延时执行时间,单位秒
///
public int DelayTime;
///
/// 0:加入成员为节点设备
/// 1:加入成员为其他场景
///
public int Type;
///
/// 其他场景id
/// 当Type=1时,该字段存在
///
public int ElseScenesId;
///
/// 设备mac地址
///
public string DeviceAddr;
///
/// 设备端口号
///
public int Epoint;
///
/// 设备名称 ,当Type=0时,该字段存在
///
public string DeviceName;
}
///
/// 添加成员到场景或更新场景
///
public AddSceneMemberData setAddMember;
///
/// 添加成员到场景或更新场景
///
[System.Serializable]
public class AddSceneMemberData
{
///
/// 场景ID
/// 0:新增场景,网关将自动为该场景分配一个未被使用的场景id。
/// 其他:设备要加入的场景。如果场景id不存在,则网关新建一个场景并用该字段值作为场景id。
///
public int ScenesId;
///
/// 添加成员类型
///0:节点设备
///1:其他场景
///2:延时类型
///
public int Type;
///
/// 延时执行时间,单位秒
/// 当Type=2时存在
///
public int DelayTime;
///
/// 延时执行序号,表示延时索引
///当Type=2时存在
///
public int MemberNumber;
///
/// 作为成员的其他场景id。
///当Type=1时,该字段才存在。
///
public int ElseScenesId;
///
/// 设备mac地址
/// Type=0时存在
///
public string DeviceAddr;
///
/// 设备端口号
/// Type=0时存在
///
public int Epoint;
///
/// 设备列表
/// Type=0时存在
///
public List TaskList = new List();
}
#endregion
#region 从网关的场景中移除设备
///
/// 从网关的场景中移除设备.
/// 返回结果Result/RemoveResult 1:移除失败,成员不存在场景中
/// 返回结果Result/RemoveResult 0:移除成功败
///
/// The scene member.
/// Scenes identifier.
public static async System.Threading.Tasks.Task RemoveSceneMemberAsync(SceneRemoveMemberData sceneRemoveMemberData)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
RemoveSceneMemberResponseAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new RemoveSceneMemberResponseAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new RemoveSceneMemberResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new RemoveSceneMemberResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/RemoveMember_Respon")
{
var removeSceneMemberResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (removeSceneMemberResponseData == null)
{
d = new RemoveSceneMemberResponseAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new RemoveSceneMemberResponseAllData { removeSceneMemberResponseData = removeSceneMemberResponseData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/RemoveMember_Actions 启动" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
try{
if (sceneRemoveMemberData != null)
{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 802 } };
var deviceList = new JArray { };
foreach (var deviceInfo in sceneRemoveMemberData.DeviceList)
{
if (deviceInfo.Type == 0)
{
var dInfo = new JObject{
{ "Type", deviceInfo.Type},
{ "DeviceAddr",deviceInfo.DeviceAddr},
{ "Epoint",deviceInfo.Epoint},
{ "DelayTime", deviceInfo.DelayTime} ,
{ "MemberNumber",deviceInfo.MemberNumber},
};
deviceList.Add(dInfo);
}
else if (deviceInfo.Type == 1)
{
var dInfo = new JObject{
{ "Type", deviceInfo.Type},
{ "ElseScenesId",deviceInfo.ElseScenesId},
{ "DelayTime", deviceInfo.DelayTime} ,
{ "MemberNumber",deviceInfo.MemberNumber},
};
deviceList.Add(dInfo);
}
else if (deviceInfo.Type == 2)
{
var dInfo = new JObject{
{ "Type", deviceInfo.Type},
{ "DelayTime", deviceInfo.DelayTime} ,
{ "MemberNumber",deviceInfo.MemberNumber},
};
deviceList.Add(dInfo);
}
}
var data = new JObject {
{"ScenesId",sceneRemoveMemberData.ScenesId},
{ "DeviceList", deviceList }
};
jObject.Add("Data", data);
mainGateway.Send(("Scene/RemoveMember"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}
}
catch{}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new RemoveSceneMemberResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/RemoveMember_Actions 退出" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
return d;
});
}
///
/// 从场景中移除成员
///
public SceneRemoveMemberData sceneRemoveMemberData;
///
/// 从场景中移除成员
///
[System.Serializable]
public class SceneRemoveMemberData
{
///
/// 场景ID
///
public int ScenesId;
///
/// 设备列表 ,要移除的设备
///
public List DeviceList = new List();
}
///
/// 移除场景成员信息
///
[System.Serializable]
public class RemoveSceneDeviceListInfo
{
///
/// 移除成员类型
///0:设备成员
///1:场景成员
///2:延时类型
///
public int Type;
///
/// 设备mac地址
/// 当Type=0时存在
///
public string DeviceAddr;
///
/// 设备端口号
/// 当Type=0时存在
///
public int Epoint;
///
/// 场景成员id
/// 当Type=1时存在
///
public int ElseScenesId;
///
/// 延时执行时间,单位秒
/// 当Type=2时存在
///
public int DelayTime;
///
/// 延时执行序号,表示延时索引
///当Type=2时存在
///
public int MemberNumber;
}
///
/// 移除场景成员信息反馈,网关反馈信息
///
public RemoveSceneMemberResponseAllData removeSceneMemberResponseAllData;
///
/// 移除场景成员信息反馈,网关反馈信息
///
[System.Serializable]
public class RemoveSceneMemberResponseAllData : CommonDevice.ErrorResponCommon
{
///
/// 移除场景成员信息反馈
///
public RemoveSceneMemberResponseData removeSceneMemberResponseData;
}
///
/// 移除场景成员信息反馈
///
public RemoveSceneMemberResponseData removeSceneMemberResponseData;
///
/// 移除场景成员信息反馈
///
[System.Serializable]
public class RemoveSceneMemberResponseData
{
///
/// 0 移除成功
///1 场景ID不存在
///
public int Result = 2;
///
/// 场景ID
///
public int ScenesId;
///
/// 移除设备列表 ,Result=0时存在。
///
public List RemoveList = new List();
}
///
/// 移除场景成员信息
///
[System.Serializable]
public class RemoveSceneDeviceListResponseInfo
{
///
/// 0:移除成功
///1:移除失败,成员不存在场景中
///
public int RemoveResult = 999;
///
/// 移除成员类型
///0:设备成员
///1:其他场景
///
public int Type;
///
/// 设备mac地址
/// 当Type=0时存在
///
public string DeviceAddr;
///
/// 设备端口号 当Type=0时存在
///
public int Epoint;
///
/// 场景成员id,当Type=1时存在
///
public int ElseScenesId;
}
#endregion
#region 修改场景名称
///
/// 修改场景名称.
///
public static async System.Threading.Tasks.Task RenameSceneAsync(int scenesId, string scenesName)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
SceneRenameResponseAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new SceneRenameResponseAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new SceneRenameResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new SceneRenameResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/Rename_Respon")
{
var sceneRenameResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (sceneRenameResponseData == null)
{
d = new SceneRenameResponseAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new SceneRenameResponseAllData { sceneRenameResponseData = sceneRenameResponseData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/Rename_Actions 启动" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
try{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 804 } };
var data = new JObject { { "ScenesId", scenesId }, { "ScenesName", scenesName } };
jObject.Add("Data", data);
mainGateway.Send(("Scene/Rename"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}
catch {}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new SceneRenameResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/Rename_Actions 退出" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
return d;
});
}
///
/// 修改场景名称,网关反馈信息
///
public SceneRenameResponseAllData sceneRenameResponseAllData;
///
/// 修改场景名称
///
[System.Serializable]
public class SceneRenameResponseAllData : CommonDevice.ErrorResponCommon
{
///
/// 修改场景名称
///
public SceneRenameResponseData sceneRenameResponseData;
}
///
/// 修改场景名称
///
public SceneRenameResponseData sceneRenameResponseData;
///
/// 修改场景名称
///
[System.Serializable]
public class SceneRenameResponseData
{
///
///结果
///0 修改失败
///1 修改成功
///2 没有在该场景
///
public int Result=999;
///
/// 场景ID
///
public int ScenesId;
///
/// 场景名称
///
public string ScenesName;
}
#endregion
#region 删除场景
///
/// 删除场景
/// 返回结果 0 移除失败
///返回结果 1 移除成功
///返回结果 2 没有该场景
///
public static async System.Threading.Tasks.Task DeleteSceneAsync(int scenesId)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
RemoveSceneAllData d =null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new RemoveSceneAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new RemoveSceneAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new RemoveSceneAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/Remove_Respon")
{
var removeSceneData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (removeSceneData == null)
{
d = new RemoveSceneAllData { errorMessageBase = "网关返回的数据为空" };
return;
}
else
{
d = new RemoveSceneAllData { removeSceneData = removeSceneData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/Remove_Actions 启动" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
try{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 803 } };
var data = new JObject { { "ScenesId", scenesId } };
jObject.Add("Data", data);
mainGateway.Send(("Scene/Remove"),jObject.ToString());
}
catch {}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new RemoveSceneAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/Remove_Actions 退出" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
return d;
});
}
///
/// 移除场景,网关反馈信息
///
public RemoveSceneAllData removeSceneAllData;
///
/// 移除场景,网关反馈信息
///
[System.Serializable]
public class RemoveSceneAllData : CommonDevice.ErrorResponCommon
{
///
/// 移除场景
///
public RemoveSceneData removeSceneData;
}
///
/// 移除场景数据
///
public RemoveSceneData removeSceneData;
///
/// 移除场景数据
///
[System.Serializable]
public class RemoveSceneData
{
///
///0 移除失败
///1 移除成功
///2 没有该场景
///
public int Result=999;
///
/// 场景ID
///
public int ScenesId;
}
#endregion
#region 调用场景
///
///调用场景
/// DelayTime:延时执行时间,单位秒
///
public static async System.Threading.Tasks.Task ControlSceneAsync(int ScenesId,int delayTime)
{
return await System.Threading.Tasks.Task.Run(async () =>
{
SceneOpenAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new SceneOpenAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new SceneOpenAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new SceneOpenAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/Open_Respon")
{
var sceneOpen = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (sceneOpen == null)
{
d = new SceneOpenAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new SceneOpenAllData { sceneOpenData = sceneOpen };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/Open_Actions 启动" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
try{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 821 } };
var data = new JObject { { "ScenesId", ScenesId }, { "DelayTime", delayTime } };
jObject.Add("Data", data);
mainGateway.Send(("Scene/Open"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}
catch {}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime )
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new SceneOpenAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/Open_Actions退出" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
return d;
});
}
///
/// 调用场景,网关反馈信息
/// 返回Result 0:调用失败
///Result 1:调用成功
///
public SceneOpenAllData sceneOpenAllData;
///
/// 调用场景,网关反馈信息
///
[System.Serializable]
public class SceneOpenAllData : CommonDevice.ErrorResponCommon
{
///
/// 调用场景
///
public SceneOpenData sceneOpenData;
}
///
/// 调用场景
///
public SceneOpenData sceneOpen;
///
/// 调用场景
///
[System.Serializable]
public class SceneOpenData
{
///
/// 场景ID
///
public int ScenesId;
///
///结果
///Result 0:调用失败
///Result 1:调用成功
///
public int Result=999;
///
/// 延时时间
///
public int DelayTime;
}
#endregion
#region 查看正在延时的场景
///
/// 查看正在延时的场景.
///
public static async System.Threading.Tasks.Task CatDelaySceneAsync()
{
return await System.Threading.Tasks.Task.Run(async () =>
{
CatDelaySceneResponseAllData d = null;
var mainGateway = ZbGateway.MainGateWay;
if (mainGateway == null)
{
d = new CatDelaySceneResponseAllData { errorMessageBase = "当前没有主网关" };
return d;
}
Action action = (topic, message) =>
{
var gatewayID = topic.Split('/')[0];
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (topic == gatewayID + "/" + "Error_Respon")
{
var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (temp == null)
{
d = new CatDelaySceneResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
}
else
{
d = new CatDelaySceneResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
}
}
if (topic == gatewayID + "/" + "Scene/CatDelayScene_Respon")
{
var catDelaySceneResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString());
if (catDelaySceneResponseData == null)
{
d = new CatDelaySceneResponseAllData { errorMessageBase = "网关返回的数据为空" };
}
else
{
d = new CatDelaySceneResponseAllData { catDelaySceneResponseData = catDelaySceneResponseData };
System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
}
}
};
mainGateway.Actions += action;
System.Console.WriteLine("Scene/CatDelayScene_Actions 启动" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
try
{
var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 811 } };
mainGateway.Send(("Scene/CatDelayScene"),System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
}catch {}
var dateTime = DateTime.Now;
while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
{
await System.Threading.Tasks.Task.Delay(10);
if (d != null)
{
break;
}
}
if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
{
d = new CatDelaySceneResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
}
mainGateway.Actions -= action;
System.Console.WriteLine("Scene/CatDelayScene_Actions 退出" + "_" + mainGateway.GwId + System.DateTime.Now.ToString());
return d;
});
}
///
/// 查看正在延时的场景信息信息反馈,网关反馈信息
///
public CatDelaySceneResponseAllData catDelaySceneResponseAllData;
///
/// 查看正在延时的场景信息反馈,网关反馈信息
///
[System.Serializable]
public class CatDelaySceneResponseAllData : CommonDevice.ErrorResponCommon
{
///
/// 查看正在延时的场景信息信息反馈
///
public CatDelaySceneResponseData catDelaySceneResponseData;
}
///
/// 查看正在延时的场景信息反馈
///
public CatDelaySceneResponseData catDelaySceneResponseData;
///
/// 查看正在延时的场景信息反馈
///
[System.Serializable]
public class CatDelaySceneResponseData
{
///
/// 正在延时执行的场景
///
public List DelayScenesList = new List();
}
///
/// 正在延时执行的场景信息
///
[System.Serializable]
public class DelayScenesListResponseInfo
{
///
/// 场景ID
///
public int ScenesId ;
///
/// 延时时间
///
public int DelayTime;
///
/// 剩余触发时间,单位秒
///
public int RemainTime;
}
#endregion
///
/// 场景被破坏反馈
///
public SceneBreak sceneBreak;
///
/// 场景被破坏反馈
///
[System.Serializable]
public class SceneBreak
{
///
/// 场景ID
///
public int ScenesId;
}
///
/// 场景动作被执行通知
///
public SceneExecRespon sceneExecRespon;
///
/// 场景动作被执行通知
///
[System.Serializable]
public class SceneExecRespon
{
///
/// 场景ID
///
public int ScenesId;
}
}
}