Beispiel #1
0
        public async Task PublishAsync(string resourceUriString, string contentType, byte[] payload, bool confirmable,
                                       Action <CodeType, string, byte[]> action)
        {
            if (!channel.IsConnected)
            {
                await ConnectAsync();
            }

            session.UpdateKeepAliveTimestamp();

            byte[] token         = CoapToken.Create().TokenBytes;
            ushort id            = session.CoapSender.NewId(token, null, action);
            string scheme        = channel.IsEncrypted ? "coaps" : "coap";
            string coapUriString = GetCoapUriString(scheme, resourceUriString);

            RequestMessageType mtype = confirmable ? RequestMessageType.Confirmable : RequestMessageType.NonConfirmable;
            CoapRequest        cr    = new CoapRequest(id, mtype, MethodType.POST, token, new Uri(coapUriString),
                                                       MediaTypeConverter.ConvertToMediaType(contentType), payload);

            queue.Enqueue(cr.Encode());

            while (queue.Count > 0)
            {
                byte[] message = queue.Dequeue();
                Task   t       = channel.SendAsync(message);
                await Task.WhenAll(t);
            }
        }
Beispiel #2
0
        private void ResponseSocketReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            var message = e.Socket.ReceiveMultipartMessage(2);

            if (message.FrameCount < 1)
            {
                logger.Error("Messages Server: Received corrupted message.");
                return;
            }

            RequestMessageType type = (RequestMessageType)BitConverter.ToInt16(message[0].Buffer, 0);
            int strategyId          = BitConverter.ToInt32(message[1].Buffer, 0);

            switch (type)
            {
            case RequestMessageType.InstrumentRequest:
                NewInstrumentContractRequested(strategyId);
                break;

            case RequestMessageType.AccountRequest:
                AccountRequest(strategyId);
                break;

            default:
                break;
            }
        }
        /// <summary>
        /// 根据请求消息类型得到一个对应的格式化器。
        /// </summary>
        /// <param name="requestMessageType">请求消息类型。</param>
        /// <returns>一个可用消息格式化器。</returns>
        /// <exception cref="NotSupportedException">请求消息的类型不被支持。</exception>
        public IMessageFormatter GetFormatter(RequestMessageType requestMessageType)
        {
            var formatter = RequestMessageFormatterDictionary[requestMessageType];

            if (formatter == null)
                throw new NotSupportedException(string.Format("不支持的请求消息类型:{0}。", requestMessageType));

            return formatter;
        }
Beispiel #4
0
        public static byte[] ConvertToCoap(CoapSession session, EventMessage message, byte[] observableToken = null)
        {
            CoapMessage coapMessage = null;
            CoapToken   token       = CoapToken.Create();

            ushort id = observableToken == null?session.CoapSender.NewId(token.TokenBytes) : session.CoapSender.NewId(observableToken);

            string uriString = CoapUri.Create(session.Config.Authority, message.ResourceUri, IsEncryptedChannel);

            if (message.Protocol == ProtocolType.MQTT)
            {
                MqttMessage    msg = MqttMessage.DecodeMessage(message.Message);
                PublishMessage pub = msg as PublishMessage;
                MqttUri        uri = new MqttUri(pub.Topic);
                if (observableToken == null)
                {
                    RequestMessageType messageType = msg.QualityOfService == QualityOfServiceLevelType.AtMostOnce ? RequestMessageType.NonConfirmable : RequestMessageType.Confirmable;
                    //request
                    coapMessage = new CoapRequest(id, messageType, MethodType.POST, new Uri(uriString), MediaTypeConverter.ConvertToMediaType(message.ContentType));
                }
                else
                {
                    //response
                    coapMessage = new CoapResponse(id, ResponseMessageType.NonConfirmable, ResponseCodeType.Content, observableToken, MediaTypeConverter.ConvertToMediaType(uri.ContentType), msg.Payload);
                }
            }
            else if (message.Protocol == ProtocolType.COAP)
            {
                CoapMessage msg = CoapMessage.DecodeMessage(message.Message);
                if (observableToken == null)
                {
                    //request
                    coapMessage = new CoapRequest(id, msg.MessageType == CoapMessageType.Confirmable ? RequestMessageType.Confirmable : RequestMessageType.NonConfirmable, MethodType.POST, new Uri(uriString), MediaTypeConverter.ConvertToMediaType(message.ContentType), msg.Payload);
                }
                else
                {
                    //response
                    coapMessage = new CoapResponse(id, ResponseMessageType.NonConfirmable, ResponseCodeType.Content, observableToken, MediaTypeConverter.ConvertToMediaType(message.ContentType), msg.Payload);
                }
            }
            else
            {
                if (observableToken == null)
                {
                    //request
                    coapMessage = new CoapRequest(id, RequestMessageType.NonConfirmable, MethodType.POST, new Uri(uriString), MediaTypeConverter.ConvertToMediaType(message.ContentType), message.Message);
                }
                else
                {
                    //response
                    coapMessage = new CoapResponse(id, ResponseMessageType.NonConfirmable, ResponseCodeType.Content, observableToken, MediaTypeConverter.ConvertToMediaType(message.ContentType), message.Message);
                }
            }

            return(coapMessage.Encode());
        }
        /// <summary>
        /// 根据请求消息类型得到一个对应的格式化器。
        /// </summary>
        /// <param name="requestMessageType">请求消息类型。</param>
        /// <returns>一个可用消息格式化器。</returns>
        /// <exception cref="NotSupportedException">请求消息的类型不被支持。</exception>
        public IMessageFormatter GetFormatter(RequestMessageType requestMessageType)
        {
            var formatter = RequestMessageFormatterDictionary[requestMessageType];

            if (formatter == null)
            {
                throw new NotSupportedException(string.Format("不支持的请求消息类型:{0}。", requestMessageType));
            }

            return(formatter);
        }
