public static PubackWrk ProcessPuback(byte[] input, byte[] clientId, SqliteConnection sConnect)
        {
            MessageInterface.PubackWrk puback = new PubackWrk(input);
            if (puback.puback.ReturnCode == ReturnCodes.Accepted)
            {
                Publisher.DeleteEntry(puback.puback.topicId, clientId, sConnect);
            }

            return(puback);
        }
        public static PubackWrk ProcessPublish(byte[] pubInput)
        {
            MessageInterface.PublishWrk publish = new PublishWrk(pubInput);
            //send appropriate response
            MessageInterface.PubackWrk puback = new PubackWrk();
            puback.puback.topicId   = publish.publish.topicId;
            puback.puback.messageId = publish.publish.messageId;


            if (Publisher.Insert(publish.publish, sqliteConnection) == 1)
            {
                puback.puback.ReturnCode = MessageInterface.ReturnCodes.Accepted;
            }
            else
            {
                puback.puback.ReturnCode = MessageInterface.ReturnCodes.Congestion;
            }

            return(puback);
        }
Example #3
0
        private static void ReceiveMessage()
        {
            byte[] header = new byte[2];
            byte[] messageBody;
            int    length = 0;

            while (!clientSocket.Poll(1000, SelectMode.SelectRead))
            {
                Thread.Sleep(100);
            }
            while (true)
            {
                int received = clientSocket.Receive(header, SocketFlags.None);

                MsgTyp type = GetMsgType(header, ref length);
                if (length == 0)
                {
                    continue;
                }
                messageBody = new byte[length - 2];
                clientSocket.Receive(messageBody, SocketFlags.None);

                // Create the full message
                byte[] messageFull = new byte[length];
                System.Buffer.BlockCopy(header, 0, messageFull, 0, 2);
                System.Buffer.BlockCopy(messageBody, 0, messageFull, 2, length - 2);

                switch (type)
                {
                case MsgTyp.Suback:
                    SubscribeResponse(messageFull);
                    break;

                case MsgTyp.Puback:
                    PublishResponse(messageFull);
                    break;

                case MsgTyp.Regack:
                    RegisterResponse(messageFull);
                    break;

                case MsgTyp.Connack:
                    ReceiveResponse(messageFull);
                    break;

                case MsgTyp.Publish:

                    MessageInterface.PublishWrk publ = new PublishWrk(messageFull);

                    MessageInterface.PubackWrk pubAck = new PubackWrk();
                    pubAck.puback.topicId   = publ.publish.topicId;
                    pubAck.puback.messageId = publ.publish.messageId;

                    clientSocket.Send(pubAck.Serialized, 0, pubAck.puback.length, SocketFlags.None);

                    Console.WriteLine("REceived a message published by the server");
                    Console.WriteLine("TopicID: " + ASCIIEncoding.ASCII.GetString(publ.publish.topicId));
                    Console.WriteLine("MsgId: " + ASCIIEncoding.ASCII.GetString(publ.publish.messageId));
                    Console.WriteLine("Message from the server: " + ASCIIEncoding.ASCII.GetString(publ.publish.data));
                    Console.WriteLine("Continue ?");
                    Console.ReadLine();

                    Console.Clear();
                    break;
                }
                Thread.Sleep(100);
            }
        }
Example #4
0
        private static void PublishResponse(byte[] input)
        {
            PubackWrk pub = new PubackWrk(input);

            Console.WriteLine("\t\t\t\t\t\t Puback: " + pub.puback.ReturnCode);
        }
        private static void SocketLoop(Object sObj)
        {
            Socket socket = (Socket)sObj;

            byte[] header = new byte[2];
            byte[] messageBody;

            socket.Listen(0);
            Socket handler = socket.Accept();

            byte[] clientId = new byte[4];
            int    length   = 0;


            while (true)
            {
                try
                {
                    handler.Receive(header, 2, SocketFlags.None);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception occured in thread. Closing. " + ex.Message);
                    handler = socket.Accept();
                    handler.Receive(header, 2, SocketFlags.None);
                }

                MsgTyp type = GetMsgType(header, ref length);

                messageBody = new byte[length - 2];
                try
                {
                    handler.Receive(messageBody);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception occured in thread. Closing. " + ex.Message);
                    return;
                }

                // Create the full message
                byte[] messageFull = new byte[length];
                System.Buffer.BlockCopy(header, 0, messageFull, 0, 2);
                System.Buffer.BlockCopy(messageBody, 0, messageFull, 2, length - 2);

                switch (type)
                {
                case MsgTyp.Connect:

                    ConnackWrk cObj = ProcessConnect(messageFull, ref clientId);
                    handler.Send(cObj.Serialized, 0, cObj.connack.length, SocketFlags.None);
                    break;

                case MsgTyp.Register:

                    RegackWrk rObj = ProcessRegister(messageFull);
                    handler.Send(rObj.Serialized, 0, rObj.regack.length, SocketFlags.None);
                    break;


                case MsgTyp.Publish:


                    PubackWrk pObj = ProcessPublish(messageFull);
                    handler.Send(pObj.Serialized, 0, pObj.puback.length, SocketFlags.None);
                    break;

                case MsgTyp.Subscribe:


                    SubackWrk skObj = ProcessSubscribe(messageFull, clientId);
                    handler.Send(skObj.Serialized, 0, skObj.suback.length, SocketFlags.None);
                    break;

                case MsgTyp.Puback:

                    PubackWrk pkObj = ProcessPuback(messageFull, clientId, sqliteConnection);
                    handler.Send(pkObj.Serialized, 0, pkObj.puback.length, SocketFlags.None);
                    break;
                }


                // Send out message to be published to this client
                PublishClients(clientId, handler);
            }
        }