Mqtt协议无法接收到离线消息

本文介绍了在C#中实现MQTT协议时遇到的离线消息接收问题。虽然通常建议设置ClearSession为0和QoS为1或2,但在实际操作中,问题出现在数据接收阶段。通过使用`socket.Receive`接收数据,当连接建立时,不仅会接收到连接确认响应,还会同时获取到离线消息。为避免丢失离线数据,需要按照MQTT协议进行解包处理。作者提供了MqttxxxPacket类作为命令包的实现,并分享了协议包类型的枚举值及其注释。
摘要由CSDN通过智能技术生成

Mqtt协议的实现,网上有很多文章、源码,可以下载来慢慢研究。比如《自己动手实现MQTT协议》,我参考的是这篇文章,按协议一点一点实现的。但对于离线消息的接收,所说的不多,一般的文章都是说到,要将ClearSession的标识设置为0,而用QoS要为1或者2,然后重新连接就可以收到离线消息了。

但在用C#实现的过程中,连接已经正常了,QoS也设置为2了,就是收不到离线的消息。后来发现,问题不是出现在协议上,而是在数据的接收上。在接收数据时,用socket.Receive来接收,在连接的时候,会返回数据,而接收的buff开的较大,则会在接收到服务端对connect回应的数据包外,也会把离线的数据也一起收起来。这时就要按协议来作解包处理了。如果没有作解包处理,则对收到的connect的conack命令处理,那后面的离线数据就会丢失了。

namespace MqttSDK
{
    /// <summary>
    /// Mqtt包的接收器
    /// </summary>
    public class MqttPacketReceiver
    {
        #region 属性

        #region 固定头
        /// <summary>
        /// 包类型。占第一个字节的4-7bit
        /// </summary>
        public PacketTypeEnum PacketType { get; set; }

        /// <summary>
        /// 标识。占第一个字节的0-3bit
        /// 包类型为PUBLISH时,对于MQTT 3.1.1,Bit 0:RETAIN3,Bit 1:QoS2,Bit 2:QoS2,Bit 3:DUP1。
        /// 包类型为PUBREL、SUBSCRIBE、UNSUBSCRIBE时,Bit 1:1,Bit 0、Bit 2、Bit 3均为0。
        /// 其他包类型,Bit 0、Bit 1、Bit 2、Bit 3均为0。
        /// </summary>
        public int Flags { get; set; }

        /// <summary>
        /// 剩余长度。可变头部和载荷的字节数之和。
        /// </summary>
        public int RemainingLength { get; set; }

        public byte FirstByte { get; set; }

        /// <summary>
        /// 剩余长度对应的字节
        /// </summary>
        public List<byte> RemainingLengthBytes { get; set; }
        #endregion

        #region 可变头和载荷的数据
        /// <summary>
        /// 可变头和载荷的数据
        /// </summary>
        public List<byte> BytesOfVariableHeaderAndPayload { get; set; }
        #endregion

        #endregion

        #region Read
        /// <summary>
        /// 从socket读取数据
        /// </summary>
        /// <param name="socket"></param>
        public IMqttPacket Read(Socket socket)
        {
            if (socket == null)
            {
                return null;
            }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值