Mqtt 服务端与客户端实例 C#

话不多说 直接上代码 在Nuget  上添加 HslCommunication 组件 的引用

服务端 代码:

using HslCommunication;
using HslCommunication.MQTT;
using System;
using System.Globalization;
using System.Net.Http.Headers;
using System.Text;

namespace MqttTestServer
{
class Program
{
static void Main(string[] args)
{
MyClass my = new MyClass();
my.Start();
Console.ReadLine();
}
}

public class MyClass
{
private MqttServer mqttServer = null;
public void Start()
{
mqttServer = new MqttServer();
mqttServer.ServerStart(6666);
mqttServer.ClientVerification += OnConnect;
mqttServer.OnClientDisConnected += OnClientOffline;
mqttServer.OnClientConnected += OnClientOnline;
mqttServer.OnClientApplicationMessageReceive += OnClientReceive;
}

/// <summary>
/// 客户端信息的字符串
/// </summary>
/// <param name="session"></param>
/// <returns></returns>
private string ClientInfoString(MqttSession session)
{
return string.Format("ID:{0}, 用户名:{1} ,Ip:{2}", session.ClientId, session.UserName, session.EndPoint);
}

/// <summary>
/// 客户端下线时候会触发这个回调
/// </summary>
/// <param name="session"></param>
private void OnClientOffline(MqttSession session)
{
Console.WriteLine("客户端下线了!" + ClientInfoString(session));

}

/// <summary>
/// 客户端上线的时候会触发这个回调
/// </summary>
/// <param name="session"></param>
private void OnClientOnline(MqttSession session)
{
Console.WriteLine("客户端上线了!" + ClientInfoString(session));
}

/// <summary>
/// 当有客户端连接上来时会触发这个回调,返回0是通过,否则就是登录失败
/// </summary>
/// <param name="clientId"></param>
/// <param name="userName"></param>
/// <param name="passwrod"></param>
/// <returns></returns>
private int OnConnect(MqttSession mqttSession, string clientId, string userName, string passwrod)
{
Console.WriteLine("客户端连接了。");
return 0;
}


/// <summary>
/// 客户端收到消息时触发
/// </summary>
/// <param name="session"></param>
/// <param name="message"></param>
private void OnClientReceive(MqttSession session, MqttClientApplicationMessage message)
{
Console.WriteLine("客户端:" + ClientInfoString(session) + "收到消息了:" + Encoding.UTF8.GetString(message.Payload));

mqttServer.PublishTopicPayload("Real1", Encoding.UTF8.GetBytes("qqqqqqqqqeeeeeeeeeee"));
//mqttServer.PublishTopicPayload(message.ClientId,"Real1", Encoding.UTF8.GetBytes("qqqqqqqqqeeeeeeeeeee"));
}
}
}

 

客户端 代码:

using HslCommunication;
using HslCommunication.MQTT;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static HslCommunication.MQTT.MqttClient;

