e福州app官方网站张家界网站制作
为进一步实现一个简易的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。  | 
