| | |
| | | public List<Scene.GetSceneDeviceListInfo> SceneDeviceList = new List<Scene.GetSceneDeviceListInfo>(); |
| | | |
| | | /// <summary> |
| | | /// 网关中逻辑列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public static List<Logic.GetLogicInfoResponseData> LogicList = new List<Logic.GetLogicInfoResponseData>(); |
| | | |
| | | /// <summary> |
| | | /// 网关中hdl私有按键绑定列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | |
| | | public static readonly System.Collections.Generic.List<IStatus> StatusList = new System.Collections.Generic.List<IStatus>(); |
| | | |
| | | /// <summary> |
| | | /// 设备状态更新 |
| | | /// </summary> |
| | | /// <param name="commonDevice">Common device.</param> |
| | | public static void UpdateDeviceStatus(CommonDevice commonDevice) |
| | | { |
| | | if (commonDevice == null) |
| | | { |
| | | return; |
| | | } |
| | | for (int i = 0; i < StatusList.Count; i++) |
| | | { |
| | | StatusList[i].Changed(commonDevice); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设备信息变化 |
| | | /// <para>type:如果为 DeviceInComingRespon:设备新上报</para> |
| | | /// <para>type:如果为 IASInfoReport:RemoveDeviceRespon</para> |
| | |
| | | { |
| | | if (!RemoteMqttClient.IsConnected || !IsRemote) |
| | | { |
| | | return; |
| | | if (e.ApplicationMessage.Topic != "/ZigbeeGateWayToClient/" + Config.Instance.ConnEmqClientId + "/Push/NotifySqueeze")
|
| | | {
|
| | | return;
|
| | | } |
| | | }
|
| | | //如果当前使用的是内网模式
|
| | | if (IsRemote == false)
|
| | | {
|
| | | if (e.ApplicationMessage.Topic == "/ZigbeeGateWayToClient/" + Config.Instance.ConnEmqClientId + "/Push/NotifySqueeze"//踢人下线
|
| | | || e.ApplicationMessage.Topic == "/ZigbeeGateWayToClient/" + Config.Instance.Guid + "/Push/Deleted"//分享删除
|
| | | || e.ApplicationMessage.Topic == "/ZigbeeGateWayToClient/" + Config.Instance.Guid + "/Push/DeletedShareData")
|
| | | {
|
| | | mqttRemoteClient_MqttMsgPublishReceived(e);
|
| | | }
|
| | | return;
|
| | | } |
| | | mqttRemoteClient_MqttMsgPublishReceived(e); |
| | | }); |
| | |
| | | RemoteMqttClient.UseConnectedHandler(async (e) =>
|
| | | {
|
| | | DebugPrintLog($"远程连接成功");
|
| | |
|
| | | if (Config.Instance.Home.IsOthreShare == true)
|
| | | {
|
| | | //订阅一个成员被删除的主题
|
| | | string myGuid = Config.Instance.Guid;
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/Deleted");
|
| | | //订阅一个分享数据已经变更的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/DeletedShareData");
|
| | | }
|
| | | //订阅一个挤下线的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + Config.Instance.ConnEmqClientId + "/Push/NotifySqueeze");
|
| | |
|
| | | await initGateWayBaseInfomation(); |
| | | Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote);
|
| | | //没有主网关时主动读取,获取主网关信息
|
| | |
| | | ["RequestVersion"] = CommonPage.RequestVersion,
|
| | | ["RequestSource"] = 0,
|
| | | ["LoginAccessToken"] = Config.Instance.Token,
|
| | | ["RequestProtocolType"] = 0
|
| | | ["RequestProtocolType"] = 0,
|
| | | ["PlatformStr"] = "h",//这两个值如果不设置,则云端不发布主题
|
| | | ["PublishPayloadJsonStr"] = "1"
|
| | | };
|
| | | var bytes = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(jsonData));
|
| | | result = await CommonPage.Instance.DoRequestZigbeeHttpsInterface("https://global.hdlcontrol.com/HangZhouHdlCloudApi/EmqMqtt/GetConnMqttInfo", bytes, Config.Instance.Token);
|
| | |
| | | ["LoginAccessToken"] = Config.Instance.Token,
|
| | | ["RequestProtocolType"] = 0,
|
| | | ["MainUserDistributedMark"] = Config.Instance.Home.MainUserDistributedMark,
|
| | | ["HomeId"] = Config.Instance.Home.Id
|
| | | ["HomeId"] = Config.Instance.Home.Id,
|
| | | ["PlatformStr"] = "h",//这两个值如果不设置,则云端不发布主题
|
| | | ["PublishPayloadJsonStr"] = "1"
|
| | | };
|
| | | var bytes = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(jsonData));
|
| | | result = await CommonPage.Instance.DoRequestZigbeeHttpsInterface("https://global.hdlcontrol.com/HangZhouHdlCloudApi/EmqMqtt/ShareMemberConnMqttInfo", bytes, Config.Instance.Token);
|
| | |
| | | AllowRemoteCtrl = false;
|
| | | return;
|
| | | } |
| | | //虽然不知道对挤下线那一块有没有用,不过先这么弄 |
| | | await System.Threading.Tasks.Task.Delay(1500); |
| | | |
| | | var responseData = jobject["ResponseData"]; |
| | | if (responseData != null) |
| | | { |
| | |
| | | var connEmqClientId = responseData["ConnEmqClientId"]?.ToString(); |
| | | var connEmqUserName = responseData["ConnEmqUserName"]?.ToString(); |
| | | var connEmqPwd = responseData["ConnEmqPwd"]?.ToString(); |
| | | //记录起当前的客户端ID |
| | | Config.Instance.ConnEmqClientId = connEmqClientId; |
| | | |
| | | var connEmqDomainPorts = connEmqDomainPort.Replace("//", "").Split(':'); |
| | | var domain = connEmqDomainPorts[1]; |
| | |
| | | epoint = topic.Split('/')[3]; |
| | | cluID = topic.Split('/')[4]; |
| | | attrId = topic.Split('/')[5]; |
| | | } |
| | | }
|
| | |
|
| | | //全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作)
|
| | | Shared.Phone.UserCenter.HdlGatewayReceiveLogic.Current.GatewayOverallMsgReceive(gatewayID, topic, reportStatus, message); |
| | | |
| | | var gwa = GateWayList.Find(obj => obj.getGatewayBaseInfo.gwID == gatewayID); |
| | | if (gwa == null) |
| | |
| | | { |
| | | jobject = Newtonsoft.Json.Linq.JObject.Parse(message); |
| | | }
|
| | |
|
| | | //全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作)
|
| | | Shared.Phone.UserCenter.HdlGatewayReceiveLogic.Current.GatewayOverallMsgReceive(gatewayID, topic, reportStatus, jobject);
|
| | |
|
| | | #region 远程,主网关上报通知 |
| | | if (IsRemote) |
| | |
| | | DebugPrintLog("DeviceInComingRespon已经通知");
|
| | | gwa.ReportAction("DeviceInComingRespon", tempDevice.getNewDeviceInfo);
|
| | | }
|
| | | UpdateDeviceInfo(tempDevice, "DeviceInComingRespon");
|
| | | UpdateDeviceStatus(gwa); |
| | | UpdateDeviceInfo(tempDevice, "DeviceInComingRespon"); |
| | | } |
| | | #endregion |
| | | #region 设备在线状态更新反馈 |
| | |
| | | if (infoTempDevice == null)
|
| | | {
|
| | | gwa.DeviceList.Add(tempDevice);
|
| | | UpdateDeviceStatus(tempDevice);
|
| | | UpdateDeviceInfo(tempDevice, "OnlineStatusChange");
|
| | | }
|
| | | else
|
| | |
| | | infoTempDevice.DeviceInfo.IsOnline = infoTempDevice.IsOnline;
|
| | | }
|
| | | UpdateDeviceInfo(infoTempDevice, "OnlineStatusChange");
|
| | | UpdateDeviceStatus(infoTempDevice);
|
| | | } |
| | | } |
| | | #endregion |
| | |
| | | }
|
| | | else
|
| | | {
|
| | | UpdateDeviceStatus(tempDevice);
|
| | | UpdateDeviceInfo(tempDevice, "RemoveDeviceRespon");
|
| | | if (tempDevice.removeDeviceResponseData.Result == 0)
|
| | | {
|
| | |
| | | |
| | | var tempDevice = new CommonDevice { DeviceID = deviceID, DeviceAddr = deviceAddr, DeviceEpoint = tempEpoint, DataID = dataId };
|
| | | tempDevice.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.DeviceStatusReportData>(jobject["Data"].ToString());
|
| | | UpdateDeviceStatus(tempDevice);
|
| | | UpdateDeviceInfo(tempDevice, "DeviceStatusReport"); |
| | | } |
| | | #endregion |
| | |
| | | DebugPrintLog("DoorLockProgrammingEventNotificationCommand已经通知"); |
| | | gwa.ReportAction("DoorLockProgrammingEventNotificationCommand", doorLock); |
| | | } |
| | | UpdateDeviceStatus(doorLock); |
| | | UpdateDeviceInfo(doorLock, "DoorLockProgrammingEventNotificationCommand"); |
| | | break; |
| | | } |
| | |
| | | DebugPrintLog("DoorLockProgrammingEventNotificationCommand已经通知"); |
| | | gwa.ReportAction("DoorLockProgrammingEventNotificationCommand", doorLock); |
| | | } |
| | | UpdateDeviceStatus(doorLock); |
| | | UpdateDeviceInfo(doorLock, "DoorLockProgrammingEventNotificationCommand"); |
| | | break; |
| | | } |
| | |
| | | //ias.Save(); |
| | | gwa.ReportAction("IASInfoReport", ias.iASInfo); |
| | | } |
| | | |
| | | UpdateDeviceStatus(ias); |
| | | UpdateDeviceInfo(ias, "IASInfoReport"); |
| | | break; |
| | | } |
| | |
| | | #region 逻辑被调用反馈 |
| | | else if (topic == gatewayID + "/" + "Logic/Execute_Respon") |
| | | { |
| | | var logic = new Logic() { DataID = jobject.Value<int>("Data_ID"), GateWayId = gwa.getGatewayBaseInfo.gwID }; |
| | | logic.logicExecuteRespo = Newtonsoft.Json.JsonConvert.DeserializeObject<Logic.ExecuteResponse>(jobject["Data"].ToString()); |
| | | //var logic = new Logic() { DataID = jobject.Value<int>("Data_ID"), GateWayId = gwa.getGatewayBaseInfo.gwID }; |
| | | //logic.logicExecuteRespo = Newtonsoft.Json.JsonConvert.DeserializeObject<Logic.ExecuteResponse>(jobject["Data"].ToString()); |
| | | |
| | | if (logic.logicExecuteRespo == null) |
| | | { |
| | | return; |
| | | } |
| | | //上报类型通知 |
| | | if (gwa.ReportAction != null) |
| | | { |
| | | DebugPrintLog("LogicExecuteReport已经通知"); |
| | | gwa.ReportAction("LogicExecuteReport", logic.logicExecuteRespo); |
| | | } |
| | | //if (logic.logicExecuteRespo == null) |
| | | //{ |
| | | // return; |
| | | //} |
| | | ////上报类型通知 |
| | | //if (gwa.ReportAction != null) |
| | | //{ |
| | | // DebugPrintLog("LogicExecuteReport已经通知"); |
| | | // gwa.ReportAction("LogicExecuteReport", logic.logicExecuteRespo); |
| | | //} |
| | | } |
| | | #endregion |
| | | #region 时间点条件推迟执行 |
| | | else if (topic == gatewayID + "/" + "Logic/TimingWillArrive") |
| | | { |
| | | var logic = new Logic() { DataID = jobject.Value<int>("Data_ID"), GateWayId = gwa.getGatewayBaseInfo.gwID }; |
| | | logic.timingWillArriveData = Newtonsoft.Json.JsonConvert.DeserializeObject<Logic.TimingWillArriveData>(jobject["Data"].ToString()); |
| | | //var logic = new Logic() { DataID = jobject.Value<int>("Data_ID"), GateWayId = gwa.getGatewayBaseInfo.gwID }; |
| | | //logic.timingWillArriveData = Newtonsoft.Json.JsonConvert.DeserializeObject<Logic.TimingWillArriveData>(jobject["Data"].ToString()); |
| | | |
| | | if (logic.timingWillArriveData == null) |
| | | { |
| | | return; |
| | | } |
| | | //上报类型通知 |
| | | if (gwa.ReportAction != null) |
| | | { |
| | | DebugPrintLog("TimingWillArrive已经通知"); |
| | | gwa.ReportAction("TimingWillArrive", logic.timingWillArriveData); |
| | | } |
| | | //if (logic.timingWillArriveData == null) |
| | | //{ |
| | | // return; |
| | | //} |
| | | ////上报类型通知 |
| | | //if (gwa.ReportAction != null) |
| | | //{ |
| | | // DebugPrintLog("TimingWillArrive已经通知"); |
| | | // gwa.ReportAction("TimingWillArrive", logic.timingWillArriveData); |
| | | //} |
| | | } |
| | | #endregion |
| | | #region 模式安防动作被最终激活时发送报警信息 |