针对物联网中MQTT协议的学习_客户端代码学习笔记(二)

来源:互联网 发布:java处理引号 编辑:程序博客网 时间:2024/06/10 00:58

前一篇是有关Mqtt底层协议机制的阅读,这一片针对客户端逻辑进行学习


MQTT客户端建立逻辑步骤:建立连接 ——> 链接回复 ——> 订阅服务(要有订阅关键词) ——> 订阅确认 ——> 发布消息 穿插心跳 、心跳回复


1、建立连接; 建立连接需要一个结构体
typedef struct
{
char struct_id[4];             //定值
int struct_version;            //定值
unsigned char MQTTVersion;
MQTTString clientID;           //客户ID
unsigned short keepAliveInterval;
unsigned char cleansession;    //0:表示如果订阅的客户机断线了,要保存为其要推送的消息 1:上线清理消息?
unsigned char willFlag;        //遗嘱标志
MQTTPacket_willOptions will;   //遗嘱
MQTTString username;
MQTTString password;
} MQTTPacket_connectData;
   初始化
{ {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }




2、订阅消息
   应该包含一个TopicName(Subject/Channel),即订阅关键词
   QoS=1:
   至少一次,有可能重复。
   Client[Qos=1,DUP=0/*重复次数*/,MessageId=x] --->PUBLISH--> Server收到后,存储Message,发布,删除,向Client回发PUBACK

   Client收到PUBACK后,删除Message;如果未收到PUBACK,设置DUP++,重新发送,Server端重新发布,所以有可能重复发送消息

   每次和云端交互后都要返回具体的交互类型 如CONNACK,SUBACK等。

   
3、发布消息 心跳响应





心跳:
(1)我们设置的MQTT是闲时心跳、并且是长链接
(2)心跳时间(Keep Alive timer)

     以秒为单位,定义服务器端从客户端接收消息的最大时间间隔。一般应用服务会在业务层次检测客户端网络是否连接,不是TCP/IP协议层面的心跳机制(比如开启SOCKET的SO_KEEPALIVE选项)。 一般来讲,在一个心跳间隔内,客户端发送一个PINGREQ消息到


参考:http://www.tuicool.com/articles/AFvmee
  http://www.cnblogs.com/caca/p/mqtt.html

0 0
原创粉丝点击