data package 정리
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user