C#使用MQTT

前言

最近需要接触windows编程 ,之前学过VB6.0,非常之方便,但是作为学校课程学习的,仅仅是皮毛中的皮毛,绝不能满足自己现在需要的,而且VB毕竟已经换到.NET时代,还需要更新换代这个坎,不过算是领略了图形化编程与事件驱动的风格.于是我毫不犹豫的选择了同样方便易用,风格类C,用起来却像JAVA一样顺手的C#,那个var更让我找到了曾学过的Kotlin的回忆(不过许多方面没有当初学习Kotlin让我惊艳).

环境

使用的IDE是Visual Studio 2017社区版,项目模板是C#窗体应用程序
然后需要MQTT的库,自己实现就是造轮子了,目前还不会(后期打算学会自己移植C语言版本到ESP32上),
这里使用PAHO项目下的M2Mqtt,GitHub项目地址是https://github.com/eclipse/paho.mqtt.m2mqtt.git

流程

由于是第一次使用C#编程,没有使用类库的经验,只是拥有JAVA那样使用gradle添加依赖的经验,于是还上网搜了增加依赖的教程,在C#应该叫引用好些.
step1:
把GitHub clone下来的M2Mqtt用Visual Studio 2017打开,并生成M2Mqtt.Net.dll的动态链接库文件.
step2:
创建自己的工程项目,可以自己新建一个lib文件夹,然后可以拷贝到新建的lib目录下,右键解决方案添加引用,浏览文件找到M2Mqtt.Net.dll添加进来.
step3:
开始自己愉快的玩耍…
这里有官方简单的应用介绍,不过实例化MQTT客户端的API有所优化.

我的代码

这里简单展示下我的代码,照抄官网,简单改改,和我使用的JAVA版本用起来差不多,就是C#的注册回调函数自有特色:

private void button1_Click(object sender, EventArgs e)
        {
            client = new MqttClient("118.89.106.236");
            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
            client.MqttMsgSubscribed += client_MqttMsgSubscribed;
            client.MqttMsgPublished += client_MqttMsgPublished;
            client.Connect(Guid.NewGuid().ToString(), "tester2", "tester");
            string[] topic = { "test" };
            byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE };
            client.Subscribe(topic, qosLevels);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            string buff = textBox2.Text;
            if (client is MqttClient&&client.IsConnected)
            {
                client.Publish("test", Encoding.UTF8.GetBytes(buff));
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (client is MqttClient && client.IsConnected)
            {
                client.Disconnect();
            }
        }

        void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            textBox1.Text += "@Receive:"+e.Topic+"->\t"+ System.Text.Encoding.UTF8.GetString(e.Message) +"\r\n";
        }

        void client_MqttMsgUnsubscribed(object sender, MqttMsgUnsubscribedEventArgs e)
        {
            // write your code
        }

        void client_MqttMsgSubscribed(object sender, MqttMsgSubscribedEventArgs e)
        {
            // write your code
        }

        void client_MqttMsgPublished(object sender, MqttMsgPublishedEventArgs e)
        {
            // write your code
        }

但是可能会遇到关闭界面后出现dll被占用的情况,发现是窗口关闭但是进程未结束导致,网上搜集了些解决方法,这里记录下:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            System.Environment.Exit(0);
            this.Dispose();
            this.Close();
        }

即在窗口关闭过程中给系统环境发送一个结束代码,然后启动资源回收.

猜你喜欢

转载自blog.csdn.net/qq_37258787/article/details/80183923