Files
Studio/Assets/Scripts/Studio/Connect/TemporaryMQTTClient.cs
2025-06-16 11:47:20 +09:00

100 lines
3.5 KiB
C#

using Best.MQTT;
using Best.MQTT.Packets.Builders;
using Studio.Util;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace Studio.Connection
{
//연결 실패시, 메시지 1회 수신시 사라지는 임시 클라이언트. 토픽 하나만 받을수 있음.
public class TemporaryMQTTClient
{
MQTTClient client;
string domain;
int port;
List<string> topics;
Action<string, string> topicCallback;
Action errorCallback;
Action connectedCallback;
public TemporaryMQTTClient(string domain, int port, List<string> topic, Action<string, string> topicCallback, Action connectedCallback, Action errorCallback)
{
this.domain = domain;
this.port = port;
this.topics = topic;
this.topicCallback = topicCallback;
this.connectedCallback = connectedCallback;
this.errorCallback = errorCallback;
var optionBuilder = new ConnectionOptionsBuilder()
.WithTCP(domain, port)
.Build();
client = new MQTTClient(optionBuilder);
client.OnConnected += OnConnectedMQTT;
client.OnStateChanged += OnStateChangedMQTT;
client.OnDisconnect += OnDisconnectedMQTT;
client.OnError += OnErrorMQTT;
client.BeginConnect(ConnectPacketBuilderCallback);
}
public override string ToString()
{
return $"domain={domain}, port={port}, topic={topics}";
}
private void OnTopic(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
string payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
Debug.Log($"Temporary MQTT is OnTopic. {ToString()}, msg={payload}");
topicCallback(topicName, payload);
this.topics.Remove(topicName);
client.CreateUnsubscribePacketBuilder(topicName)
.BeginUnsubscribe();
if (this.topics.Count == 0)
Disconnect();
}
private ConnectPacketBuilder ConnectPacketBuilderCallback(MQTTClient client, ConnectPacketBuilder builder)
{
return builder.WithKeepAlive(60);
}
void Disconnect()
{
client.CreateDisconnectPacketBuilder()
.BeginDisconnect();
}
private void OnErrorMQTT(MQTTClient client, string error)
{
errorCallback();
Debug.Log($"Temporary MQTT Client Error. {ToString()}, error={error}");
//Disconnect();
}
private void OnDisconnectedMQTT(MQTTClient client, DisconnectReasonCodes reasonCode, string reasonMessage)
{
Debug.Log($"Temporary MQTT Client Disconnected. {ToString()}, reason={reasonCode}, msg={reasonMessage}");
}
private void OnStateChangedMQTT(MQTTClient client, ClientStates oldState, ClientStates newState)
{
Debug.Log($"Temporary MQTT Client is StateChanged. {ToString()}, old={oldState}, new={newState}");
}
private void OnConnectedMQTT(MQTTClient client)
{
connectedCallback();
Debug.Log($"Temporary MQTT Client is OnConnected. {ToString()}");
foreach (var t in topics)
{
client.CreateSubscriptionBuilder(t)
.WithMessageCallback(OnTopic)
.BeginSubscribe();
}
}
}
}