C#MQTT发布项目(ProtoBuff语法、加密、解密)

1、新建一个控制台项目

2、设置项目名称、位置、.net框架

3、将proto文件放到项目根目录并包含在项目中

4、去Protogen官网将.proto文件在线生成C#类文件:https://protogen.marcgravell.com/
1)选择CSharp
2)复制粘贴mqtt.proto文件内容到左边,点击Generate

5、在C#中新建cs文件并将右边内容复制粘贴到cs文件中

6、添加protobuf-net包(3.2.30版本)和MQTTnet包(4.3.6.1152版本)

7、编写业务类(附上代码)

public static void MetatagRetain()
{
	Console.WriteLine("======设备主动上送位号数据======");

	#region 连接位号数据MQTT服务器
	// 创建MQTT客户端
	var mqttClient = new MqttFactory().CreateMqttClient();
	// 创建连接选项
	var options = new MqttClientOptionsBuilder()
		.WithTcpServer(ip, port) // MQTT代理地址和端口
		.WithClientId(endpointId)//客户端id
		.WithCleanSession()//清空缓存
		.Build();
	var con = mqttClient.ConnectAsync(options);
	if (con.Result.ResultCode == MqttClientConnectResultCode.Success)
	{
		// MQTT服务器连接成功
		Console.WriteLine("位号数据MQTT服务器连接成功!");
	}
	else
	{
		// MQTT服务器连接失败
		Console.WriteLine("位号数据MQTT服务器连接失败!" + con.Result.ResultCode);
	}
	#endregion

	var message = ProtobufferTool.ToBytes("message");
	string topic = "topic";
	Task.Run(async () =>
	{
		//发布消息(QOS = 0:至多一次, QOS = 1:至少一次, QOS = 2:只有一次)
		var response = await mqttClient.PublishAsync(new MqttApplicationMessageBuilder()
			.WithTopic(topic) // 主题
			.WithPayload(message)//消息体
			.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)//QOS = 0
			.WithRetainFlag(true)//启用消息的保留标志Reatin = 1
			.Build());
		if (response.ReasonCode == MqttClientPublishReasonCode.Success)
		{
			// 消息成功发布
			Console.WriteLine("位号数据推送成功!");
		}
		else
		{
			// 消息发布失败,result.ReasonCode会提供具体原因
			Console.WriteLine("位号数据推送失败!Message:" + response.ReasonCode);
		}
	});
}

8、ProtoBuff序列化和反序列化(附上代码)

using System;
using System.IO;
using ProtoBuf;

namespace MQTTClientTest
{
	public static class ProtobufferTool
	{
		// 序列化
		public static byte[] ToBytes(object obj)
		{
			try
			{
				using (MemoryStream ms = new MemoryStream())
				{
					Serializer.Serialize(ms, obj);
					var buffer = ms.GetBuffer();
					var dataBuffer = new byte[ms.Length];
					Array.Copy(buffer, dataBuffer, ms.Length);
					ms.Dispose();
					return dataBuffer;
				}
			}
			catch
			{
				return null;
			}
		}

		// 反序列化
		public static T ToObj<T>(byte[] bufferData)
		{
			if (bufferData == null)
			{
				return default;
			}
			try
			{
				using (MemoryStream ms = new MemoryStream())
				{
					ms.SetLength(bufferData.Length);
					ms.Write(bufferData, 0, bufferData.Length);
					ms.Position = 0L; 
					ms.Flush();
					T result = Serializer.Deserialize<T>(ms);
					ms.Dispose();
					return result;
				}
			}
			catch
			{
				return default;
			}
		}
	}
}

9、调用业务方法

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值