forked from cm-heclouds/MQTT
-
Notifications
You must be signed in to change notification settings - Fork 0
Home
WindElegant edited this page May 14, 2017
·
8 revisions
源码又三个子模块组成,MQTT协议实现模块、专用于MQTT内存管理机制实现、以及基于MQTT实现模块实现的与ONENET平台对接的实例程序。源码基于Linux环境实现,需要运行在Linux环境下,目前未考虑代码多平台移植性方面问题。 MQTT协议参考WIKI:MQTT v3.1.1 specification
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等级
成功则返回非负数
*/
};