Esempio n. 1
0
        public static byte[] ConvertToMqtt(MqttSession session, EventMessage message)
        {
            if (message.Protocol == ProtocolType.MQTT)
            {
                return(MqttConversion(session, message.Message));
            }

            if (message.Protocol == ProtocolType.COAP)
            {
                CoapMessage msg  = CoapMessage.DecodeMessage(message.Message);
                CoapUri     curi = new CoapUri(msg.ResourceUri.ToString());
                QualityOfServiceLevelType qos = QualityOfServiceLevelType.AtLeastOnce;

                QualityOfServiceLevelType?qosType = session.GetQoS(curi.Resource);
                qos = qosType ?? QualityOfServiceLevelType.AtLeastOnce;

                PublishMessage pub = new PublishMessage(false, qos, false, session.NewId(), curi.Resource, msg.Payload);
                return(pub.Encode());
            }

            if (message.Protocol == ProtocolType.REST)
            {
                PublishMessage pubm = new PublishMessage(false, session.GetQoS(message.ResourceUri).Value, false,
                                                         session.NewId(), message.ResourceUri, message.Message);
                return(pubm.Encode());
            }

            return(MqttConversion(session, message.Message));
        }
Esempio n. 2
0
        public async Task PublishAsync(string topic, QualityOfServiceLevelType qos, bool retain, bool dup, byte[] data)
        {
            ushort         id  = session.NewId();
            PublishMessage msg = new PublishMessage(dup, qos, retain, id, topic, data);

            if (qos != QualityOfServiceLevelType.AtMostOnce)
            {
                session.Quarantine(msg, DirectionType.In);
            }

            await channel.SendAsync(msg.Encode());
        }
Esempio n. 3
0
        /// <summary>
        /// MQTT publish to a topic.
        /// </summary>
        /// <param name="qos"></param>
        /// <param name="topicUriString"></param>
        /// <param name="contentType"></param>
        /// <param name="data"></param>
        /// <param name="indexes"></param>
        /// <param name="messageId"></param>
        /// <returns></returns>
        public async Task PublishAsync(QualityOfServiceLevelType qos, string topicUriString, string contentType, byte[] data, string cacheKey = null, IEnumerable <KeyValuePair <string, string> > indexes = null, string messageId = null)
        {
            try
            {
                string indexString = GetIndexString(indexes);

                UriBuilder builder     = new UriBuilder(topicUriString);
                string     queryString = messageId == null?String.Format("{0}={1}", SkunkLab.Protocols.Utilities.QueryStringConstants.CONTENT_TYPE, contentType) : String.Format("{0}={1}&{2}={3}", QueryStringConstants.CONTENT_TYPE, contentType, QueryStringConstants.MESSAGE_ID, messageId);

                if (!string.IsNullOrEmpty(cacheKey))
                {
                    queryString = queryString + String.Format("&{0}={1}", QueryStringConstants.CACHE_KEY, cacheKey);
                }

                if (!string.IsNullOrEmpty(indexString))
                {
                    queryString = queryString + "&" + indexString;
                }


                builder.Query = queryString;

                PublishMessage msg = new PublishMessage(false, qos, false, 0, builder.ToString().ToLowerInvariant(), data);
                if (qos != QualityOfServiceLevelType.AtMostOnce)
                {
                    msg.MessageId = session.NewId();
                    session.Quarantine(msg, DirectionType.Out);
                }

                queue.Enqueue(msg.Encode());

                while (queue.Count > 0)
                {
                    byte[] message = queue.Dequeue();

                    //if (channel.RequireBlocking)
                    //{
                    //    //Task t = channel.SendAsync(message);
                    //    //Task.WaitAll(t);
                    //}
                    //else
                    //{
                    await channel.SendAsync(message);

                    //}
                }
            }
            catch (Exception ex)
            {
                OnChannelError?.Invoke(this, new ChannelErrorEventArgs(channel.Id, ex));
            }
        }
Esempio n. 4
0
        private static byte[] MqttConversion(MqttSession session, byte[] message)
        {
            PublishMessage            msg = MqttMessage.DecodeMessage(message) as PublishMessage;
            MqttUri                   uri = new MqttUri(msg.Topic);
            QualityOfServiceLevelType?qos = session.GetQoS(uri.Resource);

            PublishMessage pm = new PublishMessage(false, qos ?? QualityOfServiceLevelType.AtMostOnce, false,
                                                   session.NewId(), uri.Resource, msg.Payload);

            if (pm.QualityOfService != QualityOfServiceLevelType.AtMostOnce)
            {
                session.Quarantine(pm, DirectionType.Out);
            }

            return(pm.Encode());
        }
Esempio n. 5
0
        public static byte[] ConvertToMqtt(MqttSession session, EventMessage message)
        {
            if (message.Protocol == ProtocolType.MQTT)
            {
                return(MqttConversion(session, message.Message));
            }
            else if (message.Protocol == ProtocolType.COAP)
            {
                CoapMessage msg  = CoapMessage.DecodeMessage(message.Message);
                CoapUri     curi = new CoapUri(msg.ResourceUri.ToString());
                QualityOfServiceLevelType qos = QualityOfServiceLevelType.AtLeastOnce;

                try
                {
                    QualityOfServiceLevelType?qosType = session.GetQoS(curi.Resource);
                    qos = qosType.HasValue ? qosType.Value : QualityOfServiceLevelType.AtLeastOnce;
                }
                catch (Exception ex)
                {
                    Trace.TraceWarning("{0} - Fault in ProtocolTransition.ConvertToMqtt", DateTime.UtcNow.ToString());
                    Trace.TraceError("{0} - {1} - {2}", DateTime.UtcNow.ToString(""), "ProtocolTransition", ex.Message);
                }

                PublishMessage pub = new PublishMessage(false, qos, false, session.NewId(), curi.Resource, msg.Payload);
                return(pub.Encode());
            }
            else if (message.Protocol == ProtocolType.REST)
            {
                PublishMessage pubm = new PublishMessage(false, session.GetQoS(message.ResourceUri).Value, false, session.NewId(), message.ResourceUri, message.Message);
                return(pubm.Encode());
            }
            else
            {
                return(MqttConversion(session, message.Message, message.ContentType));
            }
        }
Esempio n. 6
0
        private static byte[] MqttConversion(MqttSession session, byte[] message, string contentType = null)
        {
            PublishMessage            msg = MqttMessage.DecodeMessage(message) as PublishMessage;
            MqttUri                   uri = new MqttUri(msg.Topic);
            QualityOfServiceLevelType?qos = session.GetQoS(uri.Resource);

            PublishMessage pm = new PublishMessage(false, qos.HasValue ? qos.Value : QualityOfServiceLevelType.AtMostOnce, false, session.NewId(), uri.Resource, msg.Payload);

            if (pm.QualityOfService != QualityOfServiceLevelType.AtMostOnce)
            {
                session.Quarantine(pm, SkunkLab.Protocols.Mqtt.Handlers.DirectionType.Out);
            }

            return(pm.Encode());
        }