| | |
| | | public List<CommonDevice> DeviceList = new List<CommonDevice>(); |
| | | |
| | | /// <summary> |
| | | /// 所有网关中的设备列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public List<CommonDevice> AllGatewayDeviceList = new List<CommonDevice>(); |
| | | |
| | | /// <summary> |
| | | /// 网关中场景列表 |
| | | /// 一个场景中包含所有信息,包括场景设备信息 |
| | | /// </summary> |
| | |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | 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 List<HDLbutton> HdlButtonList = new List<HDLbutton>(); |
| | | |
| | | //网关中新的设备列表 |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public List<CommonDevice> ListNewDeviceInfoData = new List<CommonDevice>(); |
| | | |
| | | /// <summary> |
| | | /// 私有按键信息列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public System.Collections.Generic.Dictionary<string, HDLbutton> hdlButtonInfoList = new Dictionary<string, HDLbutton>(); |
| | | |
| | | /// <summary> |
| | | /// 传感器信息列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public System.Collections.Generic.Dictionary<string, Scene.TaskListInfo> sceneTaskInfoList = new Dictionary<string, Scene.TaskListInfo>(); |
| | | |
| | | #region action variable |
| | | /// <summary> |
| | |
| | | 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 (localMqttClient.Options == null)
|
| | | {
|
| | | var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder().WithClientId(currentGuid.ToString())
|
| | | .WithTcpServer(brokerName, 1883)
|
| | | .WithKeepAlivePeriod(TimeSpan.FromSeconds(20))
|
| | | .WithCleanSession()
|
| | | //.WithCommunicationTimeout(TimeSpan.FromSeconds(10))
|
| | | .WithCredentials("", "")
|
| | | .Build();
|
| | | await localMqttClient.ConnectAsync(options, CancellationToken.None);
|
| | | var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder()//MQTT连接参数填充
|
| | | .WithClientId(currentGuid.ToString())//客户端ID
|
| | | .WithTcpServer(brokerName, 1883)//TCP服务端 1883 ,即MQTT服务端
|
| | | .WithCredentials("", "")//"", "")//凭证 帐号 密码
|
| | | .WithCommunicationTimeout(new TimeSpan(0, 0, 60)) //重连超时时间,默认5s
|
| | | .WithKeepAlivePeriod(new TimeSpan(0, 0, 15)) //保持连接时间,默认5s,心跳包
|
| | | .Build();//
|
| | | await localMqttClient.ConnectAsync(options);
|
| | | }
|
| | | else
|
| | | {
|
| | |
| | | if (RemoteMqttClient.ApplicationMessageReceivedHandler == null) |
| | | { |
| | | RemoteMqttClient.UseApplicationMessageReceivedHandler((e) => |
| | | { |
| | | if (!RemoteMqttClient.IsConnected || !IsRemote) |
| | | { |
| | | 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"//分享删除
|
| | | || e.ApplicationMessage.Topic == "/ZigbeeGateWayToClient/" + Config.Instance.Guid + "/Push/Update"//成员权限变更
|
| | | || e.ApplicationMessage.Topic == "/ZigbeeGateWayToClient/" + Config.Instance.Home.Id + "_" + Config.Instance.Guid + "/PrimaryUserDelYou")//子账号被删除
|
| | | {
|
| | | 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);
|
| | | }
|
| | | mqttRemoteClient_MqttMsgPublishReceived(e);
|
| | | return;
|
| | | }
|
| | | if (!RemoteMqttClient.IsConnected || !IsRemote)
|
| | | {
|
| | | return;
|
| | | } |
| | | mqttRemoteClient_MqttMsgPublishReceived(e); |
| | |
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/Deleted");
|
| | | //订阅一个分享数据已经变更的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/DeletedShareData");
|
| | | //订阅一个子账号被删除的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + Config.Instance.Home.Id + "_" + myGuid + "/PrimaryUserDelYou");
|
| | | //订阅一个成员权限已经变更的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/Update");
|
| | | }
|
| | | //订阅一个挤下线的主题
|
| | | await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + Config.Instance.ConnEmqClientId + "/Push/NotifySqueeze");
|
| | |
| | | AllowRemoteCtrl = false;
|
| | | return;
|
| | | } |
| | | //虽然不知道对挤下线那一块有没有用,不过先这么弄 |
| | | await System.Threading.Tasks.Task.Delay(1500); |
| | | |
| | | var responseData = jobject["ResponseData"]; |
| | | if (responseData != null) |
| | | { |
| | |
| | | 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 模式安防动作被最终激活时发送报警信息 |