Пример #1
0
        // this code runs when a message was received
        void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            switch (e.Topic.ToLower())
            {
            case "picture":
                BitmapImage bitimg = Utils.ByteToImage(e.Message);
                Dispatcher.Invoke(delegate {                  // we need this construction because the receiving code in the library and the UI with textbox run on different threads
                    ImageViewer2.Source   = bitimg;
                    btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                });
                break;

            case "bundle":
                DataInfo imageData = ExtendedSerializerExtensions.Deserialize <DataInfo>(e.Message);
                Dispatcher.Invoke(delegate {                  // we need this construction because the receiving code in the library and the UI with textbox run on different threads
                    ImageViewer2.Source   = Utils.ByteToImage(imageData.ImageData);
                    txtReceived.Text      = (string.IsNullOrEmpty(imageData.PublisherMessage) ? "": imageData.PublisherMessage + "\n") + imageData.FileName;
                    txtReceivedDate.Text  = imageData.SentDateTime.ToString();
                    btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                });
                break;

            default:
                string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
                Dispatcher.Invoke(delegate {                  // we need this construction because the receiving code in the library and the UI with textbox run on different threads
                    txtReceived.Text      = ReceivedMessage;
                    btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                });
                break;
            }
        }
Пример #2
0
        // this code runs when the button "Publish" is clicked
        private async void btnPublish_Click(object sender, RoutedEventArgs e)
        {
            if (txtTopicPublish.Text != "")
            {
                string Topic = txtTopicPublish.Text.Trim();
                btnPublish2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);

                switch (Topic.ToLower())
                {
                case "picture":
                    if (selectedFileName != "")
                    {
                        var messageImage = new MqttApplicationMessageBuilder()
                                           .WithTopic(Topic)
                                           .WithPayload(Utils.ConvertBitmapSourceToByteArray(selectedFileName))
                                           .WithExactlyOnceQoS()
                                           .WithRetainFlag()
                                           .Build();

                        await mqttClient.PublishAsync(messageImage, CancellationToken.None);
                    }
                    break;

                case "bundle":
                    DataInfo imageData = new DataInfo
                    {
                        PublisherMessage = txtPublish.Text,
                        FileName         = System.IO.Path.GetFileName(selectedFileName),
                        ImageData        = string.IsNullOrEmpty(selectedFileName) ? null : Utils.ConvertBitmapSourceToByteArray(selectedFileName),
                        SentDateTime     = DateTime.Now
                    };

                    var messageBundle = new MqttApplicationMessageBuilder()
                                        .WithTopic(Topic)
                                        .WithPayload(ExtendedSerializerExtensions.Serialize(imageData))
                                        .WithExactlyOnceQoS()
                                        .WithRetainFlag()
                                        .Build();

                    await mqttClient.PublishAsync(messageBundle, CancellationToken.None);

                    break;

                default:
                    var message = new MqttApplicationMessageBuilder()
                                  .WithTopic(Topic)
                                  .WithPayload(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff", CultureInfo.InvariantCulture) + "\n" + txtPublish.Text)
                                  .WithExactlyOnceQoS()
                                  .WithRetainFlag()
                                  .Build();
                    await mqttClient.PublishAsync(message, CancellationToken.None);     // Since 3.0.5 with CancellationToken

                    break;
                }
            }
            else
            {
                MessageBox.Show("You have to enter a topic to publish!");
            }
        }
