1.引入MQTTnet.dll
本例引用版本为3.0.15.0,运行环境为.net Framework 4.6.1, 如版本更新,请参考最新官方文档:https://github.com/chkr1011/MQTTnet/wiki/
2.创建mqttServer
private IMqttServer MqttServer;
private MqttServerOptionsBuilder MqttServerOptions;
MqttServerOptions = new MqttServerOptionsBuilder()
.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(“192.168.1.1”))//ip
.WithDefaultEndpointPort(1883) //端口号
.WithConnectionValidator(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;
}
logger.Info($"{c.ClientId}连接成功!");
c.ReasonCode = MqttConnectReasonCode.Success;
});
MqttServer = new MqttFactory().CreateMqttServer();
MqttServer.StartAsync(MqttServerOptions.Build());
MqttServer.UseApplicationMessageReceivedHandler(e =>
{
var payload = e.ApplicationMessage.ConvertPayloadToString();
logger.Info($"主题:{e.ApplicationMessage.Topic}");
logger.Info($"信息:{payload}");
});
3.创建客户端并发布主题
var MqttClient = new MqttFactory().CreateMqttClient();
var mqttOptions = new MqttClientOptions()
{
ClientId = "Client1",
ChannelOptions = new MqttClientTcpOptions()
{
Server = "192.168.1.1",
Port = 1883
},
Credentials = new MqttClientCredentials()
{
Username ="Username",
Password = "Password"
},
CleanSession = false,
KeepAlivePeriod = TimeSpan.FromSeconds(65535),
KeepAliveSendInterval = TimeSpan.FromSeconds(60),
CommunicationTimeout = TimeSpan.FromSeconds(30)
};
var result = MqttClient.ConnectAsync(mqttOptions).Result;
if (result.ResultCode == MqttClientConnectResultCode.Success)
{
logger.Info("连接成功");
}
else
{
logger.Info("连接失败");
}
var result1 = MqttClient .PublishAsync("topic", "内容1", MqttQualityOfServiceLevel.AtMostOnce, false).Result;
if (result1.ReasonCode == MQTTnet.Client.Publishing.MqttClientPublishReasonCode.Success)
{
logger.info("发送成功");
}else
{
logger.info("发送失败");
}
MqttClient.UseDisconnectedHandler(async e =>
{
logger.Info("Disconnected >>Disconnected Server");
await Task.Delay(TimeSpan.FromSeconds(5));
try
{
await MqttClient.ConnectAsync(mqttOptions);
}
catch (Exception exp)
{
logger.Info("Disconnected >>Exception" + exp.Message);
}
});