最近在做数字孪生的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; }
}
}
379

被折叠的 条评论
为什么被折叠?



