为进一步实现一个简易的MQTT客户端,做如下客户端数据结构设计。
1、客户端协议相关的函数
连接 | tx_connect() | 发送连接请求 | 手动触发 |
rx_connectack() | 接收到服务端回应的连接响应 | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据client查找connect。 | |
发布,Qos=0 | tx_publish(Qos=0) | 手动触发 | |
发布,Qos=1 | tx_publish(Qos=1) | 手动触发 | |
rx_puback() | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据m_uuid查找message。 | ||
发布,Qos=2 | tx_publish(Qos=2) | 手动触发 | |
rx_pubrec() | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据m_uuid查找message。 | ||
tx_pubrel() | 根据pubrec触发 | ||
rx_pubcomp() | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据m_uuid查找message。 | ||
订阅 | tx_subscribe() | 手动触发 | |
rx_suback() | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据s_uuid查找subscribe。 | ||
取消订阅 | tx_unsubscribe() | 手动触发 | |
rx_unsuback() | Socket中监听,通过第一个字节switch,根据TCP/IP查找client,根据s_uuid查找subscribe。 | ||
心跳 | tx_pingreq() | 自动定时触发 | |
rx_pingresp() | |||
断开连接 | tx_disconnect | 手动触发 |
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对象都有一个连接结构体,用该参数来与MQTT服务器建立连铸。 |
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对象的订阅。 |