Skip to content
WindElegant edited this page May 14, 2017 · 8 revisions

ONENET MQTT源码实现分析

源码又三个子模块组成,MQTT协议实现模块、专用于MQTT内存管理机制实现、以及基于MQTT实现模块实现的与ONENET平台对接的实例程序。源码基于Linux环境实现,需要运行在Linux环境下,目前未考虑代码多平台移植性方面问题。 MQTT协议参考WIKI:MQTT v3.1.1 specification

MQTT协议实现模块

MQTT协议实现模块,主要是提供MQTT协议不同协议包的组包函数,并对MQTT运行环境进行接口封装,预留部分平台相关接口由接口使用者自行实现。MQTT协议实现模块关键结构体定义如下:

/** MQTT 运行时上下文 */
struct MqttContext {
    char *bgn;
    char *end;
    char *pos;

    void *read_func_arg; /**< read_func的关联参数 */
    int (*read_func)(void *arg, void *buf, uint32_t count);
        /**< 读取数据回调函数,arg为回调函数关联的参数,buf为读入数据
             存放缓冲区,count为buf的字节数,返回读取的数据的字节数,
             如果失败返回-1,读取到文件结尾返回0. */

    void *writev_func_arg; /**< writev_func的关联参数 */
    int (*writev_func)(void *arg, const struct iovec *iov, int iovcnt);
        /**<  发送数据的回调函数,其行为类似于 unix中的writev,
              arg是回调函数的关联参数,iovcnt为iov对象的个数,iovec定义如下:
              struct iovec {
                  void *iov_base;
                  size_t iov_len;
              }
			  返回发送的字节数,如果失败返回-1.
        */

    void *handle_ping_resp_arg; /**< 处理ping响应的回调函数的关联参数 */
    int (*handle_ping_resp)(void *arg); /**< 处理ping响应的回调函数,成功则返回非负数 */

    void *handle_conn_ack_arg; /**< 处理连接响应的回调函数的关联参数 */
    int (*handle_conn_ack)(void *arg, char flags, char ret_code);
        /**< 处理连接响应的回调函数, flags取值@see MqttConnAckFlag,
             ret_code的值为 @see MqttRetCode, 成功则返回非负数
         */

    void *handle_publish_arg; /**< 处理发布数据的回调函数的关联参数 */
    int (*handle_publish)(void *arg, uint16_t pkt_id, const char *topic,
                          const char *payload, uint32_t payloadsize,
                          int dup, enum MqttQosLevel qos);
        /**< 处理发布数据的回调函数, pkt_id为数据包的ID,topic为
             数据所属的Topic, payload为数据的起始地址, payloadsize为
             payload的字节数, dup为是否重发状态, qos为QoS等级,成功返回非负数,
			 SDK将会自动发送对应的响应包。
         */

    void *handle_pub_ack_arg; /**< 处理发布数据确认的回调函数的关联参数 */
    int (*handle_pub_ack)(void *arg, uint16_t pkt_id);
        /**< 处理发布数据确认的回调,pkt_id为被确认的发布数据数据包的ID,成功则返回非负数 */

    void *handle_pub_rec_arg; /**< 处理发布数据已接收的回调函数的关联参数 */
    int (*handle_pub_rec)(void *arg, uint16_t pkt_id);
        /**< 处理发布数据已接收的回调函数,pkt_id为布数据已接收数据包的ID,成功则返回非负数 */

    void *handle_pub_rel_arg; /**< 处理发布数据已释放的回调函数的关联参数 */
    int (*handle_pub_rel)(void *arg, uint16_t pkt_id);
        /**< 处理发布数据已释放的回调函数, pkt_id为发布数据已释放数据包的ID,成功则返回非负数 */

    void *handle_pub_comp_arg; /**< 处理发布数据已完成的回调函数的关联参数 */
    int (*handle_pub_comp)(void *arg, uint16_t pkt_id);
        /**< 处理发布数据已完成的回调函数,pkt_id为发布数据已完成数据包的ID,成功则返回非负数 */

    void *handle_sub_ack_arg; /**< 处理订阅确认的回调数据的关联参数 */
    int (*handle_sub_ack)(void *arg, uint16_t pkt_id,
                          const char *codes, uint32_t count);
        /**< 处理订阅确认的回调数据, pkt_id为订阅数据包的ID,
             codes为@see MqttRetCode,按顺序对应订阅数据包中的Topic,
             count为codes的个数,成功则返回非负数
         */

    void *handle_unsub_ack_arg; /**< 处理取消订阅确认的回调函数的关联参数 */
    int (*handle_unsub_ack)(void *arg, uint16_t packet_id);
        /**< 处理取消订阅确认的回调函数, pkt_id为取消订阅数据包的ID,成功则返回非负数 */

    void *handle_cmd_arg; /**< 处理命令的回调函数的关联参数 */
    int (*handle_cmd)(void *arg, uint16_t pkt_id, const char *cmdid,
                      int64_t timestamp, const char *desc, const char *cmdarg,
                      uint32_t cmdarg_len, int dup, enum MqttQosLevel qos);
        /**< 处理命令的回调函数, cmdid 为命令ID, timestamp为命令时间戳,为0标示无时间戳,
		     desc为命令描述, cmdarg为命令参数,cmdarg_len为命令参数长度,
             dup为命令是否为重发状态, qos为QoS等级
			 成功则返回非负数
         */
};