namespace MqttTestClient
{
/// <summary>
/// MqttClient端管理
/// </summary>
public class MqttClientManager
{
/// <summary>
/// 单例模式
/// </summary>
public static readonly MqttClientManager Instance = new MqttClientManager();

/// <summary>
/// 构造
/// </summary>
public MqttClientManager()
{
Start();
}

public MqttMessageReceiveDelegate mqttMessageReceiveDelegate { get; set; }


/// <summary>
/// Mqtt客户端对象实例
/// </summary>
public MqttClient mqttClient = null;

#region 初始化,准备项
/// <summary>
/// 主题
/// </summary>
private string _Topic = "Real";

/// <summary>
/// 客户端id
/// </summary>
private string _ClientId = Guid.NewGuid().ToString("N");

/// <summary>
/// 客户端连接服务端ip
/// </summary>
private string _IpAddress = "127.0.0.1";

/// <summary>
/// 客户端连接服务端端口号
/// </summary>
private int _Port = 6666;

/// <summary>
/// 用户
/// </summary>
private string _UerNo = "admin";

/// <summary>
/// 用户
/// </summary>
private string _Password = "admin";

#endregion

 

public void Start()
{
mqttClient = new MqttClient(new MqttConnectionOptions()
{
ClientId = _ClientId,
IpAddress = _IpAddress,
Port = _Port,
Credentials = new MqttCredential(_UerNo, _Password), // 设置了用户名和密码
});

Connect();
Regist();
}

public void Connect()
{
// 连接
OperateResult connect = mqttClient.ConnectServer();
if (connect.IsSuccess)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Failed");
}
}

public void SendMsg(object sendData)
{

if (sendData is string)
{
MqttApplicationMessage mqttApplicationMessage = new MqttApplicationMessage();
mqttApplicationMessage.Topic = _Topic;// 主题
mqttApplicationMessage.QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce; // 消息等级
//mqttApplicationMessage.QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce; // 消息等级

mqttApplicationMessage.Payload = Encoding.UTF8.GetBytes(sendData.ToString());// 数据
mqttApplicationMessage.Retain = false; // 是否保留

// 信息发布
mqttClient.PublishMessage(mqttApplicationMessage);

}

}

public void Regist()
{
// 订阅Real的主题
mqttClient.SubscribeMessage(_Topic);
mqttClient.SubscribeMessage("Real1");

// 注册事件回调

//数据接收 // 调用一次即可
// mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived;

// mqttClient.OnMqttMessageReceived += mqttMessageReceiveDelegate;


//网络通讯过程中异常 处理
mqttClient.OnNetworkError += OnNetworkErrorHandler;

}

/// <summary>
/// 数据接收回调
/// </summary>
/// <param name="client"></param>
/// <param name="topic"></param>
/// <param name="payload"></param>
private void MqttClient_OnMqttMessageReceived(MqttClient client, string topic, byte[] payload)
{ //topic是主题名字。payload是消息内容;
Console.WriteLine("我收到了消息了");
string s = Encoding.UTF8.GetString(payload);
Console.WriteLine(s);
}

/// <summary>
/// 网络通讯过程中异常,进行重连
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnNetworkErrorHandler(object sender, EventArgs e)
{
try
{
Connect();
}
catch (Exception ex)
{
//throw;
}

}

}


}

 

 

using System;
using System.Text;
using System.Threading;
using HslCommunication;
using HslCommunication.MQTT;

namespace MqttTestClient
{
class Program
{
static object res = null;

static void Main(string[] args)
{
MyClass mc = new MyClass();
//mc.Start();

//mc.Connect();//连接
//mc.Regist();//注册

//Console.WriteLine("输入“send”发送消息");
//string s = Console.ReadLine();
//if (s == "send")
//{

Console.WriteLine("我发送成功了");

MqttClientManager.Instance.SendMsg("我发送成功了实时数据了");
MqttClientManager.Instance.mqttClient.OnMqttMessageReceived +=
(MqttClient client, string topic, byte[] payload) =>
{
//if (topic == "Real1")
//{
// Console.WriteLine($"打印订阅主题{topic},{Encoding.UTF8.GetString(payload)}");

//}
Console.WriteLine($"打印订阅主题{topic},{Encoding.UTF8.GetString(payload)}");
};

Console.WriteLine(res);


// }

Console.ReadLine();
}


public static void qqqq(object aa)
{
res = aa;

}


public class MyClass
{
private MqttClient mqttClient = null;
public void Start()
{
mqttClient = new MqttClient(new MqttConnectionOptions()
{
ClientId = "ABC",
IpAddress = "127.0.0.1",
Port = 6666,
Credentials = new MqttCredential("admin", "admin"), // 设置了用户名和密码
});
}

public void Connect()
{
// 连接
OperateResult connect = mqttClient.ConnectServer();
if (connect.IsSuccess)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Failed");
}
}

public void SendMsg()
{
// 测试发布
mqttClient.PublishMessage(new MqttApplicationMessage()
{
Topic = "A", // 主题
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, // 消息等级
Payload = Encoding.UTF8.GetBytes("This is test message!"), // 数据
Retain = false, // 是否保留
});
}

public void Regist()
{

// 订阅测试,在label1上显示结果
mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可
mqttClient.SubscribeMessage("A"); // 订阅A的主题


mqttClient.OnNetworkError += OnNetworkErrorHandler;

}

private void MqttClient_OnMqttMessageReceived(MqttClient client, string topic, byte[] payload)
{          //topic是主题名字。payload是消息内容;
Console.WriteLine("我收到了消息了");
string s = Encoding.UTF8.GetString(payload);
Console.WriteLine(s);
}

/// <summary>
/// 网络通讯过程中异常,进行重连
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnNetworkErrorHandler(object sender, EventArgs e)
{
try
{
Connect();
}
catch (Exception ex)
{
// throw;
}

}


}
}
}

 

posted @ 2022-08-04 17:17  黑鹰99  阅读(2143)  评论(0)    收藏  举报