100 lines
3.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |