First draft for MQTTnetServer project * Basic support for settings * Nasty code for setting up kestrel from appsettings.jsonrelease/3.x.x
@@ -235,6 +235,7 @@ FakesAssemblies/ | |||||
# Node.js Tools for Visual Studio | # Node.js Tools for Visual Studio | ||||
.ntvs_analysis.dat | .ntvs_analysis.dat | ||||
node_modules/ | node_modules/ | ||||
/*/**/package-lock.json | |||||
# Typescript v1 declaration files | # Typescript v1 declaration files | ||||
typings/ | typings/ | ||||
@@ -47,6 +47,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.Extensions.ManagedC | |||||
EndProject | EndProject | ||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.AspNetCore.Tests", "Tests\MQTTnet.AspNetCore.Tests\MQTTnet.AspNetCore.Tests.csproj", "{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.AspNetCore.Tests", "Tests\MQTTnet.AspNetCore.Tests\MQTTnet.AspNetCore.Tests.csproj", "{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}" | ||||
EndProject | EndProject | ||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnetServer", "Source\MQTTnetServer\MQTTnetServer.csproj", "{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}" | |||||
EndProject | |||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
@@ -226,6 +228,22 @@ Global | |||||
{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x64.Build.0 = Release|Any CPU | {61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x64.Build.0 = Release|Any CPU | ||||
{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x86.ActiveCfg = Release|Any CPU | {61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x86.ActiveCfg = Release|Any CPU | ||||
{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x86.Build.0 = Release|Any CPU | {61B62223-F5D0-48E4-BBD6-2CBA9353CB5E}.Release|x86.Build.0 = Release|Any CPU | ||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|ARM.ActiveCfg = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|ARM.Build.0 = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|x64.ActiveCfg = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|x64.Build.0 = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|x86.ActiveCfg = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Debug|x86.Build.0 = Debug|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|ARM.ActiveCfg = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|ARM.Build.0 = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|x64.ActiveCfg = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|x64.Build.0 = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|x86.ActiveCfg = Release|Any CPU | |||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B}.Release|x86.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -241,6 +259,7 @@ Global | |||||
{998D04DD-7CB0-45F5-A393-E2495C16399E} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} | {998D04DD-7CB0-45F5-A393-E2495C16399E} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} | ||||
{C400533A-8EBA-4F0B-BF4D-295C3708604B} = {12816BCC-AF9E-44A9-9AE5-C246AF2A0587} | {C400533A-8EBA-4F0B-BF4D-295C3708604B} = {12816BCC-AF9E-44A9-9AE5-C246AF2A0587} | ||||
{61B62223-F5D0-48E4-BBD6-2CBA9353CB5E} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} | {61B62223-F5D0-48E4-BBD6-2CBA9353CB5E} = {9248C2E1-B9D6-40BF-81EC-86004D7765B4} | ||||
{5699FB8C-838C-4AB0-80A5-9CA809F9B65B} = {32A630A7-2598-41D7-B625-204CD906F5FB} | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
SolutionGuid = {07536672-5CBC-4BE3-ACE0-708A431A7894} | SolutionGuid = {07536672-5CBC-4BE3-ACE0-708A431A7894} | ||||
@@ -0,0 +1,45 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Threading.Tasks; | |||||
using Microsoft.AspNetCore.Mvc; | |||||
namespace MQTTnetServer.Controllers | |||||
{ | |||||
[Route("api/[controller]")] | |||||
[ApiController] | |||||
public class ValuesController : ControllerBase | |||||
{ | |||||
// GET api/values | |||||
[HttpGet] | |||||
public ActionResult<IEnumerable<string>> Get() | |||||
{ | |||||
return new string[] { "value1", "value2" }; | |||||
} | |||||
// GET api/values/5 | |||||
[HttpGet("{id}")] | |||||
public ActionResult<string> Get(int id) | |||||
{ | |||||
return "value"; | |||||
} | |||||
// POST api/values | |||||
[HttpPost] | |||||
public void Post([FromBody] string value) | |||||
{ | |||||
} | |||||
// PUT api/values/5 | |||||
[HttpPut("{id}")] | |||||
public void Put(int id, [FromBody] string value) | |||||
{ | |||||
} | |||||
// DELETE api/values/5 | |||||
[HttpDelete("{id}")] | |||||
public void Delete(int id) | |||||
{ | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,41 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk.Web"> | |||||
<PropertyGroup> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> | |||||
<AssemblyName>MQTTnetServer</AssemblyName> | |||||
<RootNamespace>MQTTnetServer</RootNamespace> | |||||
<GeneratePackageOnBuild>False</GeneratePackageOnBuild> | |||||
<Company /> | |||||
<Product /> | |||||
<Description /> | |||||
<Authors /> | |||||
<PackageId /> | |||||
<SignAssembly>false</SignAssembly> | |||||
<DelaySign>false</DelaySign> | |||||
<LangVersion>latest</LangVersion> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> | |||||
<DocumentationFile>MQTTnetServer.xml</DocumentationFile> | |||||
<WarningsAsErrors>NU1605</WarningsAsErrors> | |||||
<NoWarn>1701;1702</NoWarn> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<Content Update="appsettings.json"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</Content> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.AspNetCore.App" /> | |||||
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\MQTTnet.AspnetCore\MQTTnet.AspNetCore.csproj" /> | |||||
<ProjectReference Include="..\MQTTnet\MQTTnet.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,116 @@ | |||||
<?xml version="1.0"?> | |||||
<doc> | |||||
<assembly> | |||||
<name>MQTTnetServer</name> | |||||
</assembly> | |||||
<members> | |||||
<member name="T:MQTTnetServer.Program"> | |||||
<summary> | |||||
Main Entry point | |||||
</summary> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Program.Main(System.String[])"> | |||||
<summary> | |||||
Main | |||||
</summary> | |||||
<param name="args"></param> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Program.CreateWebHostBuilder(System.String[])"> | |||||
<summary> | |||||
Configure and Start Kestrel | |||||
</summary> | |||||
<param name="args"></param> | |||||
<returns></returns> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Program.ReadListenSettings"> | |||||
<summary> | |||||
Read Application Settings | |||||
</summary> | |||||
<returns></returns> | |||||
</member> | |||||
<member name="T:MQTTnetServer.Settings.ListenModel"> | |||||
<summary> | |||||
Listen Entry Settings Model | |||||
</summary> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Settings.ListenModel.#ctor"> | |||||
<summary> | |||||
Constructor | |||||
</summary> | |||||
</member> | |||||
<member name="P:MQTTnetServer.Settings.ListenModel.Address"> | |||||
<summary> | |||||
Listen Address | |||||
</summary> | |||||
</member> | |||||
<member name="P:MQTTnetServer.Settings.ListenModel.Port"> | |||||
<summary> | |||||
Listen Port | |||||
</summary> | |||||
</member> | |||||
<member name="P:MQTTnetServer.Settings.ListenModel.Protocol"> | |||||
<summary> | |||||
Protocol Type | |||||
</summary> | |||||
</member> | |||||
<member name="T:MQTTnetServer.Settings.ListenProtocolTypes"> | |||||
<summary> | |||||
Listen Protocol Types | |||||
</summary> | |||||
</member> | |||||
<member name="F:MQTTnetServer.Settings.ListenProtocolTypes.HTTP"> | |||||
<summary> | |||||
HTTP | |||||
</summary> | |||||
</member> | |||||
<member name="F:MQTTnetServer.Settings.ListenProtocolTypes.HTTPS"> | |||||
<summary> | |||||
HTTPS | |||||
</summary> | |||||
</member> | |||||
<member name="F:MQTTnetServer.Settings.ListenProtocolTypes.MQTT"> | |||||
<summary> | |||||
MQTT | |||||
</summary> | |||||
</member> | |||||
<member name="T:MQTTnetServer.Settings.SettingsModel"> | |||||
<summary> | |||||
Main Settings Model | |||||
</summary> | |||||
</member> | |||||
<member name="P:MQTTnetServer.Settings.SettingsModel.Listen"> | |||||
<summary> | |||||
Listen Settings | |||||
</summary> | |||||
</member> | |||||
<member name="T:MQTTnetServer.Startup"> | |||||
<summary> | |||||
Web App Startup | |||||
</summary> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Startup.#ctor(Microsoft.Extensions.Configuration.IConfiguration)"> | |||||
<summary> | |||||
Constructor | |||||
</summary> | |||||
<param name="configuration"></param> | |||||
</member> | |||||
<member name="P:MQTTnetServer.Startup.Configuration"> | |||||
<summary> | |||||
Application Settings | |||||
</summary> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Startup.Configure(Microsoft.AspNetCore.Builder.IApplicationBuilder,Microsoft.AspNetCore.Hosting.IHostingEnvironment)"> | |||||
<summary> | |||||
This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |||||
</summary> | |||||
<param name="app"></param> | |||||
<param name="env"></param> | |||||
</member> | |||||
<member name="M:MQTTnetServer.Startup.ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection)"> | |||||
<summary> | |||||
This method gets called by the runtime. Use this method to add services to the container. | |||||
</summary> | |||||
<param name="services"></param> | |||||
</member> | |||||
</members> | |||||
</doc> |
@@ -0,0 +1,118 @@ | |||||
using Microsoft.AspNetCore; | |||||
using Microsoft.AspNetCore.Hosting; | |||||
using Microsoft.Extensions.Configuration; | |||||
using MQTTnet.AspNetCore; | |||||
using MQTTnetServer.Settings; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Net; | |||||
namespace MQTTnetServer | |||||
{ | |||||
/// <summary> | |||||
/// Main Entry point | |||||
/// </summary> | |||||
public class Program | |||||
{ | |||||
/// <summary> | |||||
/// Main | |||||
/// </summary> | |||||
/// <param name="args"></param> | |||||
public static void Main(string[] args) | |||||
{ | |||||
try | |||||
{ | |||||
CreateWebHostBuilder(args).Build().Run(); | |||||
} | |||||
catch (FileNotFoundException e) | |||||
{ | |||||
Console.WriteLine("Could not find application settings file in: " + e.FileName); | |||||
return; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Configure and Start Kestrel | |||||
/// </summary> | |||||
/// <param name="args"></param> | |||||
/// <returns></returns> | |||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args) | |||||
{ | |||||
var webHost = WebHost.CreateDefaultBuilder(args); | |||||
var listen = ReadListenSettings(); | |||||
webHost | |||||
.UseKestrel(o => | |||||
{ | |||||
if (listen?.Length > 0) | |||||
{ | |||||
foreach (var item in listen) | |||||
{ | |||||
if (item.Address?.Trim() == "*") | |||||
{ | |||||
if (item.Protocol == ListenProtocolTypes.MQTT) | |||||
{ | |||||
o.ListenAnyIP(item.Port, c => c.UseMqtt()); | |||||
} | |||||
else | |||||
{ | |||||
o.ListenAnyIP(item.Port); | |||||
} | |||||
} | |||||
else if (item.Address?.Trim() == "localhost") | |||||
{ | |||||
if (item.Protocol == ListenProtocolTypes.MQTT) | |||||
{ | |||||
o.ListenLocalhost(item.Port, c => c.UseMqtt()); | |||||
} | |||||
else | |||||
{ | |||||
o.ListenLocalhost(item.Port); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
if (IPAddress.TryParse(item.Address, out var ip)) | |||||
{ | |||||
if (item.Protocol == ListenProtocolTypes.MQTT) | |||||
{ | |||||
o.Listen(ip, item.Port, c => c.UseMqtt()); | |||||
} | |||||
else | |||||
{ | |||||
o.Listen(ip, item.Port); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
o.ListenAnyIP(1883, l => l.UseMqtt()); | |||||
o.ListenAnyIP(5000); | |||||
} | |||||
}); | |||||
webHost.UseStartup<Startup>(); | |||||
return webHost; | |||||
} | |||||
/// <summary> | |||||
/// Read Application Settings | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public static ListenModel[] ReadListenSettings() | |||||
{ | |||||
var builder = new ConfigurationBuilder() | |||||
.AddJsonFile("appsettings.json") | |||||
.AddEnvironmentVariables() | |||||
.Build(); | |||||
var listen = new List<ListenModel>(); | |||||
builder.Bind("MQTTnetServer:Listen", listen); | |||||
return listen.ToArray(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
namespace MQTTnetServer.Settings | |||||
{ | |||||
/// <summary> | |||||
/// Listen Entry Settings Model | |||||
/// </summary> | |||||
public class ListenModel | |||||
{ | |||||
/// <summary> | |||||
/// Constructor | |||||
/// </summary> | |||||
public ListenModel() | |||||
{ | |||||
} | |||||
/// <summary> | |||||
/// Listen Address | |||||
/// </summary> | |||||
public string Address { get; set; } | |||||
/// <summary> | |||||
/// Listen Port | |||||
/// </summary> | |||||
public int Port { get; set; } | |||||
/// <summary> | |||||
/// Protocol Type | |||||
/// </summary> | |||||
public ListenProtocolTypes Protocol { get; set; } = ListenProtocolTypes.HTTP; | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
namespace MQTTnetServer.Settings | |||||
{ | |||||
/// <summary> | |||||
/// Listen Protocol Types | |||||
/// </summary> | |||||
public enum ListenProtocolTypes | |||||
{ | |||||
/// <summary> | |||||
/// HTTP | |||||
/// </summary> | |||||
HTTP = 0, | |||||
/// <summary> | |||||
/// HTTPS | |||||
/// </summary> | |||||
HTTPS = 1, | |||||
/// <summary> | |||||
/// MQTT | |||||
/// </summary> | |||||
MQTT = 20 | |||||
} | |||||
} |
@@ -0,0 +1,15 @@ | |||||
using System.Collections.Generic; | |||||
namespace MQTTnetServer.Settings | |||||
{ | |||||
/// <summary> | |||||
/// Main Settings Model | |||||
/// </summary> | |||||
public class SettingsModel | |||||
{ | |||||
/// <summary> | |||||
/// Listen Settings | |||||
/// </summary> | |||||
public IEnumerable<ListenModel> Listen { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,61 @@ | |||||
using Microsoft.AspNetCore.Builder; | |||||
using Microsoft.AspNetCore.Hosting; | |||||
using Microsoft.AspNetCore.Mvc; | |||||
using Microsoft.Extensions.Configuration; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
namespace MQTTnetServer | |||||
{ | |||||
/// <summary> | |||||
/// Web App Startup | |||||
/// </summary> | |||||
public class Startup | |||||
{ | |||||
/// <summary> | |||||
/// Constructor | |||||
/// </summary> | |||||
/// <param name="configuration"></param> | |||||
public Startup(IConfiguration configuration) | |||||
{ | |||||
var builder = new ConfigurationBuilder() | |||||
.AddJsonFile("appsettings.json") | |||||
.AddEnvironmentVariables(); | |||||
Configuration = builder.Build(); | |||||
} | |||||
/// <summary> | |||||
/// Application Settings | |||||
/// </summary> | |||||
public IConfigurationRoot Configuration { get; } | |||||
/// <summary> | |||||
/// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |||||
/// </summary> | |||||
/// <param name="app"></param> | |||||
/// <param name="env"></param> | |||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env) | |||||
{ | |||||
if (env.IsDevelopment()) | |||||
{ | |||||
app.UseDeveloperExceptionPage(); | |||||
} | |||||
else | |||||
{ | |||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. | |||||
app.UseHsts(); | |||||
} | |||||
app.UseHttpsRedirection(); | |||||
app.UseMvc(); | |||||
} | |||||
/// <summary> | |||||
/// This method gets called by the runtime. Use this method to add services to the container. | |||||
/// </summary> | |||||
/// <param name="services"></param> | |||||
public void ConfigureServices(IServiceCollection services) | |||||
{ | |||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
{ | |||||
"Logging": { | |||||
"LogLevel": { | |||||
"Default": "Debug", | |||||
"System": "Information", | |||||
"Microsoft": "Information" | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,32 @@ | |||||
{ | |||||
"MQTTnetServer": { | |||||
/* | |||||
Wildcard Addresses: | |||||
* - All local IP addresses | |||||
localhost - Localhost only | |||||
Supported Protocols: | |||||
0 - HTTP | |||||
1 - HTTPS | |||||
20 - MQTT | |||||
*/ | |||||
"Listen": [ | |||||
{ | |||||
"Address": "localhost", | |||||
"Port": 5000, | |||||
"Protocol": 0 | |||||
}, | |||||
{ | |||||
"Address": "*", | |||||
"Port": 1883, | |||||
"Protocol": 20 | |||||
} | |||||
] | |||||
}, | |||||
"Logging": { | |||||
"LogLevel": { | |||||
"Default": "Warning" | |||||
} | |||||
}, | |||||
"AllowedHosts": "*" | |||||
} |
@@ -2,13 +2,11 @@ | |||||
"version": "1.0.0", | "version": "1.0.0", | ||||
"name": "mqtt.test", | "name": "mqtt.test", | ||||
"private": true, | "private": true, | ||||
"devDependencies": { | |||||
}, | |||||
"devDependencies": {}, | |||||
"dependencies": { | "dependencies": { | ||||
"mqtt": "2.15.1", | "mqtt": "2.15.1", | ||||
"@types/node": "8.0.46", | "@types/node": "8.0.46", | ||||
"systemjs": "0.20.19", | "systemjs": "0.20.19", | ||||
"typescript": "2.3.4" | "typescript": "2.3.4" | ||||
} | } | ||||
} | |||||
} |