Пример #3
0
        // this code runs when the button "Publish" is clicked
        private void btnPublish_Click(object sender, RoutedEventArgs e)
        {
            if (txtTopicPublish.Text != "")
            {
                // whole topic
                //string Topic = "/ElektorMyJourneyIoT/" + txtTopicPublish.Text + "/test";
                string Topic = txtTopicPublish.Text.Trim();
                btnPublish2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);

                switch (Topic.ToLower())
                {
                case "picture":
                    if (selectedFileName != "")
                    {
                        client.Publish(Topic, Utils.ConvertBitmapSourceToByteArray(selectedFileName), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
                    }
                    //selectedFileName = "";
                    break;

                case "bundle":
                    DataInfo imageData = new DataInfo {
                        PublisherMessage = txtPublish.Text,
                        FileName         = Path.GetFileName(selectedFileName),
                        ImageData        = string.IsNullOrEmpty(selectedFileName) ? null:Utils.ConvertBitmapSourceToByteArray(selectedFileName),
                        SentDateTime     = DateTime.Now
                    };
                    client.Publish(Topic, ExtendedSerializerExtensions.Serialize(imageData), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
                    //selectedFileName = "";
                    break;

                default:
                    // publish a message with QoS 2
                    client.Publish(Topic, Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff", CultureInfo.InvariantCulture) + "\n" + txtPublish.Text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
                    break;
                }
            }
            else
            {
                MessageBox.Show("You have to enter a topic to publish!");
            }
        }
        protected void RecieveFileList(TextView contentLabel, ListView contentListView)
        {
            contentListView.OpenSelectedItem -= current_mode;
            current_mode = (a) => RetrieveFile(a.Value.ToString());
            contentListView.OpenSelectedItem += current_mode;
            var endpoint = new IPEndPoint(IPAddress.Parse(SnailMailClient.ServerIp), SnailMailClient.ServerPort);
            var sock     = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            sock.Connect(endpoint);

            var ns = new NetworkStream(sock, true);

            ns.Write(BitConverter.GetBytes(0));
            //Checks for code sent by server to see if it has files it can recieve
            byte[] youHaveMail = new byte[4];

            ns.Read(youHaveMail, 0, 4);
            if (BitConverter.ToInt32(youHaveMail) == 1)
            {
                contentLabel.Text = "You have no waiting Messages";
                ns.Close();
            }
            else if (BitConverter.ToInt32(youHaveMail) == 0)
            {
                byte[] lengthOfData = new byte[4];
                ns.Read(lengthOfData, 0, 4);
                byte[] dataBytes = new byte[BitConverter.ToInt32(lengthOfData)];
                ns.Read(dataBytes, 0, dataBytes.Length);
                contentLabel.Text = "Select a file to download if it is ready";

                List <string> fileList = ExtendedSerializerExtensions.Deserialize <List <string> >(dataBytes);
                //contentLabel.Text = fileList[0];
                contentListView.SetSource(fileList);
                contentListView.CanFocus = true;
                contentListView.SetFocus();
                //sock.Close();
            }
        }
Пример #5
0
        private async Task DoFS(Socket sock)
        {
            do
            {
                var clientSocket = await Task.Factory.FromAsync(
                    new Func <AsyncCallback, object, IAsyncResult>(sock.BeginAccept),
                    new Func <IAsyncResult, Socket>(sock.EndAccept), null).ConfigureAwait(false);

                Console.WriteLine("connected");

                using (var stream = new NetworkStream(clientSocket, true))
                {
                    byte[] modeBytes = new byte[4];
                    stream.Read(modeBytes, 0, modeBytes.Length);
                    int mode = BitConverter.ToInt32(modeBytes);

                    //Send file to client
                    if (mode == 2)
                    {
                        Console.WriteLine("Send file to client");

                        string path = "ServerFiles/" + clientSocket.RemoteEndPoint.ToString().Split(':')[0] + "/";
                        //Dictionary<string, string> fileList = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(path + "Manager.json")); ;

                        byte[] packLength = new byte[4];

                        stream.Read(packLength, 0, 4);
                        byte[] keyBytes = new byte[BitConverter.ToInt32(packLength)];
                        stream.Read(keyBytes, 0, keyBytes.Length);

                        string key = Encoding.UTF8.GetString(keyBytes);
                        Console.WriteLine(key);
                        byte[] fileData = File.ReadAllBytes(path + key + ".dat");

                        /*var memstream = new MemoryStream();
                         * memstream.Write(fileData);
                         * memstream.Position = 0;*/
                        //FileEncoding.FileStructure fs = FileEncoding.FileStructureRetriever(memstream);
                        //Console.WriteLine(fs.fileName);

                        stream.Write(fileData);
                    }
                    //Send list of files and times until able to be recieved
                    else if (mode == 0)
                    {
                        string path = "ServerFiles/" + clientSocket.RemoteEndPoint.ToString().Split(':')[0] + "/";
                        //Console.WriteLine(File.Exists(path+"Manager.json"));
                        Dictionary <string, string> fileList = JsonConvert.DeserializeObject <Dictionary <string, string> >(File.ReadAllText(path + "Manager.json"));;
                        List <string> fileNames = new List <string>();

                        try
                        {
                            fileList = JsonConvert.DeserializeObject <Dictionary <string, string> >(File.ReadAllText(path + "Manager.json"));
                        }
                        catch
                        {
                            stream.Write(BitConverter.GetBytes(1));
                            clientSocket.Close();
                        }
                        stream.Write(BitConverter.GetBytes(0));
                        foreach (KeyValuePair <string, string> entry in fileList)
                        {
                            DateTime endTime = DateTime.Parse(entry.Value).AddDays(SnailMailServer.days_delayed);
                            TimeSpan ts      = endTime.Subtract(DateTime.UtcNow);
                            if (ts.CompareTo(TimeSpan.Zero) > 0)
                            {
                                fileNames.Add(entry.Key + " - " + ts.ToString(@"dd\:hh\:mm\:ss"));
                            }
                            else
                            {
                                ts = new TimeSpan(0, 0, 0, 0);
                                fileNames.Add(entry.Key + " - " + ts.ToString(@"dd\:hh\:mm\:ss"));
                            }
                        }

                        /*foreach(string s in fileNames)
                         * {
                         *  Console.WriteLine(s);
                         * }*/

                        byte[] dataToSend = ExtendedSerializerExtensions.Serialize(fileNames);
                        //List<string> yeetus = (List<string>)binForm.Deserialize(memStream);

                        //Console.WriteLine(yeetus[0]);
                        List <byte> fullLoad = new List <byte>();
                        fullLoad.AddRange(BitConverter.GetBytes(dataToSend.Length));
                        fullLoad.AddRange(dataToSend);
                        List <string> yeetus = ExtendedSerializerExtensions.Deserialize <List <string> >(dataToSend);
                        Console.WriteLine(yeetus[0]);
                        stream.Write(fullLoad.ToArray());
                    }
                    //Recieve file from client
                    else if (mode == 1)
                    {
                        FileEncoding.FileStructure fs = FileEncoding.FileStructureRetriever(stream);
                        byte[] bytes = FileEncoding.StreamPrepper(fs);
                        Dictionary <string, string> fileList;
                        string path = "ServerFiles/" + fs.ipSender.ToString() + "/";

                        if (!Directory.Exists("ServerFiles/" + fs.ipSender.ToString() + "/"))
                        {
                            Directory.CreateDirectory(path);
                            FileStream stream1 = File.Create(path + "Manager.json");
                            stream1.Write(Encoding.UTF8.GetBytes("{}"));
                            stream1.Close();
                        }
                        try
                        {
                            fileList = JsonConvert.DeserializeObject <Dictionary <string, string> >(File.ReadAllText(path + "Manager.json"));
                        }
                        catch
                        {
                            fileList = new Dictionary <string, string>();
                        }
                        FileStream fstream = File.Create(path + fs.fileName + ".dat");
                        if (!fileList.TryGetValue(fs.fileName, out _))
                        {
                            fileList.Add(fs.fileName, fs.dateSent);
                        }
                        else
                        {
                            fileList[fs.fileName] = fs.dateSent;
                        }

                        File.WriteAllText(path + "Manager.json", JsonConvert.SerializeObject(fileList, Formatting.Indented));
                        fstream.Write(bytes);
                        fstream.Close();
                        Console.WriteLine(fs.ipSender.ToString());
                        clientSocket.Close();
                    }
                }
            } while (true);
        }
Пример #6
0
        public MainWindow()
        {
            InitializeComponent();

            //"127.0.0.1" or "localhost" when you installed Mosquitto Broker in your local machine.
            //"test.mosquitto.org";
            //string BrokerAddress = "192.168.3.5";
            string BrokerAddress = "localhost";
            int    BrokerPort    = 1883;

            // use a unique id as client id, each time we start the application
            clientId = Guid.NewGuid().ToString();

            string username = "******";
            string password = "******";

            // Create a new MQTT client.
            var factory = new MqttFactory();

            mqttClient = factory.CreateMqttClient();

            //// Certificate based authentication
            //List<X509Certificate> certs = new List<X509Certificate>
            //{
            //    new X509Certificate2("certificate1.pfx")
            //};

            // Create TCP based options using the builder.
            var options = new MqttClientOptionsBuilder()
                          .WithClientId(clientId)
                          .WithTcpServer(BrokerAddress, BrokerPort)
                          .WithCredentials(username, password) //("bud", "%spencer%")
                                                               //.WithTls(new MqttClientOptionsBuilderTlsParameters
                                                               //{
                                                               //    UseTls = true,
                                                               //    Certificates = certs,
                                                               //    CertificateValidationHandler = (MqttClientCertificateValidationCallbackContext context) =>
                                                               //    {
                                                               //        // TODO: Check conditions of certificate by using above parameters.
                                                               //        return true;
                                                               //    }
                                                               //})
                                                               //.WithTls()
                          .WithCleanSession()
                          .Build();

            // Subscribing to a topic
            mqttClient.UseConnectedHandler(async e =>
            {
                await UseConnectedMessage();

                //Console.WriteLine("### CONNECTED WITH SERVER ###");

                //// Subscribe to a topic
                //await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("my/topic").Build());

                //Console.WriteLine("### SUBSCRIBED ###");
            });

            // Reconnecting
            mqttClient.UseDisconnectedHandler(async e =>
            {
                Dispatcher.Invoke(delegate
                {
                    sbMessage.Text = "Disconnected from MQTT Brokers.";
                });
                //Console.WriteLine("### DISCONNECTED FROM SERVER ###");
                await Task.Delay(TimeSpan.FromSeconds(5));

                try
                {
                    await mqttClient.ConnectAsync(options, CancellationToken.None); // Since 3.0.5 with CancellationToken
                }
                catch
                {
                    //Console.WriteLine("### RECONNECTING FAILED ###");
                }
            });

            mqttClient.UseApplicationMessageReceivedHandler(e =>
            {
                try
                {
                    string topic = e.ApplicationMessage.Topic;

                    if (string.IsNullOrWhiteSpace(topic) == false)
                    {
                        string payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                        ////Console.WriteLine($"Topic: {topic}. Message Received: {payload}");
                        //Dispatcher.Invoke(delegate
                        //{
                        //    // we need this construction because the receiving code in the library and the UI with textbox run on different threads
                        //    txtReceived.Text = payload;
                        //    btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                        //});
                        switch (topic.ToLower())
                        {
                        case "picture":
                            BitmapImage bitimg = Utils.ByteToImage(e.ApplicationMessage.Payload);
                            Dispatcher.Invoke(delegate {
                                ImageViewer2.Source   = bitimg;
                                btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                            });
                            break;

                        case "bundle":
                            DataInfo imageData = ExtendedSerializerExtensions.Deserialize <DataInfo>(e.ApplicationMessage.Payload);
                            Dispatcher.Invoke(delegate {
                                ImageViewer2.Source   = Utils.ByteToImage(imageData.ImageData);
                                txtReceived.Text      = (string.IsNullOrEmpty(imageData.PublisherMessage) ? "" : imageData.PublisherMessage + "\n") + imageData.FileName;
                                txtReceivedDate.Text  = imageData.SentDateTime.ToString();
                                btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                            });
                            break;

                        default:
                            string ReceivedMessage = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                            Dispatcher.Invoke(delegate {
                                txtReceived.Text      = ReceivedMessage;
                                btnSubscribe2.Content = DateTime.Now.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture);
                            });
                            break;
                        }
                    }

                    //string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, ex);
                }
            });

            //mqttClient.ConnectAsync(options, CancellationToken.None).Wait(CancellationToken.None);
            mqttClient.ConnectAsync(options).GetAwaiter().GetResult();
        }