data package 정리

This commit is contained in:
logonkhi
2025-07-15 15:25:17 +09:00
parent 6bac7d53b1
commit cf97c6b61b
81 changed files with 909 additions and 466 deletions

View File

@@ -26,6 +26,7 @@ namespace UVC.network
private bool autoReconnect = true; // 자동 재연결 여부
private int reconnectDelay = 1000; // 재연결 시도 간격 (ms)
private bool onBackgroundThread = true; // 핸들러를 백그라운드 스레드에서 호출할지 여부
private ConcurrentDictionary<string, Action<string, string>> topicHandler;
@@ -42,6 +43,7 @@ namespace UVC.network
/// <param name="domain">MQTT 브로커의 호스트명 또는 IP 주소입니다.</param>
/// <param name="port">MQTT 브로커의 포트 번호입니다.</param>
/// <param name="autoReconnect">연결이 끊겼을 때 자동으로 재연결을 시도할지 여부입니다.</param>
/// <param name="onBackground">Handler를 백그라운드 스레드에서 호출 할지 여부</param>
/// <example>
/// <code>
/// // localhost의 기본 MQTT 포트(1883)에 연결하는 서비스 생성
@@ -51,7 +53,7 @@ namespace UVC.network
/// var mqttService = new MQTTService("mqtt.example.com", 8883, false);
/// </code>
/// </example>
public MQTTService(string domain, int port = 1883, bool autoReconnect = true)
public MQTTService(string domain, int port = 1883, bool autoReconnect = true, bool onBackground = true)
{
topicHandler = new ConcurrentDictionary<string, Action<string, string>>();
MQTTDomain = domain;
@@ -317,8 +319,31 @@ namespace UVC.network
/// <remarks>
/// 이 메서드는 메시지를 로깅하고 해당 토픽에 등록된 모든 핸들러를 호출합니다.
/// </remarks>
private void OnTopic(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
private void OnTopic(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
// 메인 스레드에서 실행 중인지 확인합니다.
bool isMainThread = PlayerLoopHelper.IsMainThread;
//Debug.Log($"MQTT OnTopic isMainThread={isMainThread}, onBackgroundThread:{onBackgroundThread}, {topic.Filter.OriginalFilter}");
if (isMainThread && onBackgroundThread)
{
// 백그라운드 스레드에서 실행
UniTask.RunOnThreadPool(() => OnTopicLogic(client, topic, topicName, message)).Forget();
}
else if (!isMainThread && !onBackgroundThread)
{
// 메인 스레드에서 실행
UniTask.Post(() => OnTopicLogic(client, topic, topicName, message));
}
else
{
// 메인 스레드에서 실행
OnTopicLogic(client, topic, topicName, message);
}
}
private void OnTopicLogic(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
//Debug.Log($"MQTT OnTopicLogic isMainThread={PlayerLoopHelper.IsMainThread}");
string payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
//ULog.Debug($"MQTT OnTopic {topic.Filter.OriginalFilter} => {payload}");
ServerLog.LogMqtt(MQTTDomain, MQTTPort.ToString(), topic.Filter.OriginalFilter, payload, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
@@ -326,23 +351,13 @@ namespace UVC.network
{
if (topicHandler.TryGetValue(topic.Filter.OriginalFilter, out var handler))
{
// 메인 스레드에서 실행 중인지 확인합니다.
bool isMainThread = UniTask.SwitchToMainThread().GetAwaiter().IsCompleted;
Debug.Log($"MQTT OnTopic {topic.Filter.OriginalFilter} => {payload} isMainThread={isMainThread}");
if (isMainThread)
{
// 메인 스레드이므로 핸들러를 직접 호출합니다.
handler.Invoke(topic.Filter.OriginalFilter, payload);
}
else
{
// 백그라운드 스레드이므로 UniTask.Post를 사용하여 메인 스레드로 작업을 보냅니다.
UniTask.Post(() => handler.Invoke(topic.Filter.OriginalFilter, payload));
}
handler.Invoke(topic.Filter.OriginalFilter, payload);
}
}
}
/// <summary>
/// 지정된 토픽으로 메시지를 발행(publish)합니다.
/// </summary>