c#使用的是mqtt.net通过nuget下载安装即可。
这是c#封装的调用类
using System;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
namespace mqtt_V0._0
{
public class Mqtt_Client
{
public string IP { get; set; }
public string ClientID { get; set; }
public string Topic { get; set; }
public string User_name { get; set; }
public string Password { get; set; }
public int Port { get; set; }
public bool Enable_SSL { get; set; }
public string connect_sta { get; set; }
private IMqttClient _mqttClient;
public void MqttClient()
{
connect_sta = "ces";
}
public async Task<string> connect(string clientid, string ip, int port, string username, string password, bool enable_ssl)
{
this.ClientID = clientid;
this.IP = ip;
this.Port = port;
this.User_name = username;
this.Password = password;
this.Enable_SSL = enable_ssl;
try
{
MqttClientTlsOptions ssl = new MqttClientTlsOptions();
ssl.UseTls = true;
var optionsBuilder = new MqttClientOptionsBuilder()
.WithClientId(ClientID)
.WithTcpServer(IP, Port)
.WithTlsOptions(ssl)
.WithCredentials(User_name, Password)
.WithCleanSession();
_mqttClient = new MqttFactory().CreateMqttClient();
await _mqttClient.ConnectAsync(optionsBuilder.Build());
if (_mqttClient.IsConnected)
{
return "连接成功";
}
else
{
return "连接失败";
}
}
catch (Exception ex)
{
// 记录异常到日志
return "发生错误: " + ex.Message;
}
}
public string con_labview(string clientid, string ip, int port, string username, string password, bool enable_ssl)
{
return connect(clientid, ip, port, username, password, enable_ssl).GetAwaiter().GetResult();
}
public string send_labview(string values,string topic)
{
return send(values, topic).GetAwaiter().GetResult();
}
public async Task<string> send(string values,string topic)
{
try
{
this.Topic = topic;
await _mqttClient.SubscribeAsync(topic, MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce);
var message = new MqttApplicationMessageBuilder()
.WithTopic(topic)
.WithPayload(Encoding.UTF8.GetBytes(values))
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)
.Build();
await _mqttClient.PublishAsync(message);
return "ok";
}
catch (Exception ex)
{
return ex.Message;
}
}
public void close()
{
_mqttClient?.DisconnectAsync().Wait();
_mqttClient?.Dispose();
}
}
}
因为使用了异步方法,labview调用异步方法很麻烦,所以通过类内部调用异步方法来实现的调用
下图为labview调用c#类库
通过队列方式来控制是否发布消息给服务器
最后做了一个winform调试界面
代码如下
using MQTTnet;
using MQTTnet.Client;
using System;
using System.Text;
using System.Windows.Forms;
namespace mqtt
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private IMqttClient _mqttClient;
private void Form1_Load(object sender, EventArgs e)
{
}
private async void btn_con_Click(object sender, EventArgs e)
{
try
{
MqttClientTlsOptions ssl = new MqttClientTlsOptions();
ssl.UseTls = true;
var optionsBuilder = new MqttClientOptionsBuilder()
.WithClientId(txt_id.Text.Trim())
.WithTcpServer(txt_ip.Text.Trim(), int.Parse(txt_port.Text.Trim()))
.WithTlsOptions(ssl)
.WithCredentials(txt_un.Text.Trim(), txt_ps.Text.Trim())
.WithCleanSession();
_mqttClient = new MqttFactory().CreateMqttClient();
await _mqttClient.ConnectAsync(optionsBuilder.Build());
if (_mqttClient.IsConnected)
{
MessageBox.Show("连接成功");
}
else
{
MessageBox.Show("连接失败");
}
}
catch (Exception ex)
{
// 记录异常到日志
MessageBox.Show("发生错误: " + ex.Message);
}
finally
{
}
}
private async void btn_fb_Click(object sender, EventArgs e)
{
await _mqttClient.SubscribeAsync(txt_topic.Text.Trim(), MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce);
var message = new MqttApplicationMessageBuilder()
.WithTopic(txt_topic.Text.Trim())
.WithPayload(Encoding.UTF8.GetBytes(txt_js.Text))
.WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)
.Build();
await _mqttClient.PublishAsync(message);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
_mqttClient?.DisconnectAsync().Wait();
_mqttClient?.Dispose();
}
}
}
本次试验mqtt服务器是使用的EMQX Platform