Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Официальное введение:
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker). The implementation is based on the documentation from http://mqtt.org/.
* Tested on local machine (Intel i7 8700K) with MQTTnet client and server running in the same process using the TCP channel. The app for verification is part of this repository and stored in /Tests/MQTTnet.TestApp.NetCore.
This library is available as a nuget package: https://www.nuget.org/packages/MQTTnet/
Используйте VS для создания проекта mqtt и выберите проект winform, чтобы облегчить создание интерфейса и просмотреть соответствующую информацию о данных. Проект включает в себя два: сервер и клиент.
Структура интерфейса серверной стороны следующая:
Сервер добавляет локальный IP в программу:
var ips = Dns.GetHostAddressesAsync(Dns.GetHostName());
foreach (var ip in ips.Result)
{
switch (ip.AddressFamily)
{
case AddressFamily.InterNetwork:
TxbServer.Text = ip.ToString();
break;
case AddressFamily.InterNetworkV6:
break;
}
}
Добавьте действие для добавления данных в список:
private Action<string> _updateListBoxAction;
//Определено в методе загрузки
//При наличии более 1000 фрагментов данных автоматически удаляем первый
//Когда появляется полоса прокрутки, она автоматически перемещается вниз
_updateListBoxAction = new Action<string>((s) =>
{
listBox1.Items.Add(s);
if (listBox1.Items.Count > 1000)
{
listBox1.Items.RemoveAt(0);
}
var visibleItems = listBox1.ClientRectangle.Height/listBox1.ItemHeight;
listBox1.TopIndex = listBox1.Items.Count - visibleItems + 1;
});
//Добавляем ключевое событие и очищаем список при нажатии c
listBox1.KeyPress += (o, args) =>
{
if (args.KeyChar == 'c' || args.KeyChar=='C')
{
listBox1.Items.Clear();
}
};
mqttserver
private async void MqttServer()
{
if (null != _mqttServer)
{
return;
}
var optionBuilder =
new MqttServerOptionsBuilder().WithConnectionBacklog(1000).WithDefaultEndpointPort(Convert.ToInt32(TxbPort.Text));
if (!TxbServer.Text.IsNullOrEmpty())
{
optionBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(TxbServer.Text));
}
var options = optionBuilder.Build();
(options as MqttServerOptions).ConnectionValidator += context =>
{
if (context.ClientId.Length < 10)
{
context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
return;
}
if (!context.Username.Equals("admin"))
{
context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
return;
}
if (!context.Password.Equals("public"))
{
context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
return;
}
context.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
};
_mqttServer = new MqttFactory().CreateMqttServer();
_mqttServer.ClientConnected += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, $">Client Connected:ClientId:{args.ClientId},ProtocalVersion:");
var s = _mqttServer.GetClientSessionsStatusAsync();
label3.BeginInvoke(new Action(() => { label3.Text = $"Общее количество соединений: {s.Result.Count}"; }));
};
_mqttServer.ClientDisconnected += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, $"<Client DisConnected:ClientId:{args.ClientId}");
var s = _mqttServer.GetClientSessionsStatusAsync();
label3.BeginInvoke(new Action(() => { label3.Text = $"Общее количество соединений: {s.Result.Count}"; }));
};
_mqttServer.ApplicationMessageReceived += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction,
$"ClientId:{args.ClientId} Topic:{args.ApplicationMessage.Topic} Payload:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)} QualityOfServiceLevel:{args.ApplicationMessage.QualityOfServiceLevel}");
};
_mqttServer.ClientSubscribedTopic += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, $"@ClientSubscribedTopic ClientId:{args.ClientId} Topic:{args.TopicFilter.Topic} QualityOfServiceLevel:{args.TopicFilter.QualityOfServiceLevel}");
};
_mqttServer.ClientUnsubscribedTopic += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, $"%ClientUnsubscribedTopic ClientId:{args.ClientId} Topic:{args.TopicFilter.Length}");
};
_mqttServer.Started += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, "Mqtt Server Start...");
};
_mqttServer.Stopped += (sender, args) =>
{
listBox1.BeginInvoke(_updateListBoxAction, "Mqtt Server Stop...");
};
await _mqttServer.StartAsync(options);
}
Привязать все события, определенные в mqttserver
(параметры как MqttServerOptions).ConnectionValidator используется для проверки соединения mqttclient.
Чтобы просмотреть полный код, перейдите на сайт gitee.
https://gitee.com/sesametech-group/MqttNetSln
Как вы думаете, статья хорошая?,переехать вgiteeДай это мнеstar
Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/152877.html Исходная ссылка: https://javaforall.cn