一、连接服务器
1、初始化:
mqtt_log_init();是一个空函数,自己定义宏
client = mqtt_lease();//创建一个client结构体,从此以后client代表客户端
platform_memory_alloc();//是一个分配内存的总函数,可以适用于Linux、FreeRTos等等
mqtt_init();//分配完然后初始化一些信息,就比如说有MQTT的版本、保持心跳间隔等等很多
2、配置一下连接的信息:
mqtt_set_host();//要去链接哪个服务器
mqtt_set_port;//连接服务器端口
.
.
等信息
3、开始连接
mqtt_connect();//开始连接
mqtt_connec_with_results();//成功就调用它
network_init();//网络初始化
network_connect();//进行网络连接
如果不考虑安全性
nettype_tcp_connect();//进行TCP连接
platform_net_socket_connect();//最底层的设计硬件驱动
如果移植到Linux不需要改,如果是FreeRTos则需要大改(AT命令、串口操作)
二、创建线程

接上面
mqtt_connect();//开始连接
mqtt_connec_with_results();//成功就调用它
network_init();//网络初始化
network_connect();//进行网络连接
mqtt_send_packet();//图一中CONNECT请求连接
mqtt_wait_packet();//图一中CONNECT确认请求连接
pthread_create("标题", , name, c);//创建名为name一个线程,这里以mqtt_publish_thread为例:‘
三、发布消息
mqtt_publish_thread();//构造一个消息结构体,有数据长度payloadlen和上报的数据保存在*payload
1、构造消息
mqtt_message_t msg;
memset(&msg, 0, sizeof(msg));
msg.payload = (void *)buf;
msg.payloadlen = xxx;
mqtt_publish();
2、根据MQTT协议将数据有序化
MQTTSerialize_publish();//排序,将数据序列化
3、根据平台相关的函数发送数据包
mqtt_send_packet();//发送数据包
network_write();
nettype_tcp_write();
platform_net_socket_write_timeout();//最后的底层
四、订阅消息(检测消息来并且接收)
mqtt_subscrib(client, "topic1", QOS0, topic1_handler); //订阅 "topic1"这个主题的消息,通过topic1_handler这个函数处理消息。
topic1_handler()//控制这个消息目的,比如去干某些事情
大体框架:
线程{
while(1)
{
读网络数据;
if(是发布消息)
{
分辨主题;
调用对应函数;
}
}
}
mqtt_subscrib(client, "topic1", QOS0, topic1_handler);
1、创建一个结构体
topic_filter:指向一个字符串,表示哪个主题。
handler:一个函数指针
2、将数据放入结构体
mqtt_msg_handler_create; //
platform_memory_alloc();//分配一块内存
将数据传给结构体;
3、记录下来,存在链表list中
mqtt_ack_list_record();//放入某个链表
目的是以后在遇到这个主题的消息时候直接调用链表存的函数。
五、核心线程
mqtt_connect();//开始连接
platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, );//连接成功后创建核心线程
mqtt_yield_thread();
mqtt_yield();//1、读包处理包 2、保持心跳(是不是发ping信号)3、处理错误
mqtt_packet_handle;
1)读包处理包
mqtt_read_packet;先读包
switch(){//处理
case0: 没收到包
case x:处理某个包
}
2)保持心跳
3)处理错误,重连
具体如何处理(以PUBLISH为例子):
mqtt_publish_packet_handle();//处理包函数
MQTTDeserialize_publish();//解析包
mqtt_deliver_message();//传送消息
mqtt_get_msg_handler(c, 主题);//根据主题在链表找出handler,调用handler对应处理函数。