public void Initialize(string username, string password, ushort port, string ipAddressOfTheServer, ushort bufferSize, string clientId,
                        ushort willFlag, ushort willReatin, uint willQoS, string willTopic, string willMessage, ushort keepAlivePeriod, ClientType clientType, uint publishQoSLevel,
                        uint retain, uint cleanSession, string certificateFileName, string privateKeyFileName)
 {
     {
         MqttSettings.Instance.Username             = username;
         MqttSettings.Instance.Password             = password;
         MqttSettings.Instance.BufferSize           = Convert.ToInt32(bufferSize);
         MqttSettings.Instance.Port                 = Convert.ToInt32(port);
         MqttSettings.Instance.IPAddressOfTheServer = IPAddress.Parse(ipAddressOfTheServer);
     }
     CrestronLogger.WriteToLog("Settings initialized", 1);
     {
         KeepAlivePeriod = keepAlivePeriod;
         ClientId        = clientId;
         WillFlag        = willFlag == 0 ? false : true;
         WillRetain      = willReatin == 0 ? false : true;
         WillQosLevel    = (byte)willQoS;
         WillTopic       = willTopic;
         WillMessage     = willMessage;
         Topics          = new Dictionary <string, byte>();
         PublishQoSLevel = publishQoSLevel;
         Retain          = retain == 0 ? false : true;
         CleanSession    = cleanSession == 0 ? false : true;
     }
     CrestronLogger.WriteToLog("CLIENT STUFF initialized", 1);
     {
         try
         {
             tcpClient = new SecureTCPClient(ipAddressOfTheServer.ToString(), port, bufferSize);
             if (certificateFileName != "//" && privateKeyFileName != "//")
             {
                 var certificate           = ReadFromResource(@"NVRAM\\" + certificateFileName);
                 X509Certificate2 x509Cert = new X509Certificate2(certificate);
                 tcpClient.SetClientCertificate(x509Cert);
                 tcpClient.SetClientPrivateKey(ReadFromResource(@"NVRAM\\" + privateKeyFileName));
             }
             tcpClient.SocketStatusChange += this.OnSocketStatusChange;
             PayloadMapper                  = new PayloadMapper();
             PayloadMapper.ClientType       = clientType;
             PacketDecoder                  = new PacketDecoder();
             sessionManager                 = new MqttSessionManager(clientId);
             publisherManager               = new MqttPublisherManager(sessionManager);
             publisherManager.PacketToSend += this.OnPacketToSend;
         }
         catch (Exception e)
         {
             OnErrorOccured("ERROR DURING INITIALIZATION: " + e.Message);
         }
     }
     CrestronLogger.WriteToLog("MQTTCLIENT - Initialize - completed : " + clientId, 1);
 }
        public void CanDeserializePayload()
        {
            const string payload = "token=UPB5sDjFlKyzqRAX0SPO44fm&team_id=TEM9Z8ZU6" +
                                   "&team_domain=electric-head&channel_id=CEK9TU8SD&" +
                                   "channel_name=random&user_id=UELV368CX&user_name=david&" +
                                   "command=%2Fwhereis&text=david" +
                                   "&response_url=https%3A%2F%2Fhooks.slack.com%2Fcommands%2FTEM9Z8ZU6%2F495994816658%2Fw7dustPvf1OcLQBxlE7p7Zry&trigger_id=495826548660.497339305958.4248e2d037959185626c79146a32eace";

            var result = PayloadMapper.Map <SlackRequest>(payload);

            Assert.That(result.Token, Is.EqualTo("UPB5sDjFlKyzqRAX0SPO44fm"));
            Assert.That(result.TeamId, Is.EqualTo("TEM9Z8ZU6"));
            Assert.That(result.TeamDomain, Is.EqualTo("electric-head"));
            Assert.That(result.ChannelId, Is.EqualTo("CEK9TU8SD"));
            Assert.That(result.ChannelName, Is.EqualTo("random"));
            Assert.That(result.UserId, Is.EqualTo("UELV368CX"));
            Assert.That(result.UserName, Is.EqualTo("david"));
            Assert.That(result.Command, Is.EqualTo("/whereis"));
            Assert.That(result.Text, Is.EqualTo("david"));
            Assert.That(result.ResponseUrl, Is.EqualTo("https://hooks.slack.com/commands/TEM9Z8ZU6/495994816658/w7dustPvf1OcLQBxlE7p7Zry"));
        }
        private void HandlePUBLISHType(MqttMsgPublish publish)
        {
            try
            {
                switch (publish.QosLevel)
                {
                case MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE:
                {
                    CrestronLogger.WriteToLog("MQTTCLIENT - HandlePUBLISHType - Routing qos0 message", 5);
                    string publishPayload = System.Text.Encoding.ASCII.GetString(publish.Message, 0, publish.Message.Length);
                    OnMessageArrived(publish.Topic, PayloadMapper.Map(publishPayload));
                    break;
                }

                case MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE:
                {
                    CrestronLogger.WriteToLog("MQTTCLIENT - HandlePUBLISHType - Routing qos1 message", 5);
                    string publishPayload = System.Text.Encoding.ASCII.GetString(publish.Message, 0, publish.Message.Length);
                    Send(MsgBuilder.BuildPubAck(publish.MessageId));
                    OnMessageArrived(publish.Topic, PayloadMapper.Map(publishPayload));
                    break;
                }

                case MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE:
                {
                    CrestronLogger.WriteToLog("MQTTCLIENT - HandlePUBLISHType - Routing qos2 message", 5);
                    //ManageQoS2(publish);
                    break;
                }

                default:
                    break;
                }
                //TODO: Raise MessageArrived event , handle the necessary responses with the publisher manager.
            }
            catch (ArgumentException e)
            {
                OnErrorOccured(e.Message);
            }
        }