.NET+Socket 开发MQTT 客户端
2023-03-07 09:08:56 时间
一、什么是MQTT?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于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,
Password = this.txtPassword.Text
};
//实例客户端
this.mqttClient = new MQTT.MQTTClient();
this.mqttClient.ClientReceived += MqttClient_ClientReceived;
var result = await this.mqttClient.ConnectAsync(option);
if(result.State == false)
{
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
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的