Files
Simulation/Assets/Generic Client/GenericClient.cs
2025-05-27 10:13:49 +09:00

303 lines
13 KiB
C#

using System.Collections.Generic;
using Best.HTTP.Shared;
using Best.MQTT;
using Best.MQTT.Examples;
using Best.MQTT.Examples.Helpers;
using UnityEngine;
using UnityEngine.UI;
namespace Best.MQTT.Examples
{
public partial class GenericClient : MonoBehaviour
{
#pragma warning disable 0649
[Header("Connect")]
[SerializeField]
private Dropdown templatesDropdown;
[SerializeField]
private InputField hostInput;
[SerializeField]
private InputField portInput;
[SerializeField]
private Dropdown transportDropdown;
[SerializeField]
private InputField pathInput;
[SerializeField]
private Toggle isSecureToggle;
[SerializeField]
private InputField userNameInput;
[SerializeField]
private InputField passwordInput;
[SerializeField]
private InputField keepAliveInput;
[SerializeField]
private Dropdown protocolVersionDropdown;
[SerializeField]
private Button connectButton;
[Header("Connect Last-Will")]
[SerializeField]
private InputField lastWill_TopicInput;
[SerializeField]
private Dropdown lastWill_QoSDropdown;
[SerializeField]
private Toggle lastWill_RetainToggle;
[SerializeField]
private InputField lastWill_MessageInput;
[Header("Publish")]
[SerializeField]
private InputField publish_TopicInput;
[SerializeField]
private Dropdown publish_QoSDropdown;
[SerializeField]
private Toggle publish_RetainToggle;
[SerializeField]
private InputField publish_MessageInput;
[Header("Subscribe")]
[SerializeField]
private InputField subscribe_ColorInput;
[SerializeField]
private Dropdown subscribe_QoSDropdown;
[SerializeField]
private InputField subscribe_TopicInput;
[SerializeField]
private Transform subscribe_ListItemRoot;
[SerializeField]
private SubscriptionListItem subscription_ListItem;
[SerializeField]
private Transform publishSubscribePanel;
[Header("Logs")]
[SerializeField]
private InputField logs_MaxEntriesInput;
[SerializeField]
private Toggle logs_AutoScroll;
[SerializeField]
private TextListItem textListItem;
[SerializeField]
private ScrollRect log_view;
[SerializeField]
private Transform logRoot;
#pragma warning restore
private void Awake()
{
InitUI();
PopulateTemplates();
}
private void AddText(string text)
{
int maxEntries = this.logs_MaxEntriesInput.GetIntValue(100);
if (this.logRoot.childCount >= maxEntries)
{
TrimLogEntries(maxEntries);
var child = this.logRoot.GetChild(0);
child.GetComponent<TextListItem>().SetText(text);
child.SetAsLastSibling();
}
else
{
var item = Instantiate<TextListItem>(this.textListItem, this.logRoot);
item.SetText(text);
}
bool autoScroll = this.logs_AutoScroll.GetBoolValue();
if (autoScroll)
{
this.log_view.normalizedPosition = new Vector2(0, 0);
}
}
private void TrimLogEntries(int maxEntries)
{
while (this.logRoot.childCount > maxEntries)
{
var child = this.logRoot.GetChild(0);
child.transform.SetParent(this.transform);
Destroy(child.gameObject);
}
}
private void InitUI()
{
this.connectButton.GetComponentInChildren<Text>().text = "Connect";
this.connectButton.interactable = true;
this.connectButton.onClick.RemoveAllListeners();
this.connectButton.onClick.AddListener(OnConnectButton);
foreach (var button in this.publishSubscribePanel.GetComponentsInChildren<Button>())
button.interactable = false;
}
class Template
{
public string name;
public string host;
public int port;
public SupportedTransports transport;
public string path = "/mqtt";
public bool isSecure;
public string username = string.Empty;
public string password = string.Empty;
public int keepAliveSeconds = 60;
public SupportedProtocolVersions protocolVersion;
public Template()
{
this.protocolVersion = SupportedProtocolVersions.MQTT_5_0;
}
}
private Template[] templates = new Template[]
{
// broker.mqttdashboard.com
#if !UNITY_WEBGL || UNITY_EDITOR
new Template { name = "HiveMQ - TCP - Unsecure - Unauthenticated", host = "broker.hivemq.com", port = 1883, transport = SupportedTransports.TCP, isSecure = false },
new Template { name = "HiveMQ - WebSocket - Unauthenticated", host = "broker.hivemq.com", port = 8000, transport = SupportedTransports.WebSocket, isSecure = false },
#endif
// broker.emqx.io
#if !UNITY_WEBGL || UNITY_EDITOR
new Template { name = "emqx.com - TCP - Unsecure - Unauthenticated", host = "broker.emqx.io", port = 1883, transport = SupportedTransports.TCP, isSecure = false },
new Template { name = "emqx.com - TCP - Secure - Unauthenticated", host = "broker.emqx.io", port = 8883, transport = SupportedTransports.TCP, isSecure = true },
new Template { name = "emqx.com - WebSocket - Unsecure - Unauthenticated", host = "broker.emqx.io", port = 8083, transport = SupportedTransports.WebSocket, isSecure = false },
#endif
new Template { name = "emqx.com - WebSocket - Secure - Unauthenticated", host = "broker.emqx.io", port = 8084, transport = SupportedTransports.WebSocket, isSecure = true },
// test.mosquitto.org
#if !UNITY_WEBGL || UNITY_EDITOR
new Template{ name ="test.mosquitto.org - TCP - Unsecure - Unauthenticated", host = "test.mosquitto.org", port = 1883, transport = SupportedTransports.TCP, isSecure = false },
new Template{ name ="test.mosquitto.org - TCP - Unsecure - Authenticated (Read/Write)", host = "test.mosquitto.org", port = 1884, transport = SupportedTransports.TCP, isSecure = false, username = "rw", password = "readwrite" },
new Template{ name ="test.mosquitto.org - TCP - Unsecure - Authenticated (Read only)", host = "test.mosquitto.org", port = 1884, transport = SupportedTransports.TCP, isSecure = false, username = "ro", password = "readonly" },
new Template{ name ="test.mosquitto.org - TCP - Unsecure - Authenticated (Write only)", host = "test.mosquitto.org", port = 1884, transport = SupportedTransports.TCP, isSecure = false, username = "wo", password = "writeonly" },
new Template{ name ="test.mosquitto.org - TCP - Secure (Self signed cert) - Unauthenticated", host = "test.mosquitto.org", port = 8883, transport = SupportedTransports.TCP, isSecure = true },
new Template{ name ="test.mosquitto.org - TCP - Secure (Self signed cert) - Client Certificate Required (see docs)", host = "test.mosquitto.org", port = 8884, transport = SupportedTransports.TCP, isSecure = true },
new Template{ name ="test.mosquitto.org - TCP - Secure - Authenticated (Read/Write)", host = "test.mosquitto.org", port = 8885, transport = SupportedTransports.TCP, isSecure = true, username = "rw", password = "readwrite" },
new Template{ name ="test.mosquitto.org - TCP - Secure - Authenticated (Read only)", host = "test.mosquitto.org", port = 8885, transport = SupportedTransports.TCP, isSecure = true, username = "ro", password = "readonly" },
new Template{ name ="test.mosquitto.org - TCP - Secure - Authenticated (Write only)", host = "test.mosquitto.org", port = 8885, transport = SupportedTransports.TCP, isSecure = true, username = "wo", password = "writeonly" },
new Template{ name ="test.mosquitto.org - TCP - Secure (Lets Encrypt cert) - Unauthenticated", host = "test.mosquitto.org", port = 8886, transport = SupportedTransports.TCP, isSecure = true },
new Template{ name ="test.mosquitto.org - TCP - Secure (server certificate deliberately expired) - Unauthenticated", host = "test.mosquitto.org", port = 8887, transport = SupportedTransports.TCP, isSecure = true },
new Template{ name ="test.mosquitto.org - WebSocket - Unsecure - Unauthenticated", host = "test.mosquitto.org", port = 8080, transport = SupportedTransports.WebSocket, isSecure = false },
new Template{ name ="test.mosquitto.org - WebSocket - Unsecure - Authenticated (Read/Write)", host = "test.mosquitto.org", port = 8090, transport = SupportedTransports.WebSocket, isSecure = false, username = "rw", password = "readwrite" },
new Template{ name ="test.mosquitto.org - WebSocket - Unsecure - Authenticated (Read only)", host = "test.mosquitto.org", port = 8090, transport = SupportedTransports.WebSocket, isSecure = false, username = "ro", password = "readonly" },
new Template{ name ="test.mosquitto.org - WebSocket - Unsecure - Authenticated (Write only)", host = "test.mosquitto.org", port = 8090, transport = SupportedTransports.WebSocket, isSecure = false, username = "wo", password = "writeonly" },
#endif
new Template{ name ="test.mosquitto.org - WebSocket - Secure - Unauthenticated", host = "test.mosquitto.org", port = 8081, transport = SupportedTransports.WebSocket, isSecure = true },
new Template{ name ="test.mosquitto.org - WebSocket - Secure - Authenticated (Read/Write)", host = "test.mosquitto.org", port = 8091, transport = SupportedTransports.WebSocket, isSecure = true, username = "rw", password = "readwrite" },
new Template{ name ="test.mosquitto.org - WebSocket - Secure - Authenticated (Read only)", host = "test.mosquitto.org", port = 8091, transport = SupportedTransports.WebSocket, isSecure = true, username = "ro", password = "readonly" },
new Template{ name ="test.mosquitto.org - WebSocket - Secure - Authenticated (Write only)", host = "test.mosquitto.org", port = 8091, transport = SupportedTransports.WebSocket, isSecure = true, username = "wo", password = "writeonly" },
};
private void PopulateTemplates()
{
List<Dropdown.OptionData> options = new List<Dropdown.OptionData>(templates.Length);
for (int i = 0; i < templates.Length; i++)
{
var template = templates[i];
options.Add(new Dropdown.OptionData(template.name));
}
this.templatesDropdown.AddOptions(options);
this.templatesDropdown.onValueChanged.AddListener(OnTemplateSelected);
OnTemplateSelected(0);
}
private void OnTemplateSelected(int idx)
{
var template = this.templates[idx];
this.hostInput.text = template.host;
this.portInput.text = template.port.ToString();
this.transportDropdown.value = (int)template.transport;
this.pathInput.text = template.path;
this.isSecureToggle.isOn = template.isSecure;
this.userNameInput.text = template.username;
this.passwordInput.text = template.password;
this.keepAliveInput.text = template.keepAliveSeconds.ToString();
}
private void SetConnectingUI()
{
this.connectButton.interactable = false;
foreach (var button in this.publishSubscribePanel.GetComponentsInChildren<Button>())
button.interactable = false;
}
private void SetDisconnectedUI()
{
InitUI();
for (int i = 0; i < this.subscriptionListItems.Count; ++i)
Destroy(this.subscriptionListItems[i].gameObject);
this.subscriptionListItems.Clear();
}
private void SetConnectedUI()
{
this.connectButton.GetComponentInChildren<Text>().text = "Disconnect";
this.connectButton.interactable = true;
this.connectButton.onClick.RemoveAllListeners();
this.connectButton.onClick.AddListener(OnDisconnectButton);
foreach (var button in this.publishSubscribePanel.GetComponentsInChildren<Button>())
button.interactable = true;
}
public void ClearLogEntries()
{
TrimLogEntries(0);
}
public void OnLogLevelChanged(int idx)
{
switch (idx)
{
case 0: HTTPManager.Logger.Level = Best.HTTP.Shared.Logger.Loglevels.All; break;
case 1: HTTPManager.Logger.Level = Best.HTTP.Shared.Logger.Loglevels.Warning; break;
case 2: HTTPManager.Logger.Level = Best.HTTP.Shared.Logger.Loglevels.None; break;
}
}
}
}