提交 6de37671 编写于 作者: 麦壳饼's avatar 麦壳饼

修改mqtt

上级 0a4b404d
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IoTSharp.Data;
using IoTSharp.Handlers;
using IoTSharp.MQTT;
using IoTSharp.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MQTTnet;
using MQTTnet.AspNetCoreEx;
using MQTTnet.Protocol;
using MQTTnet.Server;
using MQTTnet.Server.Status;
namespace IoTSharp.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class MqttServerController : ControllerBase
{
private readonly MQTTServerHandler _mqttService;
public MqttServerController(MQTTServerHandler mqttService)
{
_mqttService = mqttService;
}
[HttpPost]
public async Task Publish(string topic, string Payload, int qos = 0, bool retain = false)
{
if (topic == null) throw new ArgumentNullException(nameof(topic));
await _mqttService.Publish(new MqttPublishParameters<string>() { Payload = Payload, QualityOfServiceLevel = (MqttQualityOfServiceLevel)qos, Retain = retain, Topic = topic });
}
[HttpGet]
public List<string> Imports()
{
return _mqttService.GetTopicImportUids();
}
[HttpPost("{uid}")]
public void Import(string uid, [FromBody] MqttImportTopicParameters parameters)
{
if (uid == null) throw new ArgumentNullException(nameof(uid));
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
_mqttService.StartTopicImport(uid, parameters);
}
[HttpDelete("{uid}")]
[ApiExplorerSettings(GroupName = "v1")]
public void DeleteImport(string uid)
{
if (uid == null) throw new ArgumentNullException(nameof(uid));
_mqttService.StopTopicImport(uid);
}
[HttpGet]
public Task<IList<IMqttClientStatus>> Clients()
{
return _mqttService.GetClientsAsync();
}
[HttpGet]
public Task<IList<IMqttSessionStatus>> Sessions()
{
return _mqttService.GetSessionsAsync();
}
[HttpGet]
public Dictionary<string, MqttSubscriberModel> Subscriptions()
{
return _mqttService.GetSubscribers().ToDictionary(s => s.Uid, s => new MqttSubscriberModel
{
TopicFilter = s.TopicFilter
});
}
[HttpDelete("{uid}")]
public void Subscriber(string uid)
{
_mqttService.Unsubscribe(uid);
}
[HttpGet]
public Task<IList<MqttApplicationMessage>> RetainedMessages()
{
return _mqttService.GetRetainedMessagesAsync();
}
[HttpDelete("{topic}")]
public async Task RetainedMessage(string topic)
{
await _mqttService.Publish(new MqttPublishParameters<byte[]>
{
Topic = topic,
Payload = new byte[0],
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,
Retain = true
});
}
[HttpDelete]
public Task CleanRetainedMessages()
{
return _mqttService.DeleteRetainedMessagesAsync();
}
}
public class MqttSubscriberModel
{
public string TopicFilter { get; set; }
}
}
......@@ -53,7 +53,6 @@ namespace IoTSharp
}
public static void UseIotSharpMqttServer(this IApplicationBuilder app)
{
app.UseMqttEndpoint();
var mqttEvents = app.ApplicationServices.CreateScope().ServiceProvider.GetService<MQTTServerHandler>();
IMqttServerStorage storage = app.ApplicationServices.CreateScope().ServiceProvider.GetService<IMqttServerStorage>();
app.UseMqttServerEx(server =>
......
......@@ -46,18 +46,23 @@
<PackageReference Include="IoTSharp.X509Extensions" Version="1.4.9" />
<PackageReference Include="kimbus" Version="2.0.1" />
<PackageReference Include="LiteDB" Version="5.0.8" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
<PackageReference Include="MQTTnet" Version="3.0.9" />
<PackageReference Include="MQTTnet.AspNetCore" Version="3.0.9" />
<PackageReference Include="MQTTnet.Extensions.Rpc" Version="3.0.9" />
<PackageReference Include="MQTTnet" Version="3.0.11" />
<PackageReference Include="MQTTnet.AspNetCore" Version="3.0.11" />
<PackageReference Include="MQTTnet.Extensions.Rpc" Version="3.0.11" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.3" />
<PackageReference Include="NSwag.AspNetCore" Version="13.5.0" />
<PackageReference Include="QuartzHostedServiceEx" Version="0.0.7" />
<PackageReference Include="Silkier" Version="1.0.23" />
<PackageReference Include="Silkier.AspNetCore" Version="1.0.23" />
<PackageReference Include="Silkier.EFCore" Version="1.0.23" />
<PackageReference Include="Silkier" Version="1.0.110" />
<PackageReference Include="Silkier.AspNetCore" Version="1.0.110" />
<PackageReference Include="Silkier.EFCore" Version="1.0.110" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.7.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.1" />
<PackageReference Include="CoAP.NET.Core" Version="1.1.0" />
......@@ -76,7 +81,7 @@
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="3.1.4" />
<PackageReference Include="MQTTnet.AspNetCoreEx" Version="3.0.9" />
<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="3.0.9" />
<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="3.0.11" />
</ItemGroup>
<ItemGroup>
......@@ -85,6 +90,7 @@
<EmbeddedResource Remove="Migrations\**" />
<None Remove="Migrations\**" />
<Content Remove="appsettings.Production.json" />
<None Remove=".gitignore" />
<None Remove="healthchecksdb" />
<None Remove="healthchecksdb-shm" />
<None Include="..\docs\images\200x200.png">
......
using CoAP.Server;
using IoTSharp.Data;
using IoTSharp.Handlers;
using Kimbus;
using Kimbus.Slave;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace IoTSharp.Services
{
public class ModbusTCPService : IHostedService
{
private readonly ILogger _logger;
private MbTcpSlave _slave;
private ApplicationDbContext _dbContext;
private IServiceScope _serviceScope;
public ModbusTCPService(ILogger<ModbusTCPService> logger, IServiceScopeFactory scopeFactor)
{
_slave = new MbTcpSlave("*", 502);
_logger = logger;
_serviceScope = scopeFactor.CreateScope();
_dbContext = _serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
}
public Task StartAsync(CancellationToken cancellationToken)
{
_slave.OnWriteHoldingRegisters = (_, start, hrs) =>
{
Console.WriteLine("Write holding registers at {0}, len: {1}", start, hrs.Length);
for (var i = 0; i < hrs.Length; ++i)
{
Console.WriteLine("{0}: {1}", i + start, hrs[i]);
}
return MbExceptionCode.Ok;
};
_slave.OnReadHoldingRegisters = (_, start, count) =>
{
var buffer = new ushort[count];
for (var i = 0; i < count; ++i)
{
buffer[i] = (ushort)(i + start);
}
return (buffer, MbExceptionCode.Ok);
};
return _slave.Listen();
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}
\ No newline at end of file
......@@ -37,6 +37,9 @@ using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using MQTTnet.Server;
using System.Runtime.InteropServices.ComTypes;
using SshNet.Security.Cryptography;
namespace IoTSharp
{
public class Startup
......@@ -177,6 +180,7 @@ namespace IoTSharp
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapMqtt("/mqtt");
});
app.UseSwaggerUi3();
app.UseOpenApi();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册