winfrom使用mqtt发布json格式的类数据

JSON序列化代码

PersonModel类
public class PersonModel
{
    /// <summary>
    /// 数据类型
    /// </summary>
    public string unit { get; set; }
    /// <summary>
    /// PLC地址
    /// </summary>
    public string address { get; set; }
    /// <summary>
    /// 值
    /// </summary>
    public string value { get; set; }
    /// <summary>
    /// 长度
    /// </summary>
    public string lenth { get; set; }
}
string json = JsonConvert.SerializeObject(Global.rData);//将类转化为JSON(序列化)
PersonModel person = JsonConvert.DeserializeObject<PersonModel>(Encoding.UTF8.GetString(message.Payload));//将JSON转化为类数据(反序列化)

主要代码

public static class HslMqtt
    {
        public static MqttClient mqttClient;
        public static OperateResult connect;
        private static string original, appliance;
        //public static string originalRemote;
        public static void OpenConnect(string ip, int port, string user, string password)
        {
            IniFile ini = new IniFile(@"C:\FangYuanData\Setting.ini");
            appliance = ini.ReadString("System", "Appliance", "");

            IniFile ini1 = new IniFile(@"C:\FangYuanData\PN.ini");
            Global.originalRemote = ini1.ReadString("System", "PN", "");

            original = Global.GetCpuInfo();//授权码
            //originalRemote = "BFEBFBFF00090661";
            // 打开本地MQTT服务器
            try
            {
                MqttServer server = new MqttServer();
                server.ServerStart(port);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Start Failed: " + ex.Message);
                Global.LogNet.WriteFatal("MQTT", "MQTT本地服务器打开失败!");
            }

            //云服务器
            mqttClient = new MqttClient(new MqttConnectionOptions()
            {
                ClientId = original + "_" + Guid.NewGuid().ToString(),       // 客户端唯一的ID信息
                IpAddress = ip,                                              // 服务器的地址
                Port = port,                                                 // 端口默认1883
                Credentials = new MqttCredential(user.ToLower(), password)   // 设置了默认用户名(admin)和密码(123456)
            });
            connect = mqttClient.ConnectServer();

            if (connect.IsSuccess)
            {
                Task.Run(() =>
                {
                    RunWork();
                });
                Console.WriteLine("MQTT云服务器连接成功!");
                Global.LogNet.WriteInfo("MQTT", "MQTT云服务器连接成功!");
            }
            else
            {
                Console.WriteLine("MQTT云服务器连接失败!");
                Global.LogNet.WriteInfo("MQTT", "MQTT云服务器连接失败!");
            }
        }

        private static void RunWork()
        {
            // 网络失败的情况,需要自己来手动控制重连,实例化后进行事件绑定
            mqttClient.OnNetworkError += (object sender, EventArgs e) =>
            {
                // 当网络异常的时候触发,可以在此处重连服务器
                if (sender is MqttClient client)
                {
                    // 开始重连服务器,直到连接成功为止
                    Global.LogNet.WriteInfo("MQTT", "网络异常,准备10秒后重新循环连接。");
                    
                    while (true)
                    {
                        //Global.LogNet.WriteInfo("准备重新连接服务器...");
                        connect = client.ConnectServer();
                        if (connect.IsSuccess)
                        {
                            // 连接成功后,可以在下方break之前进行订阅,或是数据初始化操作
                            Global.LogNet.WriteInfo("MQTT", "MQTT云服务器重新连接成功!");
                            // 然后添加订阅
                            XMSubscribeTopic();
                            break;
                        }
                        // 每隔10秒重连
                        Thread.Sleep(10000);
                        //Global.LogNet.WriteInfo("连接失败,准备10秒后重新连接。");
                    }
                }
            };

            // 订阅示例
            mqttClient.OnMqttMessageReceived += (MqttClient client, MqttApplicationMessage message) =>
            {
                string stateReturn = "";
                if (appliance.ToLower() == "server")//本地服务端
                {
                    try
                    {
                        PersonModel person = JsonConvert.DeserializeObject<PersonModel>(Encoding.UTF8.GetString(message.Payload));//将JSON转化为类数据(反序列化)
                        Console.WriteLine("Time:" + DateTime.Now.ToString());
                        Console.WriteLine("Topic:" + message.Topic);
                        Console.WriteLine("Payload:" + Encoding.UTF8.GetString(message.Payload));
                        //反写数据到PLC
                        HslMelsecMCBinary.XMMqttWritePlc(person);//从mqtt写入到PLC
                        stateReturn = "success";
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Format Failed: " + ex.Message);
                        stateReturn = ex.Message;
                    }
                    // 发布数据
                    _ = mqttClient.PublishMessage(new MqttApplicationMessage()
                    {
                        Topic = "result/" + original,                                            // 主题
                        QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,           // 只有一次
                        Payload = Encoding.UTF8.GetBytes(stateReturn)                            // 发布的数据
                    });
                }
                else if (appliance.ToLower() == "client")
                {
                    try
                    {
                        Register person = JsonConvert.DeserializeObject<Register>(Encoding.UTF8.GetString(message.Payload));//将JSON转化为类数据(反序列化)
                        /*Console.WriteLine("Time:" + DateTime.Now.ToString());
                        Console.WriteLine("Topic:" + message.Topic);
                        Console.WriteLine("Payload:" + Encoding.UTF8.GetString(message.Payload));*/
                        //获取MQTT服务器的数据到UI画面
                        Global.rMQTTData = person;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Format Failed: " + ex.Message);
                    }
                }
            };

            // 然后添加订阅
            XMSubscribeTopic();
            while (appliance.ToLower() == "server")
            {
                if (connect.IsSuccess)
                {
                    Thread.Sleep(100);//设置采集周期
                    
                        // 数据采集
                        string json = JsonConvert.SerializeObject(Global.rData);//将类转化为JSON(序列化)
                        //Register person = JsonConvert.DeserializeObject<Register>(json);//将JSON转化为类数据(反序列化)

                        // 发布数据
                        _ = mqttClient.PublishMessage(new MqttApplicationMessage()
                        {
                            Topic = "data/" + original,                                            // 主题
                            QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,          // 如果是实时数据,适合用这个
                            Payload = Encoding.UTF8.GetBytes(json)                                 // 发布的数据
                        });
                }
            } 
        }

        private static void XMSubscribeTopic()
        {
            if (appliance.ToLower() == "server")//本地服务端
            {
                _ = mqttClient.SubscribeMessage("cmd/" + original);
                
            }
            else if (appliance.ToLower() == "client")//远程客户端
            {
                _ = mqttClient.SubscribeMessage("data/" + Global.originalRemote);
            }
        }

        public static void personModelToMqtt(PersonModel person)
        {
            // 数据采集
            string json = JsonConvert.SerializeObject(person);//将类转化为JSON(序列化)
            //Register person = JsonConvert.DeserializeObject<Register>(json);//将JSON转化为类数据(反序列化)

            // 发布数据
            OperateResult connect = HslMqtt.mqttClient.PublishMessage(new MqttApplicationMessage()
            {
                Topic = "cmd/" + Global.originalRemote,                                // 主题
                QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,          // 如果是实时数据,适合用这个
                Payload = Encoding.UTF8.GetBytes(json)                                  // 发布的数据
            });
            if (connect.IsSuccess)
                Console.WriteLine("MQTT发布成功:" + json);
            else
                Console.WriteLine("MQTT发布失败");
        }
            

        /// <summary>
        /// 发布日志数据到mqtt
        /// </summary>
        /// <param name="pLog">日志类</param>
        public static void pLogToMqtt(PLog pLog)
        {
            if (appliance.ToLower() == "server")
            {
                if (connect.IsSuccess)
                {
                    // 数据采集
                    string json = JsonConvert.SerializeObject(pLog);//将类转化为JSON(序列化)

                    // 发布数据
                    _ = mqttClient.PublishMessage(new MqttApplicationMessage()
                    {
                        Topic = "plog/" + original,                                            // 主题
                        QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,         // 日志数据,适合用这个
                        Payload = Encoding.UTF8.GetBytes(json)                                 // 发布的数据
                    });
                }
            }
        }

        /// <summary>
        /// 配方数据到mqtt
        /// </summary>
        /// <param name="recipe">配方类</param>
        public static void recipeToMqtt(Recipe recipe)
        {
            if (appliance.ToLower() == "server")
            {
                if (connect.IsSuccess)
                {
                    // 数据采集
                    string json = JsonConvert.SerializeObject(recipe);//将类转化为JSON(序列化)

                    // 发布数据
                    _ = mqttClient.PublishMessage(new MqttApplicationMessage()
                    {
                        Topic = "recipe/" + original,                                            // 主题
                        QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,         // 日志数据,适合用这个
                        Payload = Encoding.UTF8.GetBytes(json)                                 // 发布的数据
                    });
                }
            }
        } 
    }

此程序通过mqtt的发布以及订阅跟第三方通讯。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬辛敏灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值