Added MQTT tester, added input service
This commit is contained in:
		| @@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Authorization; | ||||
|  | ||||
| namespace Birdmap.API.Controllers | ||||
| { | ||||
|     [Authorize] | ||||
|     [Authorize(Roles = "Admin")] | ||||
|     [ApiController] | ||||
|     [Route("api/[controller]")] | ||||
|     public class DevicesController : ControllerBase | ||||
| @@ -26,6 +26,7 @@ namespace Birdmap.API.Controllers | ||||
|  | ||||
|         /// <summary>Get all device info</summary> | ||||
|         /// <returns>Array of devices</returns> | ||||
|         [Authorize(Roles = "User,Admin")] | ||||
|         [HttpGet] | ||||
|         public async Task<ActionResult<List<Device>>> Getall() | ||||
|         { | ||||
| @@ -61,6 +62,7 @@ namespace Birdmap.API.Controllers | ||||
|         /// <summary>Get all device info</summary> | ||||
|         /// <param name="deviceID">ID of device to query</param> | ||||
|         /// <returns>Information about a particular device</returns> | ||||
|         [Authorize(Roles = "User,Admin")] | ||||
|         [HttpGet, Route("{deviceID}")] | ||||
|         public async Task<ActionResult<Device>> Getdevice([BindRequired] Guid deviceID) | ||||
|         { | ||||
| @@ -99,6 +101,7 @@ namespace Birdmap.API.Controllers | ||||
|         /// <param name="deviceID">ID of device to query</param> | ||||
|         /// <param name="sensorID">ID of sensor to query</param> | ||||
|         /// <returns>Information about a sensor</returns> | ||||
|         [Authorize(Roles = "User,Admin")] | ||||
|         [HttpGet, Route("{deviceID}/{sensorID}")] | ||||
|         public async Task<ActionResult<Sensor>> Getsensor([BindRequired] Guid deviceID, [BindRequired] Guid sensorID) | ||||
|         { | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using System.Threading.Tasks; | ||||
|  | ||||
| namespace Birdmap.API.Controllers | ||||
| { | ||||
|     [Authorize] | ||||
|     [Authorize(Roles = "Admin")] | ||||
|     [ApiController] | ||||
|     [Route("api/[controller]")] | ||||
|     public class ServicesController : ControllerBase | ||||
| @@ -30,6 +30,7 @@ namespace Birdmap.API.Controllers | ||||
|             _logger = logger; | ||||
|         } | ||||
|  | ||||
|         [Authorize(Roles = "User,Admin")] | ||||
|         [HttpGet, ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         public async Task<ActionResult<List<ServiceInfo>>> GetAsync() | ||||
|         { | ||||
|   | ||||
							
								
								
									
										16
									
								
								Birdmap.BLL/Helpers/IEnumerableExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								Birdmap.BLL/Helpers/IEnumerableExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Birdmap.BLL.Helpers | ||||
| { | ||||
|     public static class IEnumerableExtensions | ||||
|     { | ||||
|         public static TSource RandomElementAt<TSource>(this IEnumerable<TSource> source, Random random = null) | ||||
|         { | ||||
|             random ??= new Random(); | ||||
|  | ||||
|             return source.ElementAt(random.Next(source.Count())); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										163
									
								
								Birdmap.BLL/Interfaces/IInputService.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								Birdmap.BLL/Interfaces/IInputService.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
|  | ||||
| namespace Birdmap.BLL.Interfaces | ||||
| { | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")] | ||||
|     public partial interface IInputService | ||||
|     { | ||||
|         /// <summary>Get input object by ID</summary> | ||||
|         /// <param name="tagID">ID of input object file</param> | ||||
|         /// <returns>input object</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         System.Threading.Tasks.Task<InputSingeResponse> GetInputAsync(System.Guid tagID); | ||||
|  | ||||
|         /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||||
|         /// <summary>Get input object by ID</summary> | ||||
|         /// <param name="tagID">ID of input object file</param> | ||||
|         /// <returns>input object</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         System.Threading.Tasks.Task<InputSingeResponse> GetInputAsync(System.Guid tagID, System.Threading.CancellationToken cancellationToken); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     public partial class InputSingeResponse | ||||
|     { | ||||
|         [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||
|         public string Status { get; set; } | ||||
|  | ||||
|         [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required] | ||||
|         public InputObject Message { get; set; } = new InputObject(); | ||||
|  | ||||
|         private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); | ||||
|  | ||||
|         [Newtonsoft.Json.JsonExtensionData] | ||||
|         public System.Collections.Generic.IDictionary<string, object> AdditionalProperties | ||||
|         { | ||||
|             get { return _additionalProperties; } | ||||
|             set { _additionalProperties = value; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     public partial class InputResponse : System.Collections.ObjectModel.Collection<InputObject> | ||||
|     { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     public partial class InputObject | ||||
|     { | ||||
|         [Newtonsoft.Json.JsonProperty("tag", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||
|         public System.Guid Tag { get; set; } | ||||
|  | ||||
|         [Newtonsoft.Json.JsonProperty("date", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||
|         [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))] | ||||
|         public System.DateTimeOffset Date { get; set; } | ||||
|  | ||||
|         [Newtonsoft.Json.JsonProperty("device_id", Required = Newtonsoft.Json.Required.Always)] | ||||
|         public Guid Device_id { get; set; } | ||||
|  | ||||
|         private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); | ||||
|  | ||||
|         [Newtonsoft.Json.JsonExtensionData] | ||||
|         public System.Collections.Generic.IDictionary<string, object> AdditionalProperties | ||||
|         { | ||||
|             get { return _additionalProperties; } | ||||
|             set { _additionalProperties = value; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     public partial class ApiResponse | ||||
|     { | ||||
|         [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||
|         public string Status { get; set; } | ||||
|  | ||||
|         [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)] | ||||
|         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||
|         public string Message { get; set; } | ||||
|  | ||||
|         private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); | ||||
|  | ||||
|         [Newtonsoft.Json.JsonExtensionData] | ||||
|         public System.Collections.Generic.IDictionary<string, object> AdditionalProperties | ||||
|         { | ||||
|             get { return _additionalProperties; } | ||||
|             set { _additionalProperties = value; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     public partial class Description | ||||
|     { | ||||
|         [Newtonsoft.Json.JsonProperty("deviceid", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] | ||||
|         public string Deviceid { get; set; } | ||||
|  | ||||
|         [Newtonsoft.Json.JsonProperty("date", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] | ||||
|         [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))] | ||||
|         public System.DateTimeOffset Date { get; set; } | ||||
|  | ||||
|         private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); | ||||
|  | ||||
|         [Newtonsoft.Json.JsonExtensionData] | ||||
|         public System.Collections.Generic.IDictionary<string, object> AdditionalProperties | ||||
|         { | ||||
|             get { return _additionalProperties; } | ||||
|             set { _additionalProperties = value; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")] | ||||
|     internal class DateFormatConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter | ||||
|     { | ||||
|         public DateFormatConverter() | ||||
|         { | ||||
|             DateTimeFormat = "yyyy-MM-dd"; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")] | ||||
|     public partial class FileParameter | ||||
|     { | ||||
|         public FileParameter(System.IO.Stream data) | ||||
|             : this(data, null, null) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         public FileParameter(System.IO.Stream data, string fileName) | ||||
|             : this(data, fileName, null) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         public FileParameter(System.IO.Stream data, string fileName, string contentType) | ||||
|         { | ||||
|             Data = data; | ||||
|             FileName = fileName; | ||||
|             ContentType = contentType; | ||||
|         } | ||||
|  | ||||
|         public System.IO.Stream Data { get; private set; } | ||||
|  | ||||
|         public string FileName { get; private set; } | ||||
|  | ||||
|         public string ContentType { get; private set; } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -6,8 +6,12 @@ using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace Birdmap.BLL.Services | ||||
| { | ||||
|     public abstract class DeviceServiceBase : IDeviceService | ||||
|     public abstract class DeviceAndInputServiceBase : IDeviceService, IInputService | ||||
|     { | ||||
|         public virtual Task<InputSingeResponse> GetInputAsync(Guid tagID) | ||||
|             => GetInputAsync(tagID, CancellationToken.None); | ||||
|         public abstract Task<InputSingeResponse> GetInputAsync(Guid tagID, CancellationToken cancellationToken); | ||||
| 
 | ||||
|         public virtual Task<ICollection<Device>> GetallAsync() | ||||
|             => GetallAsync(CancellationToken.None); | ||||
|         public abstract Task<ICollection<Device>> GetallAsync(CancellationToken cancellationToken); | ||||
| @@ -1,4 +1,5 @@ | ||||
| using Birdmap.BLL.Interfaces; | ||||
| using Birdmap.BLL.Helpers; | ||||
| using Birdmap.BLL.Interfaces; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| @@ -7,33 +8,40 @@ using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace Birdmap.BLL.Services | ||||
| { | ||||
|     public class DummyDeviceService : DeviceServiceBase | ||||
|     public class DummyDeviceAndInputService : DeviceAndInputServiceBase | ||||
|     { | ||||
|         private const int numberOfDevices = 15; | ||||
| 
 | ||||
|         private const double centerLong = 21.469640; | ||||
|         private const double centerLat = 48.275939; | ||||
|         private const double radius = 0.000200; | ||||
| 
 | ||||
|         private readonly Lazy<ICollection<Device>> _devices = new Lazy<ICollection<Device>>(GenerateDevices); | ||||
|         private static readonly Random Rand = new Random(); | ||||
| 
 | ||||
|         private static readonly Lazy<ICollection<Device>> Devices = new Lazy<ICollection<Device>>(GenerateDevices); | ||||
| 
 | ||||
|         private static readonly Dictionary<Guid, InputSingeResponse> TagToInput = new Dictionary<Guid, InputSingeResponse>(); | ||||
|         private static readonly object InputLock = new object(); | ||||
| 
 | ||||
|         private static ListOfDevices GenerateDevices() | ||||
|         { | ||||
|             var devices = new ListOfDevices(); | ||||
|             var rand = new Random(); | ||||
| 
 | ||||
|             T GetRandomEnum<T>() | ||||
|             { | ||||
|                 var values = Enum.GetValues(typeof(T)); | ||||
|                 return (T)values.GetValue(rand.Next(values.Length)); | ||||
|                 return (T)values.GetValue(Rand.Next(values.Length)); | ||||
|             } | ||||
| 
 | ||||
|             double GetPlusMinus(double center, double radius) | ||||
|             { | ||||
|                 return center - radius + rand.NextDouble() * radius * 2; | ||||
|                 return center - radius + Rand.NextDouble() * radius * 2; | ||||
|             } | ||||
| 
 | ||||
|             for (int d = 0; d < 15; d++) | ||||
|             for (int d = 0; d < numberOfDevices; d++) | ||||
|             { | ||||
|                 var sensors = new ArrayofSensors(); | ||||
|                 for (int s = 0; s < rand.Next(1, 5); s++) | ||||
|                 for (int s = 0; s < Rand.Next(1, 6); s++) | ||||
|                 { | ||||
|                     sensors.Add(new Sensor | ||||
|                     { | ||||
| @@ -61,17 +69,17 @@ namespace Birdmap.BLL.Services | ||||
| 
 | ||||
|         public override Task<ICollection<Device>> GetallAsync(CancellationToken cancellationToken) | ||||
|         { | ||||
|             return Task.FromResult(_devices.Value); | ||||
|             return Task.FromResult(Devices.Value); | ||||
|         } | ||||
| 
 | ||||
|         public override Task<Device> GetdeviceAsync(Guid deviceID, CancellationToken cancellationToken) | ||||
|         { | ||||
|             return Task.FromResult(_devices.Value.SingleOrDefault(d => d.Id == deviceID)); | ||||
|             return Task.FromResult(Devices.Value.SingleOrDefault(d => d.Id == deviceID)); | ||||
|         } | ||||
| 
 | ||||
|         public override Task<Sensor> GetsensorAsync(Guid deviceID, Guid sensorID, CancellationToken cancellationToken) | ||||
|         { | ||||
|             return Task.FromResult(_devices.Value.SingleOrDefault(d => d.Id == deviceID)?.Sensors.SingleOrDefault(s => s.Id == sensorID)); | ||||
|             return Task.FromResult(Devices.Value.SingleOrDefault(d => d.Id == deviceID)?.Sensors.SingleOrDefault(s => s.Id == sensorID)); | ||||
|         } | ||||
| 
 | ||||
|         public override Task OfflineallAsync(CancellationToken cancellationToken) | ||||
| @@ -114,7 +122,7 @@ namespace Birdmap.BLL.Services | ||||
| 
 | ||||
|         private void SetStatus(DeviceStatus deviceStatus, SensorStatus sensorStatus) | ||||
|         { | ||||
|             foreach (var device in _devices.Value) | ||||
|             foreach (var device in Devices.Value) | ||||
|             { | ||||
|                 device.Status = deviceStatus; | ||||
|                 foreach (var sensor in device.Sensors) | ||||
| @@ -135,5 +143,29 @@ namespace Birdmap.BLL.Services | ||||
|             var sensor = GetsensorAsync(deviceId, sensorID).Result; | ||||
|             sensor.Status = status; | ||||
|         } | ||||
| 
 | ||||
|         public override Task<InputSingeResponse> GetInputAsync(Guid tagID, CancellationToken cancellationToken) | ||||
|         { | ||||
|             lock (InputLock) | ||||
|             { | ||||
|                 if (!TagToInput.TryGetValue(tagID, out var value)) | ||||
|                 { | ||||
|                     value = new InputSingeResponse | ||||
|                     { | ||||
|                         Status = "Dummy_OK", | ||||
|                         Message = new InputObject | ||||
|                         { | ||||
|                             Tag = tagID, | ||||
|                             Date = DateTime.Now, | ||||
|                             Device_id = Devices.Value.Where(d => d.Status == DeviceStatus.Online).RandomElementAt(Rand).Id, | ||||
|                         } | ||||
|                     }; | ||||
| 
 | ||||
|                     TagToInput.TryAdd(tagID, value); | ||||
|                 } | ||||
| 
 | ||||
|                 return Task.FromResult(value); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										477
									
								
								Birdmap.BLL/Services/LiveInputService.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										477
									
								
								Birdmap.BLL/Services/LiveInputService.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,477 @@ | ||||
| //---------------------- | ||||
| // <auto-generated> | ||||
| //     Generated using the NSwag toolchain v13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org) | ||||
| // </auto-generated> | ||||
| //---------------------- | ||||
|  | ||||
| #pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." | ||||
| #pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." | ||||
| #pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' | ||||
| #pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... | ||||
| #pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." | ||||
|  | ||||
| namespace Birdmap.BLL.Services | ||||
| { | ||||
|     using Birdmap.BLL.Interfaces; | ||||
|     using System = global::System; | ||||
|  | ||||
|     [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")] | ||||
|     public partial class LiveInputService : IInputService | ||||
|     { | ||||
|         private string _baseUrl = "https://birb.k8s.kmlabz.com"; | ||||
|         private System.Net.Http.HttpClient _httpClient; | ||||
|         private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings; | ||||
|  | ||||
|         public LiveInputService(System.Net.Http.HttpClient httpClient) | ||||
|         { | ||||
|             _httpClient = httpClient; | ||||
|             _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings); | ||||
|         } | ||||
|  | ||||
|         private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() | ||||
|         { | ||||
|             var settings = new Newtonsoft.Json.JsonSerializerSettings(); | ||||
|             UpdateJsonSerializerSettings(settings); | ||||
|             return settings; | ||||
|         } | ||||
|  | ||||
|         public string BaseUrl | ||||
|         { | ||||
|             get { return _baseUrl; } | ||||
|             set { _baseUrl = value; } | ||||
|         } | ||||
|  | ||||
|         protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } | ||||
|  | ||||
|         partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); | ||||
|         partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); | ||||
|         partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); | ||||
|         partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); | ||||
|  | ||||
|         /// <summary>Get all stored input queries</summary> | ||||
|         /// <returns>Array of input objects</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public System.Threading.Tasks.Task<System.Collections.Generic.ICollection<InputObject>> GetallAsync() | ||||
|         { | ||||
|             return GetallAsync(System.Threading.CancellationToken.None); | ||||
|         } | ||||
|  | ||||
|         /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||||
|         /// <summary>Get all stored input queries</summary> | ||||
|         /// <returns>Array of input objects</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<InputObject>> GetallAsync(System.Threading.CancellationToken cancellationToken) | ||||
|         { | ||||
|             var urlBuilder_ = new System.Text.StringBuilder(); | ||||
|             urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample"); | ||||
|  | ||||
|             var client_ = _httpClient; | ||||
|             var disposeClient_ = false; | ||||
|             try | ||||
|             { | ||||
|                 using (var request_ = new System.Net.Http.HttpRequestMessage()) | ||||
|                 { | ||||
|                     request_.Method = new System.Net.Http.HttpMethod("GET"); | ||||
|                     request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); | ||||
|  | ||||
|                     PrepareRequest(client_, request_, urlBuilder_); | ||||
|                     var url_ = urlBuilder_.ToString(); | ||||
|                     request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); | ||||
|                     PrepareRequest(client_, request_, url_); | ||||
|  | ||||
|                     var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); | ||||
|                     var disposeResponse_ = true; | ||||
|                     try | ||||
|                     { | ||||
|                         var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); | ||||
|                         if (response_.Content != null && response_.Content.Headers != null) | ||||
|                         { | ||||
|                             foreach (var item_ in response_.Content.Headers) | ||||
|                                 headers_[item_.Key] = item_.Value; | ||||
|                         } | ||||
|  | ||||
|                         ProcessResponse(client_, response_); | ||||
|  | ||||
|                         var status_ = (int)response_.StatusCode; | ||||
|                         if (status_ == 200) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<System.Collections.Generic.ICollection<InputObject>>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             return objectResponse_.Object; | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 404) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("No object matching filter", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||
|                             throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); | ||||
|                         } | ||||
|                     } | ||||
|                     finally | ||||
|                     { | ||||
|                         if (disposeResponse_) | ||||
|                             response_.Dispose(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                 if (disposeClient_) | ||||
|                     client_.Dispose(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary>uploads a sample into the system</summary> | ||||
|         /// <returns>successful operation</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public System.Threading.Tasks.Task<ApiResponse> UploadFileAsync(Description description, FileParameter file) | ||||
|         { | ||||
|             return UploadFileAsync(description, file, System.Threading.CancellationToken.None); | ||||
|         } | ||||
|  | ||||
|         /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||||
|         /// <summary>uploads a sample into the system</summary> | ||||
|         /// <returns>successful operation</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public async System.Threading.Tasks.Task<ApiResponse> UploadFileAsync(Description description, FileParameter file, System.Threading.CancellationToken cancellationToken) | ||||
|         { | ||||
|             var urlBuilder_ = new System.Text.StringBuilder(); | ||||
|             urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample"); | ||||
|  | ||||
|             var client_ = _httpClient; | ||||
|             var disposeClient_ = false; | ||||
|             try | ||||
|             { | ||||
|                 using (var request_ = new System.Net.Http.HttpRequestMessage()) | ||||
|                 { | ||||
|                     var boundary_ = System.Guid.NewGuid().ToString(); | ||||
|                     var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); | ||||
|                     content_.Headers.Remove("Content-Type"); | ||||
|                     content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); | ||||
|                     if (description == null) | ||||
|                         throw new System.ArgumentNullException("description"); | ||||
|                     else | ||||
|                     { | ||||
|                         content_.Add(new System.Net.Http.StringContent(ConvertToString(description, System.Globalization.CultureInfo.InvariantCulture)), "description"); | ||||
|                     } | ||||
|                     if (file == null) | ||||
|                         throw new System.ArgumentNullException("file"); | ||||
|                     else | ||||
|                     { | ||||
|                         var content_file_ = new System.Net.Http.StreamContent(file.Data); | ||||
|                         if (!string.IsNullOrEmpty(file.ContentType)) | ||||
|                             content_file_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(file.ContentType); | ||||
|                         content_.Add(content_file_, "file", file.FileName ?? "file"); | ||||
|                     } | ||||
|                     request_.Content = content_; | ||||
|                     request_.Method = new System.Net.Http.HttpMethod("POST"); | ||||
|                     request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); | ||||
|  | ||||
|                     PrepareRequest(client_, request_, urlBuilder_); | ||||
|                     var url_ = urlBuilder_.ToString(); | ||||
|                     request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); | ||||
|                     PrepareRequest(client_, request_, url_); | ||||
|  | ||||
|                     var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); | ||||
|                     var disposeResponse_ = true; | ||||
|                     try | ||||
|                     { | ||||
|                         var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); | ||||
|                         if (response_.Content != null && response_.Content.Headers != null) | ||||
|                         { | ||||
|                             foreach (var item_ in response_.Content.Headers) | ||||
|                                 headers_[item_.Key] = item_.Value; | ||||
|                         } | ||||
|  | ||||
|                         ProcessResponse(client_, response_); | ||||
|  | ||||
|                         var status_ = (int)response_.StatusCode; | ||||
|                         if (status_ == 200) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             return objectResponse_.Object; | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 400) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("JSON parse error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 415) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("Media type error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 417) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("JSON invalid schema", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 469) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("No file found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 470) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("Description missing", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||
|                             throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); | ||||
|                         } | ||||
|                     } | ||||
|                     finally | ||||
|                     { | ||||
|                         if (disposeResponse_) | ||||
|                             response_.Dispose(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                 if (disposeClient_) | ||||
|                     client_.Dispose(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary>Get input object by ID</summary> | ||||
|         /// <param name="tagID">ID of input object file</param> | ||||
|         /// <returns>input object</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public System.Threading.Tasks.Task<InputSingeResponse> GetInputAsync(System.Guid tagID) | ||||
|         { | ||||
|             return GetInputAsync(tagID, System.Threading.CancellationToken.None); | ||||
|         } | ||||
|  | ||||
|         /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||||
|         /// <summary>Get input object by ID</summary> | ||||
|         /// <param name="tagID">ID of input object file</param> | ||||
|         /// <returns>input object</returns> | ||||
|         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||
|         public async System.Threading.Tasks.Task<InputSingeResponse> GetInputAsync(System.Guid tagID, System.Threading.CancellationToken cancellationToken) | ||||
|         { | ||||
|             if (tagID == null) | ||||
|                 throw new System.ArgumentNullException("tagID"); | ||||
|  | ||||
|             var urlBuilder_ = new System.Text.StringBuilder(); | ||||
|             urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample/{tagID}"); | ||||
|             urlBuilder_.Replace("{tagID}", System.Uri.EscapeDataString(ConvertToString(tagID, System.Globalization.CultureInfo.InvariantCulture))); | ||||
|  | ||||
|             var client_ = _httpClient; | ||||
|             var disposeClient_ = false; | ||||
|             try | ||||
|             { | ||||
|                 using (var request_ = new System.Net.Http.HttpRequestMessage()) | ||||
|                 { | ||||
|                     request_.Method = new System.Net.Http.HttpMethod("GET"); | ||||
|                     request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); | ||||
|  | ||||
|                     PrepareRequest(client_, request_, urlBuilder_); | ||||
|                     var url_ = urlBuilder_.ToString(); | ||||
|                     request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); | ||||
|                     PrepareRequest(client_, request_, url_); | ||||
|  | ||||
|                     var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); | ||||
|                     var disposeResponse_ = true; | ||||
|                     try | ||||
|                     { | ||||
|                         var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); | ||||
|                         if (response_.Content != null && response_.Content.Headers != null) | ||||
|                         { | ||||
|                             foreach (var item_ in response_.Content.Headers) | ||||
|                                 headers_[item_.Key] = item_.Value; | ||||
|                         } | ||||
|  | ||||
|                         ProcessResponse(client_, response_); | ||||
|  | ||||
|                         var status_ = (int)response_.StatusCode; | ||||
|                         if (status_ == 200) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<InputSingeResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             return objectResponse_.Object; | ||||
|                         } | ||||
|                         else | ||||
|                         if (status_ == 404) | ||||
|                         { | ||||
|                             var objectResponse_ = await ReadObjectResponseAsync<ApiResponse>(response_, headers_).ConfigureAwait(false); | ||||
|                             if (objectResponse_.Object == null) | ||||
|                             { | ||||
|                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||
|                             } | ||||
|                             throw new ApiException<ApiResponse>("Tag not found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||
|                             throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); | ||||
|                         } | ||||
|                     } | ||||
|                     finally | ||||
|                     { | ||||
|                         if (disposeResponse_) | ||||
|                             response_.Dispose(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                 if (disposeClient_) | ||||
|                     client_.Dispose(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected struct ObjectResponseResult<T> | ||||
|         { | ||||
|             public ObjectResponseResult(T responseObject, string responseText) | ||||
|             { | ||||
|                 this.Object = responseObject; | ||||
|                 this.Text = responseText; | ||||
|             } | ||||
|  | ||||
|             public T Object { get; } | ||||
|  | ||||
|             public string Text { get; } | ||||
|         } | ||||
|  | ||||
|         public bool ReadResponseAsString { get; set; } | ||||
|  | ||||
|         protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers) | ||||
|         { | ||||
|             if (response == null || response.Content == null) | ||||
|             { | ||||
|                 return new ObjectResponseResult<T>(default(T), string.Empty); | ||||
|             } | ||||
|  | ||||
|             if (ReadResponseAsString) | ||||
|             { | ||||
|                 var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||
|                 try | ||||
|                 { | ||||
|                     var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings); | ||||
|                     return new ObjectResponseResult<T>(typedBody, responseText); | ||||
|                 } | ||||
|                 catch (Newtonsoft.Json.JsonException exception) | ||||
|                 { | ||||
|                     var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; | ||||
|                     throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) | ||||
|                     using (var streamReader = new System.IO.StreamReader(responseStream)) | ||||
|                     using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) | ||||
|                     { | ||||
|                         var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); | ||||
|                         var typedBody = serializer.Deserialize<T>(jsonTextReader); | ||||
|                         return new ObjectResponseResult<T>(typedBody, string.Empty); | ||||
|                     } | ||||
|                 } | ||||
|                 catch (Newtonsoft.Json.JsonException exception) | ||||
|                 { | ||||
|                     var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; | ||||
|                     throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) | ||||
|         { | ||||
|             if (value == null) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             if (value is System.Enum) | ||||
|             { | ||||
|                 var name = System.Enum.GetName(value.GetType(), value); | ||||
|                 if (name != null) | ||||
|                 { | ||||
|                     var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); | ||||
|                     if (field != null) | ||||
|                     { | ||||
|                         var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) | ||||
|                             as System.Runtime.Serialization.EnumMemberAttribute; | ||||
|                         if (attribute != null) | ||||
|                         { | ||||
|                             return attribute.Value != null ? attribute.Value : name; | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); | ||||
|                 } | ||||
|             } | ||||
|             else if (value is bool) | ||||
|             { | ||||
|                 return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); | ||||
|             } | ||||
|             else if (value is byte[]) | ||||
|             { | ||||
|                 return System.Convert.ToBase64String((byte[])value); | ||||
|             } | ||||
|             else if (value.GetType().IsArray) | ||||
|             { | ||||
|                 var array = System.Linq.Enumerable.OfType<object>((System.Array)value); | ||||
|                 return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); | ||||
|             } | ||||
|  | ||||
|             var result = System.Convert.ToString(value, cultureInfo); | ||||
|             return (result is null) ? string.Empty : result; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| #pragma warning restore 1591 | ||||
| #pragma warning restore 1573 | ||||
| #pragma warning restore 472 | ||||
| #pragma warning restore 114 | ||||
| #pragma warning restore 108 | ||||
| @@ -14,9 +14,15 @@ namespace Birdmap.BLL | ||||
|             services.AddTransient<IServiceService, ServiceService>(); | ||||
|  | ||||
|             if (configuration.GetValue<bool>("UseDummyServices")) | ||||
|                 services.AddTransient<IDeviceService, DummyDeviceService>(); | ||||
|             { | ||||
|                 services.AddTransient<IInputService, DummyDeviceAndInputService>(); | ||||
|                 services.AddTransient<IDeviceService, DummyDeviceAndInputService>(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 services.AddTransient<IInputService, LiveInputService>(); | ||||
|                 services.AddTransient<IDeviceService, LiveDummyService>(); | ||||
|             } | ||||
|  | ||||
|             return services; | ||||
|         } | ||||
|   | ||||
| @@ -9,7 +9,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Birdmap.BLL", "Birdmap.BLL\ | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Birdmap.DAL", "Birdmap.DAL\Birdmap.DAL.csproj", "{543FAB06-B960-41A9-8865-1624A2ED2170}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Birdmap.Common", "Birdmap.Common\Birdmap.Common.csproj", "{CE96BAFA-A0FD-4010-8EF2-700451091F71}" | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Birdmap.Common", "Birdmap.Common\Birdmap.Common.csproj", "{CE96BAFA-A0FD-4010-8EF2-700451091F71}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.TestApp.WinForm", "MQTTnet.TestApp.WinForm\MQTTnet.TestApp.WinForm.csproj", "{E1707FE7-4A65-42AC-B71C-6CC1A55FC42A}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| @@ -33,6 +35,10 @@ Global | ||||
| 		{CE96BAFA-A0FD-4010-8EF2-700451091F71}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{CE96BAFA-A0FD-4010-8EF2-700451091F71}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{CE96BAFA-A0FD-4010-8EF2-700451091F71}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{E1707FE7-4A65-42AC-B71C-6CC1A55FC42A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{E1707FE7-4A65-42AC-B71C-6CC1A55FC42A}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{E1707FE7-4A65-42AC-B71C-6CC1A55FC42A}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{E1707FE7-4A65-42AC-B71C-6CC1A55FC42A}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
|   | ||||
							
								
								
									
										394
									
								
								MQTTnet.TestApp.WinForm/Form1.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										394
									
								
								MQTTnet.TestApp.WinForm/Form1.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,394 @@ | ||||
| namespace MQTTnet.TestApp.WinForm | ||||
| { | ||||
| 	partial class Form1 | ||||
| 	{ | ||||
| 		/// <summary> | ||||
| 		///  Required designer variable. | ||||
| 		/// </summary> | ||||
| 		private System.ComponentModel.IContainer components = null; | ||||
|  | ||||
| 		/// <summary> | ||||
| 		///  Clean up any resources being used. | ||||
| 		/// </summary> | ||||
| 		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||||
| 		protected override void Dispose(bool disposing) | ||||
| 		{ | ||||
| 			if (disposing && (components != null)) | ||||
| 			{ | ||||
| 				components.Dispose(); | ||||
| 			} | ||||
| 			base.Dispose(disposing); | ||||
| 		} | ||||
|  | ||||
| 		#region Windows Form Designer generated code | ||||
|  | ||||
| 		/// <summary> | ||||
| 		///  Required method for Designer support - do not modify | ||||
| 		///  the contents of this method with the code editor. | ||||
| 		/// </summary> | ||||
| 		private void InitializeComponent() | ||||
| 		{ | ||||
|             this.label1 = new System.Windows.Forms.Label(); | ||||
|             this.TextBoxPort = new System.Windows.Forms.TextBox(); | ||||
|             this.ButtonServerStart = new System.Windows.Forms.Button(); | ||||
|             this.ButtonServerStop = new System.Windows.Forms.Button(); | ||||
|             this.label2 = new System.Windows.Forms.Label(); | ||||
|             this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); | ||||
|             this.label3 = new System.Windows.Forms.Label(); | ||||
|             this.TextBoxTopicPublished = new System.Windows.Forms.TextBox(); | ||||
|             this.label4 = new System.Windows.Forms.Label(); | ||||
|             this.label5 = new System.Windows.Forms.Label(); | ||||
|             this.ButtonPublisherStop = new System.Windows.Forms.Button(); | ||||
|             this.ButtonPublisherStart = new System.Windows.Forms.Button(); | ||||
|             this.TextBoxPublish = new System.Windows.Forms.TextBox(); | ||||
|             this.ButtonPublish = new System.Windows.Forms.Button(); | ||||
|             this.ButtonSubscriberStop = new System.Windows.Forms.Button(); | ||||
|             this.ButtonSubscriberStart = new System.Windows.Forms.Button(); | ||||
|             this.TextBoxSubscriber = new System.Windows.Forms.TextBox(); | ||||
|             this.ButtonGeneratePublishedMessage = new System.Windows.Forms.Button(); | ||||
|             this.label6 = new System.Windows.Forms.Label(); | ||||
|             this.TextBoxTopicSubscribed = new System.Windows.Forms.TextBox(); | ||||
|             this.ButtonSubscribe = new System.Windows.Forms.Button(); | ||||
|             this.label7 = new System.Windows.Forms.Label(); | ||||
|             this.trackBar1 = new System.Windows.Forms.TrackBar(); | ||||
|             this.ButtonAutoPublisherStop = new System.Windows.Forms.Button(); | ||||
|             this.ButtonAutoPublisherStart = new System.Windows.Forms.Button(); | ||||
|             this.label8 = new System.Windows.Forms.Label(); | ||||
|             this.checkBox1 = new System.Windows.Forms.CheckBox(); | ||||
|             ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); | ||||
|             this.SuspendLayout(); | ||||
|             //  | ||||
|             // label1 | ||||
|             //  | ||||
|             this.label1.AutoSize = true; | ||||
|             this.label1.Location = new System.Drawing.Point(119, 24); | ||||
|             this.label1.Name = "label1"; | ||||
|             this.label1.Size = new System.Drawing.Size(32, 15); | ||||
|             this.label1.TabIndex = 0; | ||||
|             this.label1.Text = "Port:"; | ||||
|             //  | ||||
|             // TextBoxPort | ||||
|             //  | ||||
|             this.TextBoxPort.Location = new System.Drawing.Point(172, 21); | ||||
|             this.TextBoxPort.Name = "TextBoxPort"; | ||||
|             this.TextBoxPort.Size = new System.Drawing.Size(100, 23); | ||||
|             this.TextBoxPort.TabIndex = 1; | ||||
|             this.TextBoxPort.Text = "1883"; | ||||
|             this.TextBoxPort.TextChanged += new System.EventHandler(this.TextBoxPortTextChanged); | ||||
|             //  | ||||
|             // ButtonServerStart | ||||
|             //  | ||||
|             this.ButtonServerStart.Location = new System.Drawing.Point(433, 21); | ||||
|             this.ButtonServerStart.Name = "ButtonServerStart"; | ||||
|             this.ButtonServerStart.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonServerStart.TabIndex = 2; | ||||
|             this.ButtonServerStart.Text = "Start"; | ||||
|             this.ButtonServerStart.UseVisualStyleBackColor = true; | ||||
|             this.ButtonServerStart.Click += new System.EventHandler(this.ButtonServerStartClick); | ||||
|             //  | ||||
|             // ButtonServerStop | ||||
|             //  | ||||
|             this.ButtonServerStop.Location = new System.Drawing.Point(514, 21); | ||||
|             this.ButtonServerStop.Name = "ButtonServerStop"; | ||||
|             this.ButtonServerStop.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonServerStop.TabIndex = 3; | ||||
|             this.ButtonServerStop.Text = "Stop"; | ||||
|             this.ButtonServerStop.UseVisualStyleBackColor = true; | ||||
|             this.ButtonServerStop.Click += new System.EventHandler(this.ButtonServerStopClick); | ||||
|             //  | ||||
|             // label2 | ||||
|             //  | ||||
|             this.label2.AutoSize = true; | ||||
|             this.label2.Location = new System.Drawing.Point(33, 25); | ||||
|             this.label2.Name = "label2"; | ||||
|             this.label2.Size = new System.Drawing.Size(39, 15); | ||||
|             this.label2.TabIndex = 4; | ||||
|             this.label2.Text = "Server"; | ||||
|             //  | ||||
|             // maskedTextBox1 | ||||
|             //  | ||||
|             this.maskedTextBox1.Location = new System.Drawing.Point(0, 0); | ||||
|             this.maskedTextBox1.Name = "maskedTextBox1"; | ||||
|             this.maskedTextBox1.Size = new System.Drawing.Size(100, 23); | ||||
|             this.maskedTextBox1.TabIndex = 5; | ||||
|             this.maskedTextBox1.Text = "maskedTextBox1"; | ||||
|             //  | ||||
|             // label3 | ||||
|             //  | ||||
|             this.label3.AutoSize = true; | ||||
|             this.label3.Location = new System.Drawing.Point(33, 79); | ||||
|             this.label3.Name = "label3"; | ||||
|             this.label3.Size = new System.Drawing.Size(90, 15); | ||||
|             this.label3.TabIndex = 5; | ||||
|             this.label3.Text = "Topic Published"; | ||||
|             //  | ||||
|             // TextBoxTopicPublished | ||||
|             //  | ||||
|             this.TextBoxTopicPublished.Location = new System.Drawing.Point(164, 76); | ||||
|             this.TextBoxTopicPublished.Name = "TextBoxTopicPublished"; | ||||
|             this.TextBoxTopicPublished.Size = new System.Drawing.Size(425, 23); | ||||
|             this.TextBoxTopicPublished.TabIndex = 1; | ||||
|             this.TextBoxTopicPublished.Text = "devices/output"; | ||||
|             this.TextBoxTopicPublished.TextChanged += new System.EventHandler(this.TextBoxPortTextChanged); | ||||
|             //  | ||||
|             // label4 | ||||
|             //  | ||||
|             this.label4.AutoSize = true; | ||||
|             this.label4.Location = new System.Drawing.Point(33, 109); | ||||
|             this.label4.Name = "label4"; | ||||
|             this.label4.Size = new System.Drawing.Size(90, 15); | ||||
|             this.label4.TabIndex = 5; | ||||
|             this.label4.Text = "Client Publisher"; | ||||
|             //  | ||||
|             // label5 | ||||
|             //  | ||||
|             this.label5.AutoSize = true; | ||||
|             this.label5.Location = new System.Drawing.Point(33, 224); | ||||
|             this.label5.Name = "label5"; | ||||
|             this.label5.Size = new System.Drawing.Size(96, 15); | ||||
|             this.label5.TabIndex = 5; | ||||
|             this.label5.Text = "Client Subscriber"; | ||||
|             //  | ||||
|             // ButtonPublisherStop | ||||
|             //  | ||||
|             this.ButtonPublisherStop.Location = new System.Drawing.Point(514, 105); | ||||
|             this.ButtonPublisherStop.Name = "ButtonPublisherStop"; | ||||
|             this.ButtonPublisherStop.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonPublisherStop.TabIndex = 3; | ||||
|             this.ButtonPublisherStop.Text = "Stop"; | ||||
|             this.ButtonPublisherStop.UseVisualStyleBackColor = true; | ||||
|             this.ButtonPublisherStop.Click += new System.EventHandler(this.ButtonPublisherStopClick); | ||||
|             //  | ||||
|             // ButtonPublisherStart | ||||
|             //  | ||||
|             this.ButtonPublisherStart.Location = new System.Drawing.Point(433, 105); | ||||
|             this.ButtonPublisherStart.Name = "ButtonPublisherStart"; | ||||
|             this.ButtonPublisherStart.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonPublisherStart.TabIndex = 2; | ||||
|             this.ButtonPublisherStart.Text = "Start"; | ||||
|             this.ButtonPublisherStart.UseVisualStyleBackColor = true; | ||||
|             this.ButtonPublisherStart.Click += new System.EventHandler(this.ButtonPublisherStartClick); | ||||
|             //  | ||||
|             // TextBoxPublish | ||||
|             //  | ||||
|             this.TextBoxPublish.Location = new System.Drawing.Point(33, 134); | ||||
|             this.TextBoxPublish.Name = "TextBoxPublish"; | ||||
|             this.TextBoxPublish.Size = new System.Drawing.Size(394, 23); | ||||
|             this.TextBoxPublish.TabIndex = 1; | ||||
|             this.TextBoxPublish.TextChanged += new System.EventHandler(this.TextBoxPortTextChanged); | ||||
|             //  | ||||
|             // ButtonPublish | ||||
|             //  | ||||
|             this.ButtonPublish.Location = new System.Drawing.Point(514, 134); | ||||
|             this.ButtonPublish.Name = "ButtonPublish"; | ||||
|             this.ButtonPublish.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonPublish.TabIndex = 3; | ||||
|             this.ButtonPublish.Text = "Publish"; | ||||
|             this.ButtonPublish.UseVisualStyleBackColor = true; | ||||
|             this.ButtonPublish.Click += new System.EventHandler(this.ButtonPublishClick); | ||||
|             //  | ||||
|             // ButtonSubscriberStop | ||||
|             //  | ||||
|             this.ButtonSubscriberStop.Location = new System.Drawing.Point(514, 220); | ||||
|             this.ButtonSubscriberStop.Name = "ButtonSubscriberStop"; | ||||
|             this.ButtonSubscriberStop.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonSubscriberStop.TabIndex = 3; | ||||
|             this.ButtonSubscriberStop.Text = "Stop"; | ||||
|             this.ButtonSubscriberStop.UseVisualStyleBackColor = true; | ||||
|             this.ButtonSubscriberStop.Click += new System.EventHandler(this.ButtonSubscriberStopClick); | ||||
|             //  | ||||
|             // ButtonSubscriberStart | ||||
|             //  | ||||
|             this.ButtonSubscriberStart.Location = new System.Drawing.Point(433, 220); | ||||
|             this.ButtonSubscriberStart.Name = "ButtonSubscriberStart"; | ||||
|             this.ButtonSubscriberStart.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonSubscriberStart.TabIndex = 2; | ||||
|             this.ButtonSubscriberStart.Text = "Start"; | ||||
|             this.ButtonSubscriberStart.UseVisualStyleBackColor = true; | ||||
|             this.ButtonSubscriberStart.Click += new System.EventHandler(this.ButtonSubscriberStartClick); | ||||
|             //  | ||||
|             // TextBoxSubscriber | ||||
|             //  | ||||
|             this.TextBoxSubscriber.Location = new System.Drawing.Point(33, 309); | ||||
|             this.TextBoxSubscriber.Multiline = true; | ||||
|             this.TextBoxSubscriber.Name = "TextBoxSubscriber"; | ||||
|             this.TextBoxSubscriber.Size = new System.Drawing.Size(556, 182); | ||||
|             this.TextBoxSubscriber.TabIndex = 6; | ||||
|             //  | ||||
|             // ButtonGeneratePublishedMessage | ||||
|             //  | ||||
|             this.ButtonGeneratePublishedMessage.Location = new System.Drawing.Point(433, 133); | ||||
|             this.ButtonGeneratePublishedMessage.Name = "ButtonGeneratePublishedMessage"; | ||||
|             this.ButtonGeneratePublishedMessage.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonGeneratePublishedMessage.TabIndex = 2; | ||||
|             this.ButtonGeneratePublishedMessage.Text = "Random"; | ||||
|             this.ButtonGeneratePublishedMessage.UseVisualStyleBackColor = true; | ||||
|             this.ButtonGeneratePublishedMessage.Click += new System.EventHandler(this.ButtonGeneratePublishedMessageClick); | ||||
|             //  | ||||
|             // label6 | ||||
|             //  | ||||
|             this.label6.AutoSize = true; | ||||
|             this.label6.Location = new System.Drawing.Point(33, 252); | ||||
|             this.label6.Name = "label6"; | ||||
|             this.label6.Size = new System.Drawing.Size(96, 15); | ||||
|             this.label6.TabIndex = 5; | ||||
|             this.label6.Text = "Topic Subscribed"; | ||||
|             //  | ||||
|             // TextBoxTopicSubscribed | ||||
|             //  | ||||
|             this.TextBoxTopicSubscribed.Location = new System.Drawing.Point(164, 249); | ||||
|             this.TextBoxTopicSubscribed.Name = "TextBoxTopicSubscribed"; | ||||
|             this.TextBoxTopicSubscribed.Size = new System.Drawing.Size(344, 23); | ||||
|             this.TextBoxTopicSubscribed.TabIndex = 1; | ||||
|             this.TextBoxTopicSubscribed.Text = "devices/output"; | ||||
|             this.TextBoxTopicSubscribed.TextChanged += new System.EventHandler(this.TextBoxPortTextChanged); | ||||
|             //  | ||||
|             // ButtonSubscribe | ||||
|             //  | ||||
|             this.ButtonSubscribe.Location = new System.Drawing.Point(514, 248); | ||||
|             this.ButtonSubscribe.Name = "ButtonSubscribe"; | ||||
|             this.ButtonSubscribe.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonSubscribe.TabIndex = 3; | ||||
|             this.ButtonSubscribe.Text = "Subscribe"; | ||||
|             this.ButtonSubscribe.UseVisualStyleBackColor = true; | ||||
|             this.ButtonSubscribe.Click += new System.EventHandler(this.ButtonSubscribeClick); | ||||
|             //  | ||||
|             // label7 | ||||
|             //  | ||||
|             this.label7.AutoSize = true; | ||||
|             this.label7.Location = new System.Drawing.Point(33, 167); | ||||
|             this.label7.Name = "label7"; | ||||
|             this.label7.Size = new System.Drawing.Size(141, 15); | ||||
|             this.label7.TabIndex = 5; | ||||
|             this.label7.Text = "Auto (Random) Publisher"; | ||||
|             //  | ||||
|             // trackBar1 | ||||
|             //  | ||||
|             this.trackBar1.LargeChange = 500; | ||||
|             this.trackBar1.Location = new System.Drawing.Point(180, 162); | ||||
|             this.trackBar1.Maximum = 5050; | ||||
|             this.trackBar1.Minimum = 50; | ||||
|             this.trackBar1.Name = "trackBar1"; | ||||
|             this.trackBar1.Size = new System.Drawing.Size(247, 45); | ||||
|             this.trackBar1.SmallChange = 100; | ||||
|             this.trackBar1.TabIndex = 7; | ||||
|             this.trackBar1.TickFrequency = 500; | ||||
|             this.trackBar1.Value = 550; | ||||
|             this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); | ||||
|             //  | ||||
|             // ButtonAutoPublisherStop | ||||
|             //  | ||||
|             this.ButtonAutoPublisherStop.Location = new System.Drawing.Point(513, 162); | ||||
|             this.ButtonAutoPublisherStop.Name = "ButtonAutoPublisherStop"; | ||||
|             this.ButtonAutoPublisherStop.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonAutoPublisherStop.TabIndex = 8; | ||||
|             this.ButtonAutoPublisherStop.Text = "Stop"; | ||||
|             this.ButtonAutoPublisherStop.UseVisualStyleBackColor = true; | ||||
|             this.ButtonAutoPublisherStop.Click += new System.EventHandler(this.ButtonAutoPublisherStopClick); | ||||
|             //  | ||||
|             // ButtonAutoPublisherStart | ||||
|             //  | ||||
|             this.ButtonAutoPublisherStart.Location = new System.Drawing.Point(433, 162); | ||||
|             this.ButtonAutoPublisherStart.Name = "ButtonAutoPublisherStart"; | ||||
|             this.ButtonAutoPublisherStart.Size = new System.Drawing.Size(75, 23); | ||||
|             this.ButtonAutoPublisherStart.TabIndex = 8; | ||||
|             this.ButtonAutoPublisherStart.Text = "Start"; | ||||
|             this.ButtonAutoPublisherStart.UseVisualStyleBackColor = true; | ||||
|             this.ButtonAutoPublisherStart.Click += new System.EventHandler(this.ButtonAutoPublisherStartClick); | ||||
|             //  | ||||
|             // label8 | ||||
|             //  | ||||
|             this.label8.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
|             this.label8.AutoSize = true; | ||||
|             this.label8.Location = new System.Drawing.Point(180, 191); | ||||
|             this.label8.Name = "label8"; | ||||
|             this.label8.RightToLeft = System.Windows.Forms.RightToLeft.No; | ||||
|             this.label8.Size = new System.Drawing.Size(44, 15); | ||||
|             this.label8.TabIndex = 9; | ||||
|             this.label8.Text = "550 ms"; | ||||
|             this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleRight; | ||||
|             //  | ||||
|             // checkBox1 | ||||
|             //  | ||||
|             this.checkBox1.AutoSize = true; | ||||
|             this.checkBox1.Checked = true; | ||||
|             this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; | ||||
|             this.checkBox1.Location = new System.Drawing.Point(433, 191); | ||||
|             this.checkBox1.Name = "checkBox1"; | ||||
|             this.checkBox1.Size = new System.Drawing.Size(82, 19); | ||||
|             this.checkBox1.TabIndex = 10; | ||||
|             this.checkBox1.Text = "randomize"; | ||||
|             this.checkBox1.UseVisualStyleBackColor = true; | ||||
|             //  | ||||
|             // Form1 | ||||
|             //  | ||||
|             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); | ||||
|             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||||
|             this.ClientSize = new System.Drawing.Size(627, 530); | ||||
|             this.Controls.Add(this.checkBox1); | ||||
|             this.Controls.Add(this.label8); | ||||
|             this.Controls.Add(this.ButtonAutoPublisherStart); | ||||
|             this.Controls.Add(this.ButtonAutoPublisherStop); | ||||
|             this.Controls.Add(this.trackBar1); | ||||
|             this.Controls.Add(this.label7); | ||||
|             this.Controls.Add(this.TextBoxSubscriber); | ||||
|             this.Controls.Add(this.label5); | ||||
|             this.Controls.Add(this.label4); | ||||
|             this.Controls.Add(this.label3); | ||||
|             this.Controls.Add(this.label2); | ||||
|             this.Controls.Add(this.ButtonServerStop); | ||||
|             this.Controls.Add(this.ButtonServerStart); | ||||
|             this.Controls.Add(this.TextBoxPort); | ||||
|             this.Controls.Add(this.label1); | ||||
|             this.Controls.Add(this.TextBoxTopicPublished); | ||||
|             this.Controls.Add(this.ButtonPublisherStop); | ||||
|             this.Controls.Add(this.ButtonPublisherStart); | ||||
|             this.Controls.Add(this.TextBoxPublish); | ||||
|             this.Controls.Add(this.ButtonPublish); | ||||
|             this.Controls.Add(this.ButtonSubscriberStop); | ||||
|             this.Controls.Add(this.ButtonSubscriberStart); | ||||
|             this.Controls.Add(this.ButtonGeneratePublishedMessage); | ||||
|             this.Controls.Add(this.label6); | ||||
|             this.Controls.Add(this.TextBoxTopicSubscribed); | ||||
|             this.Controls.Add(this.ButtonSubscribe); | ||||
|             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | ||||
|             this.Name = "Form1"; | ||||
|             this.Text = "MQTT Testing"; | ||||
|             ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); | ||||
|             this.ResumeLayout(false); | ||||
|             this.PerformLayout(); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		#endregion | ||||
|  | ||||
| 		private System.Windows.Forms.Label label1; | ||||
| 		private System.Windows.Forms.TextBox TextBoxPort; | ||||
| 		private System.Windows.Forms.Button ButtonServerStart; | ||||
| 		private System.Windows.Forms.Button ButtonServerStop; | ||||
| 		private System.Windows.Forms.Label label2; | ||||
| 		private System.Windows.Forms.MaskedTextBox maskedTextBox1; | ||||
| 		private System.Windows.Forms.Label label3; | ||||
| 		private System.Windows.Forms.Label label4; | ||||
| 		private System.Windows.Forms.Label label5; | ||||
| 		private System.Windows.Forms.Button ButtonPublisherStop; | ||||
| 		private System.Windows.Forms.Button ButtonPublisherStart; | ||||
| 		private System.Windows.Forms.TextBox TextBoxPublish; | ||||
| 		private System.Windows.Forms.Button ButtonPublish; | ||||
| 		private System.Windows.Forms.Button ButtonSubscriberStop; | ||||
| 		private System.Windows.Forms.Button ButtonSubscriberStart; | ||||
| 		private System.Windows.Forms.TextBox TextBoxSubscriber; | ||||
| 		private System.Windows.Forms.Button ButtonGeneratePublishedMessage; | ||||
| 		private System.Windows.Forms.Label label6; | ||||
| 		private System.Windows.Forms.TextBox TextBoxTopicPublished; | ||||
| 		private System.Windows.Forms.Button ButtonSubscribe; | ||||
| 		private System.Windows.Forms.TextBox TextBoxTopicSubscribed; | ||||
|         private System.Windows.Forms.Label label7; | ||||
|         private System.Windows.Forms.TrackBar trackBar1; | ||||
|         private System.Windows.Forms.Button ButtonAutoPublisherStop; | ||||
|         private System.Windows.Forms.Button ButtonAutoPublisherStart; | ||||
|         private System.Windows.Forms.Label label8; | ||||
|         private System.Windows.Forms.CheckBox checkBox1; | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										476
									
								
								MQTTnet.TestApp.WinForm/Form1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										476
									
								
								MQTTnet.TestApp.WinForm/Form1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,476 @@ | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
| // <copyright file="Form1.cs" company="Haemmer Electronics"> | ||||
| //   Copyright (c) 2020 All rights reserved. | ||||
| // </copyright> | ||||
| // <summary> | ||||
| //   The main form. | ||||
| // </summary> | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
|  | ||||
| namespace MQTTnet.TestApp.WinForm | ||||
| { | ||||
|     using System; | ||||
|     using System.Text; | ||||
|     using System.Timers; | ||||
|     using System.Windows.Forms; | ||||
|  | ||||
|     using MQTTnet.Client.Connecting; | ||||
|     using MQTTnet.Client.Disconnecting; | ||||
|     using MQTTnet.Client.Options; | ||||
|     using MQTTnet.Client.Receiving; | ||||
|     using MQTTnet.Extensions.ManagedClient; | ||||
|     using MQTTnet.Formatter; | ||||
|     using MQTTnet.Protocol; | ||||
|     using MQTTnet.Server; | ||||
|     using Newtonsoft.Json; | ||||
|     using Timer = System.Timers.Timer; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// The main form. | ||||
|     /// </summary> | ||||
|     public partial class Form1 : Form | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// The managed publisher client. | ||||
|         /// </summary> | ||||
|         private IManagedMqttClient managedMqttClientPublisher; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The managed subscriber client. | ||||
|         /// </summary> | ||||
|         private IManagedMqttClient managedMqttClientSubscriber; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The MQTT server. | ||||
|         /// </summary> | ||||
|         private IMqttServer mqttServer; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The port. | ||||
|         /// </summary> | ||||
|         private string port = "1883"; | ||||
|  | ||||
|         private readonly Random random; | ||||
|         private readonly Timer randomPublisherTimer; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Initializes a new instance of the <see cref="Form1"/> class. | ||||
|         /// </summary> | ||||
|         public Form1() | ||||
|         { | ||||
|             this.InitializeComponent(); | ||||
|  | ||||
|             var timer = new Timer | ||||
|             { | ||||
|                 AutoReset = true, Enabled = true, Interval = 1000 | ||||
|             }; | ||||
|  | ||||
|             timer.Elapsed += this.TimerElapsed; | ||||
|  | ||||
|             random = new Random(); | ||||
|             randomPublisherTimer = new Timer | ||||
|             { | ||||
|                 AutoReset = true, | ||||
|                 Enabled = false, | ||||
|             }; | ||||
|  | ||||
|             randomPublisherTimer.Elapsed += (_, __) => this.BeginInvoke((MethodInvoker)delegate | ||||
|             { | ||||
|                 if (checkBox1.Checked) | ||||
|                     ButtonGeneratePublishedMessageClick(ButtonGeneratePublishedMessage, EventArgs.Empty); | ||||
|  | ||||
|                 ButtonPublishClick(ButtonPublish, EventArgs.Empty); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the publisher connected event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT client connected event args.</param> | ||||
|         private void OnPublisherConnected(MqttClientConnectedEventArgs x) | ||||
|         { | ||||
|             var item = "Publisher Connected"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the publisher disconnected event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT client disconnected event args.</param> | ||||
|         private void OnPublisherDisconnected(MqttClientDisconnectedEventArgs x) | ||||
|         { | ||||
|             var item = "Publisher Disconnected"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the subscriber connected event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT client connected event args.</param> | ||||
|         private void OnSubscriberConnected(MqttClientConnectedEventArgs x) | ||||
|         { | ||||
|             var item = "Subscriber Connected"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the subscriber disconnected event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT client disconnected event args.</param> | ||||
|         private void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) | ||||
|         { | ||||
|             var item = "Subscriber Disconnected"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to generate a message. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private void ButtonGeneratePublishedMessageClick(object sender, EventArgs e) | ||||
|         { | ||||
|             var message = new | ||||
|             { | ||||
|                 tag = Guid.NewGuid(), | ||||
|                 probability = random.NextDouble(), | ||||
|             }; | ||||
|  | ||||
|             var json = JsonConvert.SerializeObject(message); | ||||
|             this.TextBoxPublish.Text = json; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to publish a message. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonPublishClick(object sender, EventArgs e) | ||||
|         { | ||||
|             ((Button)sender).Enabled = false; | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 var payload = Encoding.UTF8.GetBytes(this.TextBoxPublish.Text); | ||||
|                 var message = new MqttApplicationMessageBuilder().WithTopic(this.TextBoxTopicPublished.Text.Trim()).WithPayload(payload).WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce).WithRetainFlag().Build(); | ||||
|  | ||||
|                 if (this.managedMqttClientPublisher != null) | ||||
|                 { | ||||
|                     await this.managedMqttClientPublisher.PublishAsync(message); | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 var item = ex.Message; | ||||
|                 this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|             } | ||||
|  | ||||
|             ((Button)sender).Enabled = true; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to start the publisher. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonPublisherStartClick(object sender, EventArgs e) | ||||
|         { | ||||
|             var mqttFactory = new MqttFactory(); | ||||
|  | ||||
|             var tlsOptions = new MqttClientTlsOptions | ||||
|             { | ||||
|                 UseTls = false, IgnoreCertificateChainErrors = true, IgnoreCertificateRevocationErrors = true, AllowUntrustedCertificates = true | ||||
|             }; | ||||
|  | ||||
|             var options = new MqttClientOptions | ||||
|             { | ||||
|                 ClientId = "ClientPublisher", | ||||
|                 ProtocolVersion = MqttProtocolVersion.V311, | ||||
|                 ChannelOptions = new MqttClientTcpOptions | ||||
|                 { | ||||
|                     Server = "localhost", Port = int.Parse(this.TextBoxPort.Text.Trim()), TlsOptions = tlsOptions | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             if (options.ChannelOptions == null) | ||||
|             { | ||||
|                 throw new InvalidOperationException(); | ||||
|             } | ||||
|  | ||||
|             options.Credentials = new MqttClientCredentials | ||||
|             { | ||||
|                 Username = "username", Password = Encoding.UTF8.GetBytes("password") | ||||
|             }; | ||||
|  | ||||
|             options.CleanSession = true; | ||||
|             options.KeepAlivePeriod = TimeSpan.FromSeconds(5); | ||||
|             this.managedMqttClientPublisher = mqttFactory.CreateManagedMqttClient(); | ||||
|             this.managedMqttClientPublisher.UseApplicationMessageReceivedHandler(this.HandleReceivedApplicationMessage); | ||||
|             this.managedMqttClientPublisher.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnPublisherConnected); | ||||
|             this.managedMqttClientPublisher.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnPublisherDisconnected); | ||||
|  | ||||
|             await this.managedMqttClientPublisher.StartAsync( | ||||
|                 new ManagedMqttClientOptions | ||||
|                 { | ||||
|                     ClientOptions = options | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to stop the publisher. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonPublisherStopClick(object sender, EventArgs e) | ||||
|         { | ||||
|             if (this.managedMqttClientPublisher == null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             await this.managedMqttClientPublisher.StopAsync(); | ||||
|             this.managedMqttClientPublisher = null; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to start the server. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonServerStartClick(object sender, EventArgs e) | ||||
|         { | ||||
|             if (this.mqttServer != null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             var storage = new JsonServerStorage(); | ||||
|             storage.Clear(); | ||||
|             this.mqttServer = new MqttFactory().CreateMqttServer(); | ||||
|             var options = new MqttServerOptions(); | ||||
|             options.DefaultEndpointOptions.Port = int.Parse(this.TextBoxPort.Text); | ||||
|             options.Storage = storage; | ||||
|             options.EnablePersistentSessions = true; | ||||
|             options.ConnectionValidator = new MqttServerConnectionValidatorDelegate( | ||||
|                 c => | ||||
|                 { | ||||
|                     if (c.ClientId.Length < 10) | ||||
|                     { | ||||
|                         c.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid; | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     if (c.Username != "username") | ||||
|                     { | ||||
|                         c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword; | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     if (c.Password != "password") | ||||
|                     { | ||||
|                         c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword; | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     c.ReasonCode = MqttConnectReasonCode.Success; | ||||
|                 }); | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 await this.mqttServer.StartAsync(options); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 var item = ex.Message; | ||||
|                 this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|  | ||||
|                 await this.mqttServer.StopAsync(); | ||||
|                 this.mqttServer = null; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to stop the server. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonServerStopClick(object sender, EventArgs e) | ||||
|         { | ||||
|             if (this.mqttServer == null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             await this.mqttServer.StopAsync(); | ||||
|             this.mqttServer = null; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to subscribe to a certain topic. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonSubscribeClick(object sender, EventArgs e) | ||||
|         { | ||||
|             var topicFilter = new MqttTopicFilter { Topic = this.TextBoxTopicSubscribed.Text.Trim() }; | ||||
|             await this.managedMqttClientSubscriber.SubscribeAsync(topicFilter); | ||||
|             var item = "Topic " + this.TextBoxTopicSubscribed.Text.Trim() + " is subscribed"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to start the subscriber. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonSubscriberStartClick(object sender, EventArgs e) | ||||
|         { | ||||
|             var mqttFactory = new MqttFactory(); | ||||
|  | ||||
|             var tlsOptions = new MqttClientTlsOptions | ||||
|             { | ||||
|                 UseTls = false, IgnoreCertificateChainErrors = true, IgnoreCertificateRevocationErrors = true, AllowUntrustedCertificates = true | ||||
|             }; | ||||
|  | ||||
|             var options = new MqttClientOptions | ||||
|             { | ||||
|                 ClientId = "ClientSubscriber", | ||||
|                 ProtocolVersion = MqttProtocolVersion.V311, | ||||
|                 ChannelOptions = new MqttClientTcpOptions | ||||
|                 { | ||||
|                     Server = "localhost", Port = int.Parse(this.TextBoxPort.Text.Trim()), TlsOptions = tlsOptions | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             if (options.ChannelOptions == null) | ||||
|             { | ||||
|                 throw new InvalidOperationException(); | ||||
|             } | ||||
|  | ||||
|             options.Credentials = new MqttClientCredentials | ||||
|             { | ||||
|                 Username = "username", | ||||
|                 Password = Encoding.UTF8.GetBytes("password") | ||||
|             }; | ||||
|  | ||||
|             options.CleanSession = true; | ||||
|             options.KeepAlivePeriod = TimeSpan.FromSeconds(5); | ||||
|  | ||||
|             this.managedMqttClientSubscriber = mqttFactory.CreateManagedMqttClient(); | ||||
|             this.managedMqttClientSubscriber.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); | ||||
|             this.managedMqttClientSubscriber.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); | ||||
|             this.managedMqttClientSubscriber.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(this.OnSubscriberMessageReceived); | ||||
|  | ||||
|             await this.managedMqttClientSubscriber.StartAsync( | ||||
|                 new ManagedMqttClientOptions | ||||
|                 { | ||||
|                     ClientOptions = options | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the button click to stop the subscriber. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private async void ButtonSubscriberStopClick(object sender, EventArgs e) | ||||
|         { | ||||
|             if (this.managedMqttClientSubscriber == null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             await this.managedMqttClientSubscriber.StopAsync(); | ||||
|             this.managedMqttClientSubscriber = null; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the received application message event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT application message received event args.</param> | ||||
|         private void HandleReceivedApplicationMessage(MqttApplicationMessageReceivedEventArgs x) | ||||
|         { | ||||
|             var item = $"Timestamp: {DateTime.Now:O} | Topic: {x.ApplicationMessage.Topic} | Payload: {x.ApplicationMessage.ConvertPayloadToString()} | QoS: {x.ApplicationMessage.QualityOfServiceLevel}"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Handles the received subscriber message event. | ||||
|         /// </summary> | ||||
|         /// <param name="x">The MQTT application message received event args.</param> | ||||
|         private void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) | ||||
|         { | ||||
|             var item = $"Timestamp: {DateTime.Now:O} | Topic: {x.ApplicationMessage.Topic} | Payload: {x.ApplicationMessage.ConvertPayloadToString()} | QoS: {x.ApplicationMessage.QualityOfServiceLevel}"; | ||||
|             this.BeginInvoke((MethodInvoker)delegate { this.TextBoxSubscriber.Text = item + Environment.NewLine + this.TextBoxSubscriber.Text; }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the text changes in the text box. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private void TextBoxPortTextChanged(object sender, EventArgs e) | ||||
|         { | ||||
|             // ReSharper disable once StyleCop.SA1126 | ||||
|             if (int.TryParse(this.TextBoxPort.Text, out _)) | ||||
|             { | ||||
|                 this.port = this.TextBoxPort.Text.Trim(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 this.TextBoxPort.Text = this.port; | ||||
|                 this.TextBoxPort.SelectionStart = this.TextBoxPort.Text.Length; | ||||
|                 this.TextBoxPort.SelectionLength = 0; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// The method that handles the timer events. | ||||
|         /// </summary> | ||||
|         /// <param name="sender">The sender.</param> | ||||
|         /// <param name="e">The event args.</param> | ||||
|         private void TimerElapsed(object sender, ElapsedEventArgs e) | ||||
|         { | ||||
|             this.BeginInvoke( | ||||
|                 (MethodInvoker)delegate | ||||
|                 { | ||||
|                     // Server | ||||
|                     this.TextBoxPort.Enabled = this.mqttServer == null; | ||||
|                     this.ButtonServerStart.Enabled = this.mqttServer == null; | ||||
|                     this.ButtonServerStop.Enabled = this.mqttServer != null; | ||||
|  | ||||
|                     // Publisher | ||||
|                     this.ButtonPublisherStart.Enabled = this.managedMqttClientPublisher == null; | ||||
|                     this.ButtonPublisherStop.Enabled = this.managedMqttClientPublisher != null; | ||||
|  | ||||
|                     // Auto Publisher | ||||
|                     this.ButtonAutoPublisherStart.Enabled = !this.randomPublisherTimer.Enabled; | ||||
|                     this.ButtonAutoPublisherStop.Enabled = this.randomPublisherTimer.Enabled; | ||||
|  | ||||
|                     // Subscriber | ||||
|                     this.ButtonSubscriberStart.Enabled = this.managedMqttClientSubscriber == null; | ||||
|                     this.ButtonSubscriberStop.Enabled = this.managedMqttClientSubscriber != null; | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         private void trackBar1_Scroll(object sender, EventArgs e) | ||||
|         { | ||||
|             this.label8.Text = $"{this.trackBar1.Value:N0} ms"; | ||||
|             this.randomPublisherTimer.Interval = this.trackBar1.Value; | ||||
|         } | ||||
|  | ||||
|         private void ButtonAutoPublisherStartClick(object sender, EventArgs e) | ||||
|         { | ||||
|             ((Button)sender).Enabled = false; | ||||
|             this.randomPublisherTimer.Start(); | ||||
|             ((Button)sender).Enabled = true; | ||||
|         } | ||||
|  | ||||
|         private void ButtonAutoPublisherStopClick(object sender, EventArgs e) | ||||
|         { | ||||
|             ((Button)sender).Enabled = false; | ||||
|             this.randomPublisherTimer.Stop(); | ||||
|             ((Button)sender).Enabled = true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										60
									
								
								MQTTnet.TestApp.WinForm/Form1.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								MQTTnet.TestApp.WinForm/Form1.resx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| <root> | ||||
|   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||||
|     <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||||
|     <xsd:element name="root" msdata:IsDataSet="true"> | ||||
|       <xsd:complexType> | ||||
|         <xsd:choice maxOccurs="unbounded"> | ||||
|           <xsd:element name="metadata"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" use="required" type="xsd:string" /> | ||||
|               <xsd:attribute name="type" type="xsd:string" /> | ||||
|               <xsd:attribute name="mimetype" type="xsd:string" /> | ||||
|               <xsd:attribute ref="xml:space" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="assembly"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:attribute name="alias" type="xsd:string" /> | ||||
|               <xsd:attribute name="name" type="xsd:string" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="data"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||
|                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||||
|               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||||
|               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||||
|               <xsd:attribute ref="xml:space" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="resheader"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" type="xsd:string" use="required" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|         </xsd:choice> | ||||
|       </xsd:complexType> | ||||
|     </xsd:element> | ||||
|   </xsd:schema> | ||||
|   <resheader name="resmimetype"> | ||||
|     <value>text/microsoft-resx</value> | ||||
|   </resheader> | ||||
|   <resheader name="version"> | ||||
|     <value>2.0</value> | ||||
|   </resheader> | ||||
|   <resheader name="reader"> | ||||
|     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
|   </resheader> | ||||
|   <resheader name="writer"> | ||||
|     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
|   </resheader> | ||||
| </root> | ||||
							
								
								
									
										83
									
								
								MQTTnet.TestApp.WinForm/JsonServerStorage.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								MQTTnet.TestApp.WinForm/JsonServerStorage.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
| // <copyright file="JsonServerStorage.cs" company="Haemmer Electronics"> | ||||
| //   Copyright (c) 2020 All rights reserved. | ||||
| // </copyright> | ||||
| // <summary> | ||||
| //   The JSON server storage. | ||||
| // </summary> | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
|  | ||||
| namespace MQTTnet.TestApp.WinForm | ||||
| { | ||||
|     using System.Collections.Generic; | ||||
|     using System.IO; | ||||
|     using System.Threading.Tasks; | ||||
|  | ||||
|     using MQTTnet.Server; | ||||
|  | ||||
|     using Newtonsoft.Json; | ||||
|  | ||||
|     /// <inheritdoc cref="IMqttServerStorage"/> | ||||
|     /// <summary> | ||||
|     /// The JSON server storage. | ||||
|     /// </summary> | ||||
|     /// <seealso cref="IMqttServerStorage"/> | ||||
|     public class JsonServerStorage : IMqttServerStorage | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// The file name. | ||||
|         /// </summary> | ||||
|         private readonly string filename = Path.Combine(Directory.GetCurrentDirectory(), "Retained.json"); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Clears the file. | ||||
|         /// </summary> | ||||
|         public void Clear() | ||||
|         { | ||||
|             if (File.Exists(this.filename)) | ||||
|             { | ||||
|                 File.Delete(this.filename); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <inheritdoc cref="IMqttServerStorage"/> | ||||
|         /// <summary> | ||||
|         /// Loads the retained messages. | ||||
|         /// </summary> | ||||
|         /// <returns>A <see cref="IList{T}"/> of <see cref="MqttApplicationMessage"/>.</returns> | ||||
|         /// <seealso cref="IMqttServerStorage"/> | ||||
|         public async Task<IList<MqttApplicationMessage>> LoadRetainedMessagesAsync() | ||||
|         { | ||||
|             await Task.CompletedTask; | ||||
|  | ||||
|             if (!File.Exists(this.filename)) | ||||
|             { | ||||
|                 return new List<MqttApplicationMessage>(); | ||||
|             } | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 var json = await File.ReadAllTextAsync(this.filename); | ||||
|                 return JsonConvert.DeserializeObject<List<MqttApplicationMessage>>(json); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 return new List<MqttApplicationMessage>(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <inheritdoc cref="IMqttServerStorage"/> | ||||
|         /// <summary> | ||||
|         /// Saves the retained messages to a file. | ||||
|         /// </summary> | ||||
|         /// <param name="messages">The messages.</param> | ||||
|         /// <returns>A <see cref="Task"/> representing any asynchronous operation.</returns> | ||||
|         /// <seealso cref="IMqttServerStorage"/> | ||||
|         public async Task SaveRetainedMessagesAsync(IList<MqttApplicationMessage> messages) | ||||
|         { | ||||
|             await Task.CompletedTask; | ||||
|             var json = JsonConvert.SerializeObject(messages); | ||||
|             await File.WriteAllTextAsync(this.filename, json); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										19
									
								
								MQTTnet.TestApp.WinForm/MQTTnet.TestApp.WinForm.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								MQTTnet.TestApp.WinForm/MQTTnet.TestApp.WinForm.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <OutputType>WinExe</OutputType> | ||||
|     <TargetFramework>netcoreapp3.1</TargetFramework> | ||||
|     <UseWindowsForms>true</UseWindowsForms> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="GitVersionTask" Version="5.3.3"> | ||||
|       <PrivateAssets>all</PrivateAssets> | ||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
|     </PackageReference> | ||||
|     <PackageReference Include="MQTTnet" Version="3.0.11" /> | ||||
|     <PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="3.0.11" /> | ||||
|     <PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										32
									
								
								MQTTnet.TestApp.WinForm/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								MQTTnet.TestApp.WinForm/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
| // <copyright file="Program.cs" company="Haemmer Electronics"> | ||||
| //   Copyright (c) 2020 All rights reserved. | ||||
| // </copyright> | ||||
| // <summary> | ||||
| //   The main program. | ||||
| // </summary> | ||||
| // -------------------------------------------------------------------------------------------------------------------- | ||||
|  | ||||
| namespace MQTTnet.TestApp.WinForm | ||||
| { | ||||
|     using System; | ||||
|     using System.Windows.Forms; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// The main program. | ||||
|     /// </summary> | ||||
|     internal static class Program | ||||
|     { | ||||
|         /// <summary> | ||||
|         ///     The main entry point for the application. | ||||
|         /// </summary> | ||||
|         [STAThread] | ||||
|         private static void Main() | ||||
|         { | ||||
|             Application.SetHighDpiMode(HighDpiMode.SystemAware); | ||||
|             Application.EnableVisualStyles(); | ||||
|             Application.SetCompatibleTextRenderingDefault(false); | ||||
|             Application.Run(new Form1()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										167
									
								
								input.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								input.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| openapi: 3.0.3 | ||||
| info: | ||||
|   title: Input Service | ||||
|   description: This is the input interface of the Birbnetes system. | ||||
|   contact: | ||||
|     email: tormakristof@tormakristof.eu | ||||
|   license: | ||||
|     name: Apache 2.0 | ||||
|     url: http://www.apache.org/licenses/LICENSE-2.0.html | ||||
|   version: 1.1.3 | ||||
| servers: | ||||
| - url: https://birb.k8s.kmlabz.com | ||||
| tags: | ||||
| - name: input | ||||
|   description: Input Service interaction | ||||
| paths: | ||||
|   /sample: | ||||
|     get: | ||||
|       tags: | ||||
|       - input | ||||
|       summary: Get all stored input queries | ||||
|       operationId: getall | ||||
|       responses: | ||||
|         200: | ||||
|           description: Array of input objects | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/InputResponse' | ||||
|         404: | ||||
|           description: No object matching filter | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|     post: | ||||
|       tags: | ||||
|       - input | ||||
|       summary: uploads a sample into the system | ||||
|       operationId: uploadFile | ||||
|       requestBody: | ||||
|         content: | ||||
|           multipart/form-data: | ||||
|             schema: | ||||
|               required: | ||||
|               - description | ||||
|               - file | ||||
|               properties: | ||||
|                 description: | ||||
|                   type: object | ||||
|                   description: Metadata json | ||||
|                   properties: | ||||
|                     deviceid: | ||||
|                       type: string | ||||
|                     date: | ||||
|                       type: string | ||||
|                       format: date | ||||
|                 file: | ||||
|                   type: string | ||||
|                   description: Wave file to upload | ||||
|                   format: binary | ||||
|         required: true | ||||
|       responses: | ||||
|         200: | ||||
|           description: successful operation | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|         400: | ||||
|           description: JSON parse error | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|         415: | ||||
|           description: Media type error | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|         417: | ||||
|           description: JSON invalid schema | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|         469: | ||||
|           description: No file found | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|         470: | ||||
|           description: Description missing | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
|   /sample/{tagID}: | ||||
|     get: | ||||
|       tags: | ||||
|       - input | ||||
|       summary: Get input object by ID | ||||
|       operationId: getInput | ||||
|       parameters: | ||||
|       - name: tagID | ||||
|         in: path | ||||
|         description: ID of input object file | ||||
|         required: true | ||||
|         schema: | ||||
|           type: string | ||||
|           format: uuid | ||||
|       responses: | ||||
|         200: | ||||
|           description: input object | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/InputSingeResponse' | ||||
|         404: | ||||
|           description: Tag not found | ||||
|           content: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $ref: '#/components/schemas/ApiResponse' | ||||
| components: | ||||
|   schemas: | ||||
|     InputSingeResponse: | ||||
|       required: | ||||
|       - message | ||||
|       - status | ||||
|       type: object | ||||
|       properties: | ||||
|         status: | ||||
|           type: string | ||||
|         message: | ||||
|           $ref: '#/components/schemas/InputObject' | ||||
|     InputResponse: | ||||
|       type: array | ||||
|       items: | ||||
|         $ref: '#/components/schemas/InputObject' | ||||
|     InputObject: | ||||
|       required: | ||||
|       - date | ||||
|       - device_id | ||||
|       - tag | ||||
|       type: object | ||||
|       properties: | ||||
|         tag: | ||||
|           type: string | ||||
|           format: uuid | ||||
|         date: | ||||
|           type: string | ||||
|           format: date | ||||
|         device_id: | ||||
|           type: integer | ||||
|     ApiResponse: | ||||
|       required: | ||||
|       - message | ||||
|       - status | ||||
|       type: object | ||||
|       properties: | ||||
|         status: | ||||
|           type: string | ||||
|         message: | ||||
|           type: string | ||||
		Reference in New Issue
	
	Block a user