概述
最近项目里面需要用到MQTT,刚开始听到这个词一脸茫然,不知道是什么,最后通过自己百度整理一点资料,希望最大家有帮助。
在这里需要引用MQTTnet,可在解决方案在右键单击-选择“管理解决方案的 NuGet 程序包”-在“浏览”选项卡下面搜索 MQTTnet,为服务端项目和客户端项目都安装上 MQTTnet 库。示例中使用的是2.4版本,不同版本最低要求的.net版本或其它支持,在NuGet选中MQTTNet,右侧可以看到具体描述
1.首先创建一个winform项目作为服务端,MqttService
下面是代码的实例
private MqttServer mqttServer=null;
public Server_Form()
{
InitializeComponent();
MqttNetTrace.TraceMessagePublished += MqttNetTrace_TraceMessagePublished;
this.button2.Enabled = false;
}
/// <summary>
/// 开启连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
this.button1.Enabled = false;
this.button2.Enabled = true;
StartMqttServer();
}
catch (Exception ex)
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " rnrn");
}
}
/// <summary>
/// 断开连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.button1.Enabled = true;
this.button2.Enabled = false;
mqttServer.StopAsync();
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务停止成功!" + " rnrn");
}
/// <summary>
/// 清除日志
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
this.textBox1.Text = "";
}
#region 自定义方法
/// <summary>
/// MQTT服务开启
/// </summary>
private void StartMqttServer()
{
if (mqttServer == null)
{
try
{
var options = new MqttServerOptions
{
ConnectionValidator = p =>
{
if (p.ClientId == "c001")
{
if (p.Username != "u001" || p.Password != "p001")
{
return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
}
}
return MqttConnectReturnCode.ConnectionAccepted;
}
};
mqttServer = new MqttServerFactory().CreateMqttServer(options) as MqttServer;
mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;
mqttServer.ClientConnected += MqttServer_ClientConnected;
mqttServer.ClientDisconnected += MqttServer_ClientDisconnected;
}
catch (Exception ex)
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " rnrn");
return;
}
}
mqttServer.StartAsync();
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务启动成功!" + " rnrn");
}
/// <summary>
/// 客户端连接触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e)
{
try
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已连接,协议版本:{" + e.Client.ProtocolVersion + "}" + " rnrn");
}
catch (Exception ex)
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " rnrn");
}
}
/// <summary>
/// 客户端断开触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttServer_ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e)
{
try
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已断开连接!" + "" + " rnrn");
}
catch (Exception ex)
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " rnrn");
}
}
/// <summary>
/// 消息事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttServer_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
{
try
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.ClientId + "}]>> 主题:{" + e.ApplicationMessage.Topic + "} 负荷:{" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload) + "} Qos:{" + e.ApplicationMessage.QualityOfServiceLevel + "} 保留:{" + e.ApplicationMessage.Retain + "}" + " rnrn");
}
catch (Exception ex)
{
this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " rnrn");
}
}
private void MqttNetTrace_TraceMessagePublished(object sender, MqttNetTraceMessagePublishedEventArgs e)
{
//Console.WriteLine($">> 线程ID:{e.ThreadId} 来源:{e.Source} 跟踪级别:{e.Level} 消息: {e.Message}");
//if (e.Exception != null)
//{
// Console.WriteLine(e.Exception);
//}
}
界面就是以下
2.创建一个winform项目作为服务端,MqttClient
private MqttClient mqttClient = null;
public Client_Form1()
{
InitializeComponent();
Task.Run(async () => { await ConnectMqttServerAsync(); });
}
/// <summary>
/// 发布
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string topic = txtPubTopic.Text.Trim();
if (string.IsNullOrEmpty(topic))
{
MessageBox.Show("发布主题不能为空!");
return;
}
string inputString = txtSendMessage.Text.Trim();
var appMsg = new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes(inputString), MqttQualityOfServiceLevel.AtMostOnce, false);
mqttClient.PublishAsync(appMsg);
}
/// <summary>
/// 订阅
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string topic = txtSubTopic.Text.Trim();
if (string.IsNullOrEmpty(topic))
{
MessageBox.Show("订阅主题不能为空!");
return;
}
if (!mqttClient.IsConnected)
{
MessageBox.Show("MQTT客户端尚未连接!");
return;
}
mqttClient.SubscribeAsync(new List<TopicFilter> {
new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)
});
txtReceiveMessage.AppendText($"已订阅[{topic}]主题" + Environment.NewLine);
txtSubTopic.Enabled = false;
button2.Enabled = false;
}
#region 自定义方法
private async Task ConnectMqttServerAsync()
{
if (mqttClient == null)
{
mqttClient = new MqttClientFactory().CreateMqttClient() as MqttClient;
mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
mqttClient.Connected += MqttClient_Connected;
mqttClient.Disconnected += MqttClient_Disconnected;
}
try
{
var options = new MqttClientTcpOptions
{
//Server = "127.0.0.1",
Server = "192.168.16.207",
ClientId = Guid.NewGuid().ToString().Substring(0, 5),
UserName = "u0011123",
Password = "p00112134",
CleanSession = false,
};
await mqttClient.ConnectAsync(options);
}
catch (Exception ex)
{
Invoke((new Action(() =>
{
txtReceiveMessage.AppendText($"连接到MQTT服务器失败!" + Environment.NewLine + ex.Message + Environment.NewLine);
})));
}
}
/// <summary>
/// 连接触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttClient_Connected(object sender, EventArgs e)
{
Invoke((new Action(() =>
{
txtReceiveMessage.AppendText("已连接到MQTT服务器!" + Environment.NewLine);
})));
}
/// <summary>
/// 断开连接触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttClient_Disconnected(object sender, EventArgs e)
{
Invoke((new Action(() =>
{
txtReceiveMessage.AppendText("已断开MQTT连接!" + Environment.NewLine);
})));
}
/// <summary>
/// 消息事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MqttClient_ApplicationMessageReceived(object sender,MqttApplicationMessageReceivedEventArgs e)
{
Invoke((new Action(() =>
{
txtReceiveMessage.AppendText($">> {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");
})));
}
界面
本人第一次写,有什么问题大家可以指出来,谢谢~~~~
给大家推荐一个平台:帐号已迁移
最后
以上就是疯狂戒指为你收集整理的.NET使用MQTT通信实例的全部内容,希望文章能够帮你解决.NET使用MQTT通信实例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复