using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Best.MQTT;
using Best.MQTT.Packets;
using Best.MQTT.Packets.Builders;
using DefaultNamespace;
using MotionFramework;
using Newtonsoft.Json;
using Unity.VisualScripting;
using UnityEngine;
///
/// Test 类,用于演示如何在 Unity 环境中使用 MQTT 客户端库与 MQTT 代理进行交互。
///
public class MqttManager : MonoBehaviour
{
public static MqttManager Instance;
///
/// MQTT 客户端
///
MQTTClient client;
///
/// 订阅的主题接收的消息
///
[Header("订阅的世界主题接收的消息")] public List wordStrings = new List();
///
/// 订阅的主题接收的消息
///
private Queue wordStringQueue = new Queue();
///
/// 聊天面板管理器
///
public ChatPanelManager chatPanelManager;
///
/// 用户信息
///
public UserInfo userInfo;
///
/// 发送消息实例
///
public MqttRoot mqttRoot;
///
/// MQTT配置
///
public MqttConfigData mqttConfigData;
///
/// 历史消息
///
public HistoryRoot historyRoot;
void Awake()
{
Instance = this;
}
private void Start()
{
GetHistory();
GetMqttConfig();
}
public void Update()
{
if (wordStringQueue.Count > 0)
{
string str = wordStringQueue.Dequeue();
MessageDisplay(str);
}
}
///
/// 初始化MQTT
///
public void Init()
{
// 根据平台选择不同的连接方式
var options = new ConnectionOptionsBuilder()
#if !UNITY_WEBGL || UNITY_EDITOR
.WithTCP(mqttConfigData.host, mqttConfigData.port)
#else
.WithWebSocket("broker.emqx.io", 8084).WithTLS()
#endif
.Build();
// 初始化 MQTT 客户端并设置事件处理程序
client = new MQTTClientBuilder()
.WithOptions(options)
.WithEventHandler(OnConnected)
.WithEventHandler(OnDisconnected)
.WithEventHandler(OnStateChanged)
.WithEventHandler(OnError)
.CreateClient();
// 开始连接到 MQTT 代理
client.BeginConnect(ConnectPacketBuilderCallback);
}
///
/// 处理用户信息
///
async void GetMqttConfig()
{
try
{
Debug.Log("开始获取mqtt连接配置...");
// 使用UserDataNetworkManager获取用户信息
MqttConfigRoot response = await UserDataNetworkManager.Instance.GetMqttConfig();
if (response != null && response.data != null)
{
mqttConfigData = response.data;
Init();
Debug.Log("mqtt连接配置获取成功!");
}
else
{
Debug.LogError("mqtt连接配置为空");
}
}
catch (Exception ex)
{
Debug.LogError($"获取mqtt连接配置时发生错误: {ex.Message}");
// 可以在这里添加错误处理逻辑,比如显示错误提示给用户
}
}
///
/// 获取历史消息
///
async void GetHistory()
{
try
{
Debug.Log("开始获取历史消息...");
// 使用UserDataNetworkManager获取用户信息
HistoryRoot response = await UserDataNetworkManager.Instance.GetHistroy();
Debug.Log(response.msg);
if (response != null && response.data != null)
{
historyRoot = response;
foreach (var item in historyRoot.data)
{
chatPanelManager.AddBubble(item.user_username + ":" + item.chat_content, false);
}
Debug.Log("获取历史消息获取成功!");
}
else
{
Debug.LogError("获取历史消息为空");
}
}
catch (Exception ex)
{
Debug.LogError($"获取历史消息发生错误: {ex.Message}");
// 可以在这里添加错误处理逻辑,比如显示错误提示给用户
}
}
///
/// 消息接收
///
///
private void MessageDisplay(string message)
{
Debug.Log("接收消息: " + message);
wordStrings.Add(message);
MessageDto _mqrrRoot = JsonConvert.DeserializeObject(message);
chatPanelManager.AddBubble(_mqrrRoot.nickname+ ":" + _mqrrRoot.content, false);
}
private void OnConnected(MQTTClient client)
{
// 订阅指定的主题并设置消息接收回调
client.CreateSubscriptionBuilder(mqttConfigData.topic)
.WithMessageCallback(OnWordMessage)
.BeginSubscribe();
}
///
/// 世界频道消息
///
///
///
///
///
private void OnWordMessage(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
// 处理接收到的消息
Debug.Log("得到数据");
var payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
Debug.Log($"订阅输出的数据:Content-Type: '{message.ContentType}' Payload: '{payload}'");
wordStringQueue.Enqueue(payload);
}
private void OnDestroy()
{
// 在对象销毁时断开与 MQTT 代理的连接
client?.CreateDisconnectPacketBuilder()
.WithReasonCode(DisconnectReasonCodes.NormalDisconnection)
.WithReasonString("Bye")
.BeginDisconnect();
}
private ConnectPacketBuilder ConnectPacketBuilderCallback(MQTTClient client, ConnectPacketBuilder builder)
{
// 设置连接时的用户名和密码
return builder.WithUserNameAndPassword(mqttConfigData.username, mqttConfigData.password);
}
private void OnStateChanged(MQTTClient client, ClientStates oldState, ClientStates newState)
{
// 处理客户端状态变化
Debug.Log($"{oldState} => {newState}");
}
private void OnDisconnected(MQTTClient client, DisconnectReasonCodes code, string reason)
{
// 处理断开连接事件
Debug.Log($"OnDisconnected - code: {code}, reason: '{reason}'");
}
private void OnError(MQTTClient client, string reason)
{
// 处理错误事件
Debug.Log($"OnError reason: '{reason}'");
}
///
/// 发送Mqtt消息
///
///
///
public void SendMessage(string topic, string message)
{
if (client.State != ClientStates.Connected)
{
Debug.Log("连接已经断开,不发送消息");
return;
}
client.CreateApplicationMessageBuilder(topic)
.WithPayload(message)
.WithQoS(Best.MQTT.Packets.QoSLevels.AtMostOnceDelivery)
.BeginPublish();
}
//
// // 示例方法,用于触发发送消息
// [ContextMenu("ExamplePublish")]
// public void ExamplePublish()
// {
// SendMessage("世界", "你好,MQTT!");
// }
}
[Serializable]
public class MqttData
{
///
///
///
public int chat_id;
///
/// 内容
///
public string chat_content;
///
/// 发送消息的用户名
///
public string user_username;
///
///
///
public string user_image;
}
[Serializable]
public class MqttRoot
{
///
///
///
public int code;
///
///
///
public string msg;
///
///
///
public List data;
}
public class SendMessageData
{
///
///
///
public int user_id { get; set; }
///
///
///
public int user_account_id { get; set; }
///
/// 李四
///
public string user_username { get; set; }
///
///
///
public string user_image { get; set; }
///
///
///
public int user_honor_level { get; set; }
///
///
///
public int have { get; set; }
}
public class SendMessageRoot
{
///
/// 响应状态码(0-成功,其他-失败)
///
public int code { get; set; }
///
/// 响应消息
///
public string msg { get; set; }
///
/// 响应数据(发送消息接口返回字符串类型,如"发送成功")
///
public string data { get; set; }
}
public class MessageDto
{
///
///
///
public int userId { get; set; }
///
/// 张三
///
public string nickname { get; set; }
///
///
///
public string image { get; set; }
///
///
///
public string content { get; set; }
///
///
///
public string time { get; set; }
}