为进一步实现一个简易的MQTT服务端,做如下服务端数据结构设计。
1、服务端协议相关的函数
连接 | rx_connect() | 接收连接请求 | Socket中监听,通过第一个字节switch,根据数据创建client对象 |
tx_connectack() | 回复连接响应 | 处理完成rx_connect后,自动处理。 | |
发布 Qos=0 | rx_publish() Qos=0 | 接收发布数据 Qos=0 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message。 |
发布 Qos=1 | rx_publish() Qos=1 | 接收发布数据 Qos=1 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message。 |
tx_puback() | 回复发布响应 | 处理完成rx_publish()后,自动处理。 | |
发布 Qos=2 | rx_publish() Qos=2 | 接收发布数据 Qos=2 | Socket中监听,通过第一个字节switch,根据Topic查找client,分发message,并且标记状态。 |
tx_pubrec() | 回复发布响应1 | 处理完成rx_publish()后,自动处理。 | |
rx_pubrel() | 接收pubrel数据 | Socket中监听,通过第一个字节switch,根据Topic查找client,标记message。 | |
tx_pubcomp() | 回复发布响应2 | 处理完成rx_pubrel()后,自动处理。 | |
订阅 | rx_subscribe() | 接收订阅数据 | Socket中监听,通过第一个字节switch,根据Topic查找Topics列表,将该client添加至topic中。 |
tx_suback() | 回复订阅响应 | 处理完成rx_suback()后,自动处理。 | |
取消订阅 | rx_unsubscribe() | 接收取消订阅数据 | Socket中监听,通过第一个字节switch,根据Topic查找Topics列表,将该client从topic中删除。 |
tx_unsuback() | 回复取消订阅响应 | 处理完成rx_unsuback()后,自动处理。 | |
心跳 | rx_pingreq() | 接收心跳数据 | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,更新pingtime。 |
tx_pingresp() | 回复心跳响应 | 处理完成rx_pingreq()后,自动处理。 | |
断开连接 | rx_disconnect | 接收断开连接数据 | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,将该client从clients中删除。并且将topics中的该client一并删除。 |
2、服务端数据结构
列表Clients{ Connect; TCP/IP; Messages; Subscribes; Next_client;} | Client对象列表,clinet属性有连接、TCP/IP、未处理完成的消息、未处理完成的订阅,指向下一个clinet的指针。 | |
Connect{ Protocolname; protocolLevel; Connectflage; Keepalive; Clientid; Willtopic; Willmessage; Username; Password connectflage;} | 其中: Connectflage{ Bit Usernameflag; Bit Passwordflag; Bit Willretain; Bit Willqos; Bit Willflag; Bit Cleansession; Bit Reserved; } | 每个client对象都有一个连接结构体,记录该client的连接参数。 |
TCP/IP{ IPaddr; Port; Pingtime;} | Client对象使用的传输物理实现。 | |
列表Messages{ Dup; Qos; Retain; M_uuid; Messagedata; Messageflag; Next_message;} | 其中: Messageflag; Qos=0: 0->pub; Qos=1: 0->pub,1->ack Qos=2: 0->pub,1->ack,2->rel,3->comp | Client对象未处理完成的消息。 |
列表Subscribes{ Topicfilter; S_uuid; Subscribeflag; Next_subscribe;} | 其中: Subscribeflag; 0->tx,1->ack | Client对象的订阅。 |
列表topics{ Topicname; Topic; Nexttopic;} | 其中topic{ Client; Nextclient; } | topics列表中存放了所有的topic,每个topic中存放了所有订阅该topic的client。 |