专用于MQTT发布/订阅规则专用数据结构SDK(发布/订阅规则匹配目录树)

 

  1.  概述

本文讲述我公司MQTT订阅规则目录树SDK的技术特点、功能描述、应用领域等内容。

 

  1.  版权说明
  2. 本开发包的32位版本免费,用户可用于学习、测试、商业用途,没有功能、性能上的限制,可自由复制、传播。

 

  1. 本开发包的64位版本收费,需要向我公司购买使用授权,未经授权不得使用。

 

Windows 32位SDK下载地址:

https://download.csdn.net/download/freeland008/10781672

  1.  MQTT订阅目录树SDK介绍

此数据结构是专门针对MQTT的订阅匹配规则开发的,把MQTT中所有客户的订阅规则保存在目录树结构中,然后进行插入、删除、查询、匹配操作。本SDK提供了执行这些操作的API函数。每级目录是采用压缩Trie数进行保存。

 

  1.  MQTT订阅目录树应用场景

除了针对性的应用于MQTT订阅/发布,也可应用于其他形式的订阅/发布场景还可以应用于其他目录形式的数据结构的情况,例如:类文件系统、HTTP URL地址处理、域名解析、Email地址解析、通讯录、权限管理等应用。

 

  1.  支持MQTT3.X//X订阅目录规范

1、支持#和+的目录通配符

2、支持的字符没有限制,可以是数字、字母、符号,和UTF8等。

3、支持空目录和任意级目录,目录的层次没有限制。

4、每级目录的长度没有限制。

 

  1.  支持MQTT3.X/5/X发布/订阅匹配规范

1、#可以匹配任意级的目录

2、+匹配单一级目录

3、可以连续使用连续+通配合,例如 +/+、+/+/+,连续+没有限制。

4、禁止连续#

   例如: #/#、#/#/#

5、进制#+先后连续出现

   例如: #/+、+/#、#/+/#

  1.  实现特点

1、每层目录采用压缩Trie树进行索引。使得插入、删除目录速度更快,占用内

存更少。

 

2、内置高效的内存分配机制,使内存的配置和释放速度更快,也可以使用开发

人员自定义的内存管理机制。

 

3、采用高效的模糊匹配技术实现订阅规则匹配发布主题和发布主题匹配订阅规

则。

  1.  容量巨大

1、订阅规则目录树支持的目录数量没有限制,支持上亿/10亿/百亿的订阅规则,

适合超大规模的订阅发布的应用场景。

2、目前默认的支持的目录层数是254层。如有特殊需求,可提供定制版本。

3、最大目录长度是8191字节。

  1.  运行效率高
  1. 根据目录进行精确访问操作: 插入、删除、查询、节点的速度快。利用Trie树的特点。

 

2、根据目录进行边界值(>、>=、 <=、<)比较查询速度快。利用Trie树的特点

 

3、根据节点句柄进行遍历效率高。(GetHead、GetTail、GetNext、GetPrev)

 

  1. 根据订阅主题在订阅规则树种匹配效率高。(MatchFilter)

 

  1. 根据订阅主题在订阅规则树种匹配效率高。(Match Topic)

 

6、在频繁插入、删除目录的情况下,系统仍然保持运行稳定,不会出现性能抖

动的情况。

 

7、支持超大容量目录结构

在目录树有庞大数量节点的情况下,仍然能保持高效运行。根据主键精确

访问(新建、删除、查询、模糊匹配)节点的耗时目录树中总目录数量无关,

只与目录层次有关。

 

  1.  功能强大(提供丰富的API)

订阅目录树功能强大,可以满足目前MQTT服务器中对该数据结构功能上的需求。

本SDK提供丰富API函数的供开发人员调用。

  1. 创建、删除树API
  2. 新增、删除目录API
  3. 根据目录精确查询节点API
  4. 根据边界值进行>、>=、<=、<的节点精确查询的API
  5. 提供首节点、下节点、上节点、末节点的遍历查询API
  6. 根据发布主题在目录树中匹配订阅规则
  7. 根据订阅规则在主体目录树中匹配

8、其他附加功能函数API:清空树,根据节点句柄删除目录,获取句柄值、获

取路径等。

 

int FdtSysInit(LPFDTINITENV pInitEnv = NULL);

HANDLE FdtCreateTree(char* sMatchAll, char* sMatchSingle);

