创建windows服务网上有很多,不多述;
服务端做好后一定要写bat安装卸载文件
install.bat
@echo.请稍等,MqttNetServiceAddUserAndPassword服务安装启动中............
@echo off
@title 安装windows服务:MqttNetServiceAddUserAndPassword
@sc create MqttNetServiceAddUserAndPassword binPath="%~dp0\MqttNetServiceAddUserAndPassword.exe"
@sc config MqttNetServiceAddUserAndPassword start= auto
@sc start MqttNetServiceAddUserAndPassword
@echo.MqttNetServiceAddUserAndPassword启动完毕
pause
//binPath="%~dp0\MqttNetServiceAddUserAndPassword.exe" 当前路径,也可指定
delete.bat
@echo.服务MqttNetServiceAddUserAndPassword卸载中..........
@echo off
@sc stop MqttNetServiceAddUserAndPassword
@sc delete MqttNetServiceAddUserAndPassword
@echo off
@echo.MqttNetServiceAddUserAndPassword卸载完毕
@pause
服务端:
using MQTTnet;
using MQTTnet.Protocol;
using MQTTnet.Server;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
namespace MqttNetServiceAddUserAndPassword
{
public partial class Service1 : ServiceBase
{
private readonly static object locker = new object();
private MqttServer mqttServer = null;
private System.Timers.Timer timer = null;
private GodSharp.Sockets.SocketServer socketService = null;
//此集合用于判断写入日志在一段时间内不重,以客户端id为依据,最多2000个清零;
private List<string> subClientIDs = new List<string>();
public Service1()
{
InitializeComponent();
//创建一个定时器,检查5s内有多少客户端接入并将相关信息记录到日志中
timer = new System.Timers.Timer();
timer.AutoReset = true;
timer.Enabled = true;
timer.Interval = 5000;
timer.Elapsed += new ElapsedEventHandler(GetSubClientSAndSetShow);
}
protected override void OnStart(string[] args)
{
//开启服务
//CreateMQTTServer();
Task.Run(CreateMQTTServer);
if (timer.Enabled == false)
{
timer.Enabled = true;
timer.Start();
}
//创建socket服务端
//CreateServerSocket();
// SocketServer.StartSocketService();
}
protected override void OnStop()
{
if (timer.Enabled == true)
{
timer.Enabled = false;
timer.Stop();
}
}
/// <summary>
/// 开启服务
/// </summary>
private async Task CreateMQTTServer()
{
if (mqttServer == null)
{
var optionsBuilder = new MqttServerOptionsBuilder();
optionsBuilder.WithConnectionValidator(c =>
{
if (c.ClientId.Length < 5 || !c.ClientId.StartsWith("Eohi_"))
{
c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
return;
}
if (c.Username != "user" || c.Password != "123456")
{
c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
return;
}
c.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
});
//指定 ip地址,默认为本地,但此方法不能使用ipaddress报错,有哪位大神帮解答,感激。
//options.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(""))
//指定端口
optionsBuilder.WithDefaultEndpointPort(1884);
//连接记录数,默认 一般为2000
//optionsBuilder.WithConnectionBacklog(2000);
mqttServer = new MqttFactory().CreateMqttServer() as MqttServer;
string msg = null;
//将发送的消息加到日志
mqttServer.ApplicationMessageReceived += (s, e) =>
{
msg = @"发送消息的客户端id:" + e.ClientId + "\r\n"
+ "发送时间:" + DateTime.Now + "\r\n"
+ "发送消息的主题:" + e.ApplicationMessage.Topic + "\r\n"
+ "发送的消息内容:" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0]) + "\r\n"
+ "--------------------------------------------------\r\n"
;
WriteMsgLog(msg);
};