You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.1 KiB
C#

9 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Paho.MqttDotnet
{
/// <summary>
/// 表示mqtt消息
/// </summary>
public class MqttMessage
{
/// <summary>
/// 获取或设置是否为重发的消息
/// </summary>
public bool Dup { get; set; }
/// <summary>
/// 获取或设置消息质量等级
/// </summary>
public MqttQoS QoS { get; set; }
/// <summary>
/// 获取或设置是否存储消息
/// </summary>
public bool Retain { get; set; }
/// <summary>
/// 获取或设置有效数据
/// </summary>
public byte[] Payload { get; set; }
/// <summary>
/// mqtt消息
/// </summary>
public MqttMessage()
{
}
/// <summary>
/// mqtt消息
/// </summary>
/// <param name="qos">qos</param>
/// <param name="payload">数据</param>
public MqttMessage(MqttQoS qos, string payload)
{
this.QoS = qos;
this.Payload = Encoding.UTF8.GetBytes(payload);
}
/// <summary>
/// mqtt消息
/// </summary>
/// <param name="qos">qos</param>
/// <param name="payload">数据</param>
public MqttMessage(MqttQoS qos, byte[] payload)
{
this.QoS = qos;
this.Payload = payload;
}
/// <summary>
/// 将消息有效数据转换为字符串
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Encoding.UTF8.GetString(this.Payload);
}
/// <summary>
/// 从message指针转换
/// </summary>
/// <param name="ptrmessage">MQTTAsync_message的指针</param>
/// <returns></returns>
internal static MqttMessage From(IntPtr ptrmessage)
{
var msg = (MQTTAsync_message)Marshal.PtrToStructure(ptrmessage, typeof(MQTTAsync_message));
var message = new MqttMessage
{
Dup = msg.dup > 0,
QoS = (MqttQoS)msg.qos,
Retain = msg.retained > 0
};
message.Payload = new byte[msg.payloadlen];
Marshal.Copy(msg.payload, message.Payload, 0, msg.payloadlen);
return message;
}
/// <summary>
/// 转换为结构体
/// </summary>
/// <returns></returns>
internal MQTTAsync_message ToStruct()
{
if (this.Payload == null)
{
this.Payload = new byte[0];
}
var msg = MQTTAsync_message.Init();
msg.retained = this.Retain ? 1 : 0;
msg.payloadlen = this.Payload.Length;
msg.qos = (int)this.QoS;
msg.payload = Marshal.AllocHGlobal(this.Payload.Length);
Marshal.Copy(this.Payload, 0, msg.payload, this.Payload.Length);
return msg;
}
}
}