WebGL 샘플
This commit is contained in:
@@ -246,22 +246,26 @@ namespace UVC.Network
|
||||
headerObject.Add(kvp.Key, kvp.Value);
|
||||
}
|
||||
}
|
||||
HttpLogEntry log = ServerLog.LogHttpRequest(url, methodString, headerObject.ToString(Formatting.None), body, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
|
||||
//Debug.Log($"Request APIToken :{AuthService.Instance.Entiti.accessToken}");
|
||||
|
||||
if (body != null)
|
||||
{
|
||||
request.UploadSettings.UploadStream = new MemoryStream(Encoding.UTF8.GetBytes(body));
|
||||
}
|
||||
|
||||
#if !UNITY_WEBGL || UNITY_EDITOR
|
||||
HttpLogEntry log = ServerLog.LogHttpRequest(url, methodString, headerObject.ToString(Formatting.None), body, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
|
||||
//Debug.Log($"Request APIToken :{AuthService.Instance.Entiti.accessToken}");
|
||||
bool isMainThread = PlayerLoopHelper.IsMainThread;
|
||||
#endif
|
||||
//var response = await request.GetFromJsonResultAsync<T>();
|
||||
var response = await request.GetAsStringAsync();
|
||||
|
||||
#if !UNITY_WEBGL || UNITY_EDITOR
|
||||
if (!isMainThread) await UniTask.SwitchToThreadPool();
|
||||
log.ResponseData = response;
|
||||
log.ResponseDate = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
|
||||
#endif
|
||||
ServerLog.LogHttpResponse(log);
|
||||
#endif
|
||||
//T가 string이면
|
||||
if (typeof(T) == typeof(string))
|
||||
{
|
||||
|
||||
@@ -37,12 +37,17 @@ namespace UVC.network
|
||||
/// <value>클라이언트가 초기화되고 브로커에 연결된 경우 <c>true</c>를 반환합니다.</value>
|
||||
public bool IsConnected => client != null && client.State == ClientStates.Connected;
|
||||
|
||||
private bool useTLS = false;
|
||||
|
||||
private bool useWebSocket = false;
|
||||
|
||||
/// <summary>
|
||||
/// MQTTService 인스턴스를 생성합니다.
|
||||
/// </summary>
|
||||
/// <param name="domain">MQTT 브로커의 호스트명 또는 IP 주소입니다.</param>
|
||||
/// <param name="port">MQTT 브로커의 포트 번호입니다.</param>
|
||||
/// <param name="useWebSocket">WebSocket을 통해 연결할지 여부입니다.</param>
|
||||
/// <param name="useTLS">TLS 암호화를 사용할지 여부입니다.</param>
|
||||
/// <param name="autoReconnect">연결이 끊겼을 때 자동으로 재연결을 시도할지 여부입니다.</param>
|
||||
/// <param name="onBackground">Handler를 백그라운드 스레드에서 호출 할지 여부</param>
|
||||
/// <example>
|
||||
@@ -54,12 +59,14 @@ namespace UVC.network
|
||||
/// var mqttService = new MQTTService("mqtt.example.com", 8883, false);
|
||||
/// </code>
|
||||
/// </example>
|
||||
public MQTTService(string domain, int port = 1883, bool autoReconnect = true, bool onBackground = true)
|
||||
public MQTTService(string domain, int port = 1883, bool useWebSocket = false, bool useTLS = false, bool autoReconnect = true, bool onBackground = true)
|
||||
{
|
||||
topicHandler = new ConcurrentDictionary<string, Action<string, string>>();
|
||||
MQTTDomain = domain;
|
||||
MQTTPort = port;
|
||||
this.autoReconnect = autoReconnect;
|
||||
this.useTLS = useTLS;
|
||||
this.useWebSocket = useWebSocket;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -71,15 +78,20 @@ namespace UVC.network
|
||||
private void CreateMQTTClient()
|
||||
{
|
||||
ULog.Debug($"MQTT Domain:{MQTTDomain} , MQTTPORT:{MQTTPort}");
|
||||
var options = new ConnectionOptionsBuilder()
|
||||
#if UNITY_WEBGL && !UNITY_EDITOR
|
||||
.WithWebSocket(MQTTDomain, MQTTPort)
|
||||
.WithPath("/mqtt") // 필요 시 "/ws" 등 브로커/프록시 설정과 일치하게 변경
|
||||
// .WithTLS() // wss://가 필요하면 활성화
|
||||
#else
|
||||
.WithTCP(MQTTDomain, MQTTPort)
|
||||
var builder = new ConnectionOptionsBuilder();
|
||||
if (useWebSocket) {
|
||||
builder.WithWebSocket(MQTTDomain, MQTTPort)
|
||||
.WithPath("/mqtt"); // 필요 시 "/ws" 등 브로커/프록시 설정과 일치하게 변경
|
||||
}
|
||||
else {
|
||||
#if !UNITY_WEBGL || UNITY_EDITOR
|
||||
builder.WithTCP(MQTTDomain, MQTTPort);
|
||||
#endif
|
||||
.Build();
|
||||
}
|
||||
|
||||
if(useTLS) builder.WithTLS();
|
||||
|
||||
var options = builder.Build();
|
||||
|
||||
if (client != null) Disconnect();
|
||||
|
||||
@@ -334,23 +346,25 @@ namespace UVC.network
|
||||
// 웹GL 대응: 스레드풀 미지원 시 메인 스레드로 포스트
|
||||
private void DispatchTopic(Action work)
|
||||
{
|
||||
#if UNITY_WEBGL && !UNITY_EDITOR
|
||||
// WebGL: 스레드풀 없음 → 다음 프레임에 메인 스레드로 실행
|
||||
UniTask.Post(work);
|
||||
#else
|
||||
|
||||
if (onBackgroundThread)
|
||||
if (useWebSocket)
|
||||
{
|
||||
UniTask.RunOnThreadPool(work).Forget();
|
||||
// WebGL: 스레드풀 없음 → 다음 프레임에 메인 스레드로 실행
|
||||
UniTask.Post(work);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PlayerLoopHelper.IsMainThread)
|
||||
work();
|
||||
if (onBackgroundThread)
|
||||
{
|
||||
UniTask.RunOnThreadPool(work).Forget();
|
||||
}
|
||||
else
|
||||
UniTask.Post(work);
|
||||
{
|
||||
if (PlayerLoopHelper.IsMainThread)
|
||||
work();
|
||||
else
|
||||
UniTask.Post(work);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -359,7 +373,9 @@ namespace UVC.network
|
||||
//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}");
|
||||
#if !UNITY_WEBGL || UNITY_EDITOR
|
||||
ServerLog.LogMqtt(MQTTDomain, MQTTPort.ToString(), topic.Filter.OriginalFilter, payload, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
|
||||
#endif
|
||||
if(payload.Trim().Length > 0)
|
||||
{
|
||||
if (topicHandler.TryGetValue(topic.Filter.OriginalFilter, out var handler))
|
||||
|
||||
Reference in New Issue
Block a user