using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Paho.MqttDotnet
{
///
/// 表示mqtt消息
///
public class MqttMessage
{
///
/// 获取或设置是否为重发的消息
///
public bool Dup { get; set; }
///
/// 获取或设置消息质量等级
///
public MqttQoS QoS { get; set; }
///
/// 获取或设置是否存储消息
///
public bool Retain { get; set; }
///
/// 获取或设置有效数据
///
public byte[] Payload { get; set; }
///
/// mqtt消息
///
public MqttMessage()
{
}
///
/// mqtt消息
///
/// qos
/// 数据
public MqttMessage(MqttQoS qos, string payload)
{
this.QoS = qos;
this.Payload = Encoding.UTF8.GetBytes(payload);
}
///
/// mqtt消息
///
/// qos
/// 数据
public MqttMessage(MqttQoS qos, byte[] payload)
{
this.QoS = qos;
this.Payload = payload;
}
///
/// 将消息有效数据转换为字符串
///
///
public override string ToString()
{
return Encoding.UTF8.GetString(this.Payload);
}
///
/// 从message指针转换
///
/// MQTTAsync_message的指针
///
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;
}
///
/// 转换为结构体
///
///
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;
}
}
}