Beispiel #6
0
 public CoapRequest(ushort messageId, RequestMessageType type, MethodType method, byte[] token, Uri resourceUri, MediaType?contentType, byte[] payload)
     : base()
 {
     this.MessageId   = messageId;
     this.RequestType = type;
     this.Method      = method;
     this.Token       = token;
     this.ResourceUri = resourceUri;
     this.ContentType = contentType;
     this.Payload     = payload;
 }
Beispiel #7
0
 public CoapRequest(ushort messageId, RequestMessageType type, MethodType method, byte[] token, Uri resourceUri,
                    MediaType?contentType, byte[] payload)
 {
     MessageId   = messageId;
     RequestType = type;
     Method      = method;
     Token       = token;
     ResourceUri = resourceUri;
     ContentType = contentType;
     Payload     = payload;
 }
Beispiel #8
0
        public async Task UnsubscribeAsync(string resourceUriString, bool confirmable, Action <CodeType, string, byte[]> action)
        {
            if (!channel.IsConnected)
            {
                await ConnectAsync();
            }

            session.UpdateKeepAliveTimestamp();

            byte[]             token         = CoapToken.Create().TokenBytes;
            ushort             id            = session.CoapSender.NewId(token, null, action);
            string             scheme        = channel.IsEncrypted ? "coaps" : "coap";
            string             coapUriString = GetCoapUriString(scheme, config.Authority, resourceUriString);
            RequestMessageType mtype         = confirmable ? RequestMessageType.Confirmable : RequestMessageType.NonConfirmable;
            CoapRequest        cr            = new CoapRequest(id, mtype, MethodType.DELETE, token, new Uri(coapUriString), null);
            await channel.SendAsync(cr.Encode());
        }
Beispiel #9
0
        public override void Decode(byte[] message)
        {
            int  index  = 0;
            byte header = message[index++];

            if (header >> 0x06 != 1)
            {
                throw new CoapVersionMismatchException("Coap Version 1 is only supported version for Coap request.");
            }

            RequestType = (RequestMessageType)Convert.ToInt32((header >> 0x04) & 0x03);

            TokenLength = Convert.ToByte(header & 0x0F);

            Method = (MethodType)message[index++];

            MessageId = (ushort)((message[index++] << 0x08) | message[index++]);
            byte[] tokenBytes = new byte[TokenLength];
            Buffer.BlockCopy(message, index, tokenBytes, 0, TokenLength);
            Token = tokenBytes;

            index += TokenLength;
            int  previous = 0;
            bool marker   = (message[index] & 0xFF) == 0xFF;

            while (!marker)
            {
                int        delta      = message[index] >> 0x04;
                CoapOption CoapOption = CoapOption.Decode(message, index, previous, out index);
                Options.Add(CoapOption);
                previous += delta;
                marker    = (message[index] & 0xFF) == 0xFF;
            }

            if (marker)
            {
                index++;
                Payload = new byte[message.Length - index];
                Buffer.BlockCopy(message, index, Payload, 0, Payload.Length);
            }

            ReadOptions(this);
        }
        // ReSharper disable PossibleNullReferenceException
        public static NormalRequestMessage Parse(XElement xml, RequestMessageType type)
        {
            NormalRequestMessage result = null;

            switch (type)
            {
            case RequestMessageType.text:
                result = new TextRequestMessage(xml);
                break;

            case RequestMessageType.image:
                result = new ImageRequestMessage(xml);
                break;

            case RequestMessageType.voice:
                result = new VoiceRequestMessage(xml);
                break;

            case RequestMessageType.video:
                result = new VideoRequestMessage(xml);
                break;

            case RequestMessageType.shortvideo:
                result = new ShortVideoRequestMessage(xml);
                break;

            case RequestMessageType.location:
                result = new LocationRequestMessage(xml);
                break;

            case RequestMessageType.link:
                result = new LinkRequestMessage(xml);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(result);
        }
 public RequestMessageWrapper(int messageId, IMessage messageBody, RequestMessageType requestType = RequestMessageType.ASYNC)
 {
     this.m_messageBody = messageBody;
     this.m_messageId   = messageId;
     this.m_requestType = requestType;
 }
Beispiel #12
0
 public RequestDomainBasic(RequestMessageType msgType)
 {
     this.MsgType = msgType;
 }
Beispiel #13
0
 public CoapRequest(ushort messageId, RequestMessageType type, MethodType method, byte[] token, Uri resourceUri, MediaType?contentType)
     : this(messageId, type, method, token, resourceUri, contentType, null)
 {
 }
Beispiel #14
0
 public CoapRequest(ushort messageId, RequestMessageType type, MethodType method, Uri resourceUri, MediaType?contentType, byte[] payload)
     : this(messageId, type, method, null, resourceUri, contentType, payload)
 {
 }
Beispiel #15
0
 public override string ToString()
 {
     return(RequestMessageType.ToString() + " / " + ResponseMessageType.ToString());
 }