Mqtt 接收包含QoS为0但具有消息ID的发布消息

Mqtt 接收包含QoS为0但具有消息ID的发布消息,mqtt,Mqtt,我正在使用MQTT(在C#中)开发一个M2M应用程序,但我不知道这有什么关系。我已经向代理发布了一条消息,其中QoS为1,并且RETAIN位为ON。当我随后订阅该主题时(订阅时QoS为0),我收到一条发布消息,消息头显示它的QoS为0 我遇到的问题是,主题的变量头包含消息ID,但我无法通过编程知道它在那里。规范似乎指出,只有当设置了QoS或1或2时,MessageID才应该出现,但传入数据包的字节0显然是0x31(消息类型为PUBLISH,QoS为0,RETAIN=1) 现在我的解决方法是反序列

我正在使用MQTT(在C#中)开发一个M2M应用程序,但我不知道这有什么关系。我已经向代理发布了一条消息,其中
QoS
为1,并且
RETAIN
位为ON。当我随后订阅该主题时(订阅时
QoS
为0),我收到一条发布消息,消息头显示它的
QoS
为0

我遇到的问题是,主题的变量头包含消息ID,但我无法通过编程知道它在那里。规范似乎指出,只有当设置了
QoS
或1或2时,MessageID才应该出现,但传入数据包的字节0显然是0x31(消息类型为
PUBLISH
QoS
为0,
RETAIN
=1)

现在我的解决方法是反序列化数据,如果出现异常,我将向前跳转两个字节,然后重试。这很管用,但我确实觉得很尴尬


这是预期的行为吗?我用的经纪人有问题吗?我对规格有什么误解

从你所说的话来看,肯定有什么不对劲。这不是预期的行为,也不是对规范的误解。QoS 0消息中不应该有消息id


你在用什么经纪人?您可以在test.mosquitto.org:1883上对代理尝试您的代码,看看它的行为是否相同吗?同样,如果现有客户机(如Mosquito_sub)出现问题,那么不是您出了问题。

我使用的是Eurotech的Everware设备云代理。闻起来像虫子。我是MQTT的新手,所以我不想这么早就扔掉bug标志。您使用的是哪个C#客户端库?您是否对test.mosquitto.org或m2m.eclipse.org尝试过相同的代码?