コード例 #1
0
ファイル: MqMessages.cs プロジェクト: enviriot/EnviriotSW
        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);
        }
コード例 #2
0
ファイル: MqClient.cs プロジェクト: enviriot/EnviriotSW
        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);
            }
        }
コード例 #3
0
ファイル: MqMessages.cs プロジェクト: giapdangle/X13.Host
 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;
 }
コード例 #4
0
ファイル: MqClient.cs プロジェクト: giapdangle/X13.Host
 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;
   }
 }
コード例 #5
0
ファイル: MqClient.cs プロジェクト: giapdangle/X13.Host
 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);
   }
 }
コード例 #6
0
ファイル: MqClient.cs プロジェクト: enviriot/EnviriotSW
        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);
            }
        }