コード例 #1
0
        public void PacketReceived(CoapMessage message)
        {
            CoapType type = message.CoapType;

            if ((message.CoapCode == CoapCode.POST || message.CoapCode == CoapCode.PUT) && type != CoapType.ACKNOWLEDGEMENT)
            {
                String topic = null;
                QOS    qos   = QOS.AT_MOST_ONCE;
                foreach (CoapOption option in message.Options)
                {
                    if (option.Number == (int)CoapOptionType.URI_PATH)
                    {
                        topic = Encoding.UTF8.GetString(option.Value);
                    }
                    else if (option.Number == (int)CoapOptionType.ACCEPT)
                    {
                        qos = (QOS)option.Value[option.Value.Length - 1];
                    }
                }

                if (topic == null)
                {
                    List <CoapOption> options   = new List <CoapOption>();
                    byte[]            textBytes = Encoding.UTF8.GetBytes("text/plain");
                    options.Add(new CoapOption((int)CoapOptionType.CONTENT_FORMAT, textBytes.Length, textBytes));
                    byte[] nodeIdBytes = Encoding.UTF8.GetBytes(_clientID);
                    options.Add(new CoapOption((int)CoapOptionType.NODE_ID, nodeIdBytes.Length, nodeIdBytes));
                    CoapMessage ack = new CoapMessage(VERSION, CoapType.ACKNOWLEDGEMENT, CoapCode.BAD_OPTION, message.MessageID, message.Token, options, new byte[0]);
                    _client.Send(ack);
                    return;
                }

                byte[] content = message.Payload;
                _dbInterface.StoreMessage(topic, content, 0);

                if (_listener != null)
                {
                    _listener.MessageReceived(MessageType.PUBLISH);
                }
            }

            switch (type)
            {
            case CoapType.CONFIRMABLE:
            {
                List <CoapOption> options     = new List <CoapOption>();
                byte[]            nodeIdBytes = Encoding.UTF8.GetBytes(_clientID);
                options.Add(new CoapOption((int)CoapOptionType.NODE_ID, nodeIdBytes.Length, nodeIdBytes));
                CoapMessage ack = new CoapMessage(message.Version, CoapType.ACKNOWLEDGEMENT, message.CoapCode, message.MessageID, message.Token, options, new byte[0]);
                _client.Send(ack);
            }
            break;

            case CoapType.NON_CONFIRMABLE:
            {
                _timers.Remove(message.Token);
            }
            break;

            case CoapType.ACKNOWLEDGEMENT:
            {
                if (message.CoapCode == CoapCode.GET)
                {
                    Boolean?observe = null;
                    QOS     qos     = QOS.AT_MOST_ONCE;
                    foreach (CoapOption option in message.Options)
                    {
                        if (option.Number == (int)CoapOptionType.OBSERVE && option.Value.Length > 0)
                        {
                            if (option.Value[option.Value.Length - 1] == 0x00)
                            {
                                observe = false;
                            }
                            else
                            {
                                observe = true;
                            }
                        }
                        else if (option.Number == (int)CoapOptionType.ACCEPT)
                        {
                            if (option.Value[option.Value.Length - 1] == 0)
                            {
                                qos = QOS.AT_LEAST_ONCE;
                            }
                        }
                    }

                    if (observe.HasValue)
                    {
                        if (!observe.Value)
                        {
                            CoapMessage originalMessage = _timers.Remove(message.Token);
                            if (originalMessage != null)
                            {
                                List <String> topics = new List <String>();
                                foreach (CoapOption option in originalMessage.Options)
                                {
                                    if (option.Number == (int)CoapOptionType.URI_PATH)
                                    {
                                        topics.Add(Encoding.UTF8.GetString(option.Value));
                                    }
                                }

                                for (int i = 0; i < topics.Count; i++)
                                {
                                    _dbInterface.StoreTopic(topics[i], qos);
                                }

                                if (_listener != null)
                                {
                                    _listener.MessageReceived(MessageType.SUBACK);
                                }
                            }
                        }
                        else
                        {
                            CoapMessage originalMessage = _timers.Remove(message.Token);
                            if (originalMessage != null)
                            {
                                List <String> topics = new List <String>();
                                foreach (CoapOption option in originalMessage.Options)
                                {
                                    if (option.Number == (int)CoapOptionType.URI_PATH)
                                    {
                                        topics.Add(Encoding.UTF8.GetString(option.Value));
                                    }
                                }

                                for (int i = 0; i < topics.Count; i++)
                                {
                                    _dbInterface.DeleteTopic(topics[i]);
                                }
                            }

                            if (_listener != null)
                            {
                                _listener.MessageReceived(MessageType.UNSUBACK);
                            }
                        }
                    }
                }
                else
                {
                    _timers.Remove(message.Token);
                    if (_listener != null)
                    {
                        _listener.MessageReceived(MessageType.PUBACK);
                    }
                }
            }
            break;

            case CoapType.RESET:
            {
                _timers.Remove(message.Token);
            }
            break;
            }
        }