1. Что такое MQTT?
MQTT (Message Queuing Telemetry Transport, Message Queuing Telemetry Transport Protocol) — это «облегчённый» протокол связи, основанный на модели публикации/подписки (публикация/подписка). Протокол построен на протоколе TCP/IP и был разработан IBM в 1999 году. .Выпущен в году.
Самым большим преимуществом MQTT является то, что он может предоставлять надежные услуги обмена сообщениями в реальном времени для подключения удаленных устройств с очень небольшим количеством кода и ограниченной пропускной способностью. Как недорогой протокол обмена мгновенными сообщениями с низкой пропускной способностью, он имеет широкое применение в Интернете вещей, небольших устройствах, мобильных приложениях и т. д.
MQTT — это транспортный протокол публикации/подписки сообщений на основе клиент-сервера. Протокол MQTT легкий, простой, открытый и простой в реализации. Эти функции делают его применимым для широкого спектра приложений. Во многих случаях, в том числе в ограниченных средах, таких как межмашинная связь (M2M) и Интернет вещей (IoT).
Он широко используется в датчиках связи через спутниковые каналы, в медицинском оборудовании для периодических дозвонов, в умных домах и в некоторых миниатюрных устройствах.
Эта статья будет разработана на основе клиента .NET C# Socket WinForm MQTT для реализации подключения к серверу, публикации сообщений, подписки на сообщения, отказа от подписки и функций возврата сообщений сервера.
Клиент подключается к серверу и начинает асинхронный прием сообщений сервера.
//Параметры подключения
var option = new MQTT.MQTTClientOption()
{
ClientId = this.txtClientId.Text,
IpString = this.txtServer.Text,
Port = Convert.ToInt32(this.txtPort.Text),
UserName = this.txtUserName.Text,Пароль = this.txtPassword.Text
};
//Пример клиента
this.mqttClient = новый MQTT.MQTTClient();
this.mqttClient.ClientReceived += MqttClient_ClientReceived;
var result = await this.mqttClient.ConnectAsync(опция);
если (результат.Состояние == ложь)
{
MessageBox.Show(result.Fail, "намекать", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
//Начинаем получать
this.mqttClient.BeginReceive();
Клиент отправляет сообщение на сервер, в основном включая тему, содержание и качество сообщения.
программа отправки сообщений
private short _PacketId = 1;
private async void BtnPublish_Click(object sender, EventArgs e)
{
this.btnPublish.Enabled = false;
this.Cursor = Cursors.WaitCursor;
try
{
short qos = 0;
if (rdbLevel1.Checked)
qos = 1;
if (rdbLevel2.Checked)
qos = 2;
var data = new MQTT.PublishEntity()
{
Topic = this.txtTopic.Text,
Reload = System.Text.Encoding.UTF8.GetBytes(this.txtContent.Text),
Qos = qos,
PacketId=_PacketId
};
var result = await this.mqttClient.PublishAsync(data,false);
if(result.State == false)
{
this.AppendText("Отправка не удалась:" + result.Fail);
return;
}
this._PacketId++;
this.AppendText("Отправлено успешно, вернуть результат:" + result.Result);
}
finally
{
this.btnPublish.Enabled = true;
this.Cursor = Cursors.Default;
}
}
Клиент подписывается на сообщения, в основном включая фильтрацию тем и качества сообщений.
Метод сообщения о подписке:
private async void BtnSubscribe_Click(object sender, EventArgs e)
{
this.btnSubscribe.Enabled = false;
this.Cursor = Cursors.WaitCursor;
try
{
string fail = string.Empty;
short qos = 0;
if (rdbQos1.Checked)
qos = 1;
if (rdbQos2.Checked)
qos = 2;
MQTT.SubscribeEntity entity = new MQTT.SubscribeEntity();
entity.Filter = this.txtFilter.Text;
entity.Qos = qos;
this.AppendText("Начать подписку...");
//if (mqttClient.Subscribe(this.txtFilter.Text, qos, out result, out fail) == false)
//{
// this.AppendText(fail);
// return;
//}
var result = await mqttClient.SubscribeAsync(entity.Filter,entity.Qos);
if (result.State == false)
{
this.AppendText(result.Fail);
return;
}
this.AppendText("Подписка прошла успешно! Возвращаемый результат:" + result.Result);
MQTT.SubscribeHelper.Save(entity);
DataRow drData = this.dtSubscribes.NewRow();
drData["Id"] = entity.Id;
drData["Filter"] = entity.Filter;
drData["Qos"] = entity.Qos;
drData["Count"] = 0;
dtSubscribes.Rows.Add(drData);
}
finally
{
this.btnSubscribe.Enabled = true;
this.Cursor = Cursors.Default;
}
}
Способ отказа от подписки:
private async void DataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (this.dataGridView1.CurrentCell == null)
return;
DataRowView drv = this.dataGridView1.CurrentRow.DataBoundItem as DataRowView;
if (drv == null)
return;
if (MessageBox.Show("Подтвердите отмену текущего выбора:" + drv["Filter"].ToString() + " подписка?", "подтверждать", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
return;
try
{
this.AppendText("Начать отписываться...");
var result = await mqttClient.UnSubscribeAsync(drv["Filter"].ToString());
if (result.State == false)
{
this.AppendText(result.Fail);
return;
}
this.AppendText("Отписка прошла успешно! Результат возврата:" + result.Result);
MQTT.SubscribeHelper.Delete(drv["Id"].ToString());
this.dataGridView1.Rows.RemoveAt(this.dataGridView1.CurrentCell.RowIndex);
}
catch (Exception ex)
{
this.AppendText("Исключение отписки:" + ex.ToString());
}
}
Клиент получает сообщение, перенаправленное сервером.
private void MqttClient_ClientReceived(MQTT.MQTTClient client, MQTT.ReceiveResult receive)
{
if(receive.Data != null)
this.AppendText("DataReceived state="+receive.State+" topic="+ receive.Data.Topic + " content=" + System.Text.Encoding.UTF8.GetString(receive.Data.Reload));
else if(receive.State)
this.AppendText("DataReceived state=" + receive.State + " result=" + receive.Result);
else
this.AppendText("DataReceived state=" + receive.State + " fail=" + receive.Fail);
}
На этом знакомство с основными функциями клиентского инструмента завершено. Если есть какие-то неточности, поправьте меня!
Адрес загрузки клиента (сервер облака кода): https://gitee.com/ShiQuan25/full-product-management/raw/master/WinMQTTClient/WinMQTTClient.zip