int FdtDeleteTree(HANDLE hTree, ONFUZZYDIRAPI pPreDeleteFun = NULL, void* pInputPara = NULL);

void FdtRemoveAll(HANDLE hTree, ONFUZZYDIRAPI pPreDeleteFun = NULL, void* pInputPara = NULL);

size_t FdtGetCount(HANDLE hTree);

bool FdtMatchFilter(HANDLE hTree, char* sPath, char cSeparator, ONFUZZYDIRMATCHED

fpMatchedFilter, void* pPara);

bool FdtMatchTopic(HANDLE hTree, char* sPath, char cSeparator,

 ONFUZZYDIRMATCHED fpMatchedFilter, void* pPara);

bool FdtAddKey(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE hValue, POSITION& pos);

bool FdtRemoveKey(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE& hValue);

bool FdtGetKeyValue(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE& hValue);

POSITION FdtGetKeyPosition(HANDLE hTree, int nLevel, char* sMultiDir[]);

bool FdtAddPath(HANDLE hTree, char cSeparator, char* sPath, HANDLE hValue, POSITION& pos);

bool FdtRemovePath(HANDLE hTree, char cSeparator, char* sPath, HANDLE& hValue);

bool FdtGetPathValue(HANDLE hTree, char cSeparator, char* sPathsMultiDir, HANDLE& hValue);

POSITION FdtGetPathPosition(HANDLE hTree, char* sPath, char cSeparator = '/');

int FdtGetPosKey(POSITION pos, char* sText, char* sMultiDir[]);

int FdtGetPosPath(POSITION pos, char* sPath, char cSeparator = '/');

HANDLE FdtGetPosValue(POSITION pos);

void FdtSetPosValue(POSITION pos, HANDLE hValue);

void FdtRemoveAt(HANDLE hTree, POSITION pos);

// 获取头节点的句柄值

bool FdtGetHead(HANDLE hTree, HANDLE& hValue);

// 获取头节点

POSITION FdtGetHeadPosition(HANDLE hTree);

// 获取末节点的句柄值

bool FdtGetTail(HANDLE hTree, HANDLE& hValue);

// 获取尾节点

POSITION FdtGetTailPosition(HDIRTREE hTree);

// 删除头节点,并返回节点句柄值

bool FdtRemoveHead(HANDLE hTree, HANDLE& hValue);

// 删除尾节点,并返回节点句柄值

bool FdtRemoveTail(HANDLE hTree, HANDLE& hValue);

// 获取当前实节点的下一个节点

POSITION FdtGetNextPosition(HANDLE hTree, POSITION pos);

HANDLE FdtGetNext(HANDLE hTree, POSITION& pos);

// 获取当前实节点的上一个节点

POSITION FdtGetPrevPosition(HDIRTREE hTree, POSITION pos);

HANDLE FdtGetPrev(HANDLE hTree, POSITION& pos);

// 以下4个函数用于根据键值进行范围查询

// 获取第一个>指定键值的节点

POSITION FdtGetFirstPosGTDir(HANDLE hTree, int nLevel, char* sMultiDir[]);    

// 获取第一个>=指定键值的节点

POSITION FdtGetFirstPosGEDir(HANDLE hTree, int nLevel, char* sMultiDir[]);    

// 获取第一个<=指定键值的节点

POSITION FdtGetFirstPosSEDir(HANDLE hTree, int nLevel, char* sMultiDir[]);    

// 获取第一个<指定键值的节点

POSITION FdtGetFirstPosSTDir(HANDLE hTree, int nLevel, char* sMultiDir[]);

// 以下4个函数用于根据键值进行范围查询

// 获取第一个>指定键值的实节点

POSITION FdtGetFirstPosGTPath(HANDLE hTree, char* sPath, char cSeparator = '/');

// 获取第一个>=指定键值的节点

POSITION FdtGetFirstPosGEPath(HANDLE hTree, char* sPath, char cSeparator = '/');

// 获取第一个<=指定键值的节点

POSITION FdtGetFirstPosSEPath(HANDLE hTree, char* sPath, char cSeparator = '/');

// 获取第一个<指定键值的节点

POSITION FdtGetFirstPosSTPath(HANDLE hTree, char* sPath, char cSeparator = '/');

 

  1.  运行环境
  1. windows, 32位、64位
  2. linux, 64位
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值