public static MqMessage Parse(byte header, uint len, MemoryStream stream) { MqMessage msg = null; switch ((MessageType)((header & 0xf0) >> 4)) { case MessageType.CONNECT: msg = new MqConnect(header, len, stream); break; case MessageType.CONNACK: msg = new MqConnack(header, len, stream); break; case MessageType.DISCONNECT: msg = new MqDisconnect(header, len, stream); break; case MessageType.PINGREQ: msg = new MqPingReq(header, len, stream); break; case MessageType.PINGRESP: msg = new MqPingResp(header, len, stream); break; case MessageType.PUBLISH: msg = new MqPublish(header, len, stream); break; case MessageType.SUBSCRIBE: msg = new MqSubscribe(header, len, stream); break; case MessageType.SUBACK: msg = new MqSuback(header, len, stream); break; case MessageType.UNSUBSCRIBE: msg = new MqUnsubscribe(header, len, stream); break; case MessageType.UNSUBACK: msg = new MqUnsuback(header, len, stream); break; case MessageType.PUBACK: case MessageType.PUBCOMP: case MessageType.PUBREC: case MessageType.PUBREL: msg = new MqMsgAck(header, len, stream); break; } return(msg); }
private void ProccessPublishMsg(MqPublish pm) { string path = pm.Path; if (string.IsNullOrEmpty(path)) { path = "/"; } else if (path[0] != '/') { path = "/" + path; } foreach (var s in Sites.Where(z => path.StartsWith(z.remotePrefix))) { s.Publish(path, pm.Payload); } }
public static MqMessage Parse(byte header, uint len, MemoryStream stream) { MqMessage msg=null; switch((MessageType)((header & 0xf0) >> 4)) { case MessageType.CONNECT: msg=new MqConnect(header, len, stream); break; case MessageType.CONNACK: msg=new MqConnack(header, len, stream); break; case MessageType.DISCONNECT: msg=new MqDisconnect(header, len, stream); break; case MessageType.PINGREQ: msg=new MqPingReq(header, len, stream); break; case MessageType.PINGRESP: msg=new MqPingResp(header, len, stream); break; case MessageType.PUBLISH: msg=new MqPublish(header, len, stream); break; case MessageType.SUBSCRIBE: msg=new MqSubscribe(header, len, stream); break; case MessageType.SUBACK: msg=new MqSuback(header, len, stream); break; case MessageType.UNSUBSCRIBE: msg=new MqUnsubscribe(header, len, stream); break; case MessageType.UNSUBACK: msg=new MqUnsuback(header, len, stream); break; case MessageType.PUBACK: case MessageType.PUBCOMP: case MessageType.PUBREC: case MessageType.PUBREL: msg=new MqMsgAck(header, len, stream); break; } return msg; }
private void OwnerChanged(Topic sender, TopicChanged param) { if(!_connected || sender.parent==null || sender.path.StartsWith("/local") || sender.path.StartsWith("/var/now") || sender.path.StartsWith("/var/log") || param.Visited(_mq, false) || param.Visited(_owner, false)) { return; } switch(param.Art) { case TopicChanged.ChangeArt.Add: { MqPublish pm=new MqPublish(sender); if(sender.valueType!=null && sender.valueType!=typeof(string) && !sender.valueType.IsEnum && !sender.valueType.IsPrimitive) { pm.Payload=(new Newtonsoft.Json.Linq.JObject(new Newtonsoft.Json.Linq.JProperty("+", WOUM.ExConverter.Type2Name(sender.valueType)))).ToString(); } this.Send(pm); } break; case TopicChanged.ChangeArt.Value: { MqPublish pm=new MqPublish(sender); this.Send(pm); } break; case TopicChanged.ChangeArt.Remove: { MqPublish pm=new MqPublish(sender); pm.Payload=string.Empty; this.Send(pm); } break; } }
private void ProccessPublishMsg(MqPublish pm) { if(_stream!=null && _stream.isSndPaused && pm.Path==_mq.path) { _stream.isSndPaused=false; return; } Topic cur; if(!string.IsNullOrEmpty(pm.Payload)) { // Publish if(!Topic.root.Exist(pm.Path, out cur) || cur.valueType==null) { Type vt=X13.WOUM.ExConverter.Json2Type(pm.Payload); cur=Topic.GetP(pm.Path, vt, _owner); } cur.saved=pm.Retained; if(cur.valueType!=null) { if(cur==_now) { try { _nowOffset.value=JsonConvert.DeserializeObject<DateTime>(pm.Payload, _jcs).ToLocalTime().Ticks-DateTime.Now.Ticks; } catch(Exception) { return; } } else if(cur.parent!=_now) { cur.FromJson(pm.Payload, _owner); } } } else if(Topic.root.Exist(pm.Path, out cur)) { // Remove cur.Remove(_owner); } }
private void Received(MqMessage msg) { if (_pl.verbose) { Log.Debug("R {0} > {1}", this.Signature, msg); } switch (msg.MsgType) { case MessageType.CONNACK: { MqConnack cm = msg as MqConnack; if (cm.Response == MqConnack.MqttConnectionResponse.Accepted) { status = Status.Connected; _tOut.Change(KEEP_ALIVE, KEEP_ALIVE); Log.Info("Connected to {0}", Signature); foreach (var site in Sites) { site.Connected(); } } else { status = Status.NotAccepted; _tOut.Change(Timeout.Infinite, Timeout.Infinite); } } break; case MessageType.DISCONNECT: status = Status.Disconnected; _tOut.Change(3000, KEEP_ALIVE); break; case MessageType.PINGRESP: _waitPingResp = false; break; case MessageType.PUBLISH: { MqPublish pm = msg as MqPublish; if (msg.MessageID != 0) { if (msg.QualityOfService == QoS.AtLeastOnce) { this.Send(new MqMsgAck(MessageType.PUBACK, msg.MessageID)); } else if (msg.QualityOfService == QoS.ExactlyOnce) { this.Send(new MqMsgAck(MessageType.PUBREC, msg.MessageID)); } } ProccessPublishMsg(pm); } break; case MessageType.PUBACK: break; case MessageType.PUBREC: if (msg.MessageID != 0) { this.Send(new MqMsgAck(MessageType.PUBREL, msg.MessageID)); } break; case MessageType.PUBREL: if (msg.MessageID != 0) { this.Send(new MqMsgAck(MessageType.PUBCOMP, msg.MessageID)); } break; } if (_waitPingResp) { _tOut.Change(KEEP_ALIVE, KEEP_ALIVE); } }