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; } } }