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; } } }