- mosquitto分析
核心数据结构
struct mosquitto(mosquitto_internal.h) 保存客户端连接的所有信息
struct mosquitto_db(mosquitto_broker.h) 对所有内部数据的统一管理,保存所有客户端,订阅关系,可是为数据仓库
struct _mosquitto_subhier(mosquitto_broker.h) 保存订阅树的所有节点,mosquitto中对订阅树采用孩子-兄弟链表法的方式存储
struct _mosquitto_config(mosquitto_broker.h) 保存mosquitto的所有配置信息,程序启动时候将初始化该结构体,并从配置文件读取配置信息保存在该结构体中
核心功能分析:
1.生存周期不同,系统topic无论是否有用户订阅都会存在于订阅树中,但业务topic必须有客户端订阅才能存在(除非其消息字段retain设置为1)
2.创建方式不同,系统topic在消息发布时创建,业务topic可以在订阅时和发布时创建(需要设置retain设置为1);
3.消息保存方式不同,凡发布到系统topic的消息都会保存,业务消息将直接挂到订阅列表的各context消息队列中,如无连接点阅或未设置retain字段,消息不会被保存
mqtt3_handle_publish检查retain字段的值,该函数打印retain=(header & 0x01);
获取消息头部第一个bit位,在mqtt3.1中,该位用于表示消息的类型是否为retain
订阅树在程序中采用孩子--兄弟链表示 涉及数据结构如下
struct _mosquitto_subhier
struct _mosquitto_subleaf
3.1.1 订阅树创建
程序启动创建订阅树:订阅树总根节点,业务子树根节点&&系统子树根节点。这两个子树根节点作为订阅树总根
节点的两个子节点。订阅总根节点和业务子树根节点中topic成员的值为空字符串,而系统子树根节点中保存的值为"$SYS"
1.创建订阅树
2.搭建订阅树
3.
mosquitto分析
最新推荐文章于 2024-07-02 14:58:47 发布
