unity 使用MQTTnet进行mqtt数据传输

最近在做数字孪生的mqtt服务,采用的是mqttnet插件制作,首先在unity中导入mqttnet,导入完成后需要配置一下net平台为4.x如下图,unity版本为2023.2.20f1cf,导入Mqttnet需要Nugetforunity包,这个包可以在github上获取。

在这里插入图片描述
剩下就是代码部分,大家可以针对代码进行删减达到自己想要的效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MQTTnet;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Threading;
using System;
using MQTTnet.Protocol;
using System.Text;
using MQTTnet.Client;
using MQTTnet.Server;
using QFramework;
using Cysharp.Threading.Tasks;

public class MqttMangert : MonoSingleton<MqttMangert>
{
    MqttFactory mqttFactory = new MqttFactory();
    MQTTInitData mqttInitData;//初始化
    IMqttClient mqttClient;
    private string ReceiveTopic = "UPDATA";
    private string SendTopic = "DNDATA/cmd/set";
    public static DataManager_数据结构 Data_数据源;
    void Start()
    {
        //这里先创建一个客户端对象,但是没进行配置       
        mqttClient = mqttFactory.CreateMqttClient();
        StartConnect().Forget();
        Data_数据源 = new DataManager_数据结构();

    }

    private async UniTask StartConnect()
    {
        try
        {
            //读取配置
            var path = Path.Combine(Application.streamingAssetsPath,
            "mqttConfig.json");
            if (File.Exists(path))
            {
                var jsonStr = File.ReadAllText(path);
                mqttInitData = JsonConvert.DeserializeObject<MQTTInitData>(jsonStr);
                //构建客户端配置对象
                MqttClientOptions mqttClientOptions = new MqttClientOptionsBuilder()
                .WithTcpServer(mqttInitData.Ip, mqttInitData.Port) // 指定服务器地址和端口
                .WithCredentials(mqttInitData.UserName, mqttInitData.Passwd) // 指定用户名和密码
                                                                             // .WithClientId(Guid.NewGuid().ToString("N"))//配置客户端的ID
                .WithCleanSession() // 使用清除会话标志
                                    //  .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)    //配置MQTT版本
                .Build();   //MQTT客户端异步连接
                //上面构建的配置对象给到了客户端对象
                var response = await mqttClient.ConnectAsync(mqttClientOptions);
                Debug.Log(("链接成功") + response.ResultCode);

                //当await连接完成后,构建主题对象
                var topicFilter = new MqttTopicFilterBuilder()//主题构建对象构建一个主题对象
                .WithTopic(ReceiveTopic)
                .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce)//设置质量服务等级
                .Build();//最终构建   
                await mqttClient.SubscribeAsync(topicFilter);//订阅topic  订阅该主题,接收通过该主题转发的消息
                //事件订阅mqtt消息             
                //    string topic1 = e.ApplicationMessage.Topic;        
                mqttClient.ApplicationMessageReceivedAsync += messageHandler;

            }
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
        }
    }
    // 定义处理接收到的消息的方法
    Func<MqttApplicationMessageReceivedEventArgs, Task> messageHandler = static async (e) =>
    {
        string payload = Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment);

        Data_数据源 = JsonConvert.DeserializeObject<DataManager_数据结构>(payload);
        await Task.CompletedTask;
        // 你可以在这里添加任何你需要的处理逻辑
    };
    
    public static async UniTask Explain_解析数据( string data)
    {
     
        await UniTask.Yield();
    }



    void Update()
    {
        //if (Input.GetMouseButtonDown(0))
        //{
        //    SendMes("{\"data\":{\"dev\":\"9\",\"m\":\"xxxxxxxxxxxx\",\"v\":\"0\"}}");
        //}
    }
    //发送消息,你可以使用按钮绑定该方法,发送消息,或者其他方法
    public async void SendMes(string cmd)
    {
        var result = mqttClient.PublishAsync(new MqttApplicationMessage
        {
            Topic = SendTopic,//发送到那个主题
            QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
            Retain = false, //指示消息是否要被服务器保留。保留的消息会存储在服务器上,当
                            //新客户端订阅该主题时会立即收到该消息。
            PayloadSegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(cmd)),//承载消息
        }, CancellationToken.None);
        await result;
        Debug.Log("发布命令结果为" + result.IsCompleted);
    }


    //断开连接释放资源
    new void OnDestroy()
    {
        var mqttClientDisconnectOptionsBuilder =
        mqttFactory.CreateClientDisconnectOptionsBuilder();
        var mqttClientDisconnectOptions = mqttClientDisconnectOptionsBuilder.Build();
        mqttClient.DisconnectAsync(mqttClientDisconnectOptions,
        CancellationToken.None);
    }


    public class MQTTInitData//使用了Newtonjson库
    {
        [JsonProperty("ip")]
        public string Ip { get; set; }

        [JsonProperty("port")]
        public int Port { get; set; }

        [JsonProperty("userName")]
        public string UserName { get; set; }

        [JsonProperty("passwd")]
        public string Passwd { get; set; }
        [JsonProperty("macAddress")]
        public string MacAddress { get; set; }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值