Skip to content

FreeMQTT 简介

FreeMQTT是用Python编程语言并基于Tornado Web框架开发的 一款MQTT服务器开源软件。

如无特殊声明,本指南中 "FreeMQTT" 等同于 "FreeMQTT 服务器"。

历史

2013年,我们在一个项目中决定采用 MQTT协议, 最开始打算用开源的 mosquitto broker , 在经过压力测试后,我们放弃了这个Broker。最终我们开始尝试自己用 Python 2.x 语言并基于 Tornado Web 框架(自带TCP server 框架)来实现一个 MQTT Broker。这便是第一个版本的 FreeMQTT v0.01, 实现的MQTT的协议版本是 v3.1。经过和 mosquitto (2013年的版本)对比测试结果,极大地激励着我们把这个项目做下去。

2014年,根据当是 MQTT 官方发布的最新协议 3.1.1(当时为修订版本,非正式版本),我们升级了 FreeMQTT 到 v0.02 版本。

2016年,FreeMQTT 从 Python 2.x 迁移到 Python 3.x 并采用 async / await 的异步 io 机制重构了 FreeMQTT,版本升级到 v0.05。

2018年,再次对 FreeMQTT 重构,主要是采用 leveldb key-value 数据库实现 session & subscribe & retain 消息的持久性存储。FreeMQTT升级到 v0.08。

2022年,在 FreeMQTT 中实现 MQTT over Websocket 功能。 FreeMQTT 版本为 v0.09。

2024年,基于新的 MQTT V5.0 协议版本,再次彻底重构 FreeMQTT, 在这次重构中,摒弃了 leveldb 持久性存储而采用内存存储机制。在新版本的 FreeMQTT 同时支持 MQTT 3.1.1 & MQTT 5.0,但不再支持 MQTT 3.1;采用了新的存储管理与订阅匹配算法,匹配时间复杂度为 O(1)。

当前 FreeMQTT 最新版本号为 v1.02

理念

  • 以人为本,面向用户
  • 取舍有度,做精做强
  • 不尚空谈,不搞花架子
  • 化繁为简,去伪存真
  • 持续迭代,精益求精
  • 安全第一,高效稳定

特色

独特的应用隔离安全机制

  • FreeMQTT 把每个接入的 MQTT 客户端划归为一个独立的 App
  • 通过 freemqtt_token 命令为每个App生成令牌Token(可生成多个)
  • 令牌 Token 含有 App ID 并用秘钥 secret 进行了加密签名
  • MQTT 客户端连接 FreeMQTT 时将令牌 Token 做口令 password 传入 connect 方法
  • FreeMQTT 在接收到 CONNECT 消息时,通过解密,验证签名来进行鉴权
  • 如果 FreeMQTT 鉴权成功,则会从令牌Token得到MQTT客户所属的App ID
  • 不同的App之间,MQTT客户是相互独立的,例如 App A 有个客户A, App B 有个客户B,则客户A与客户B可以具有相同的客户ID
  • 每个App相当于一个虚拟的MQTT Server
  • 不同的App之间消息隔离,互不干扰

独特的存储管理与订阅匹配算法

  • 独特的存储管理架构
  • 独特Topic和订阅Topic Filter匹配算法,匹配时间复杂度为 O(1)
  • 在Topic级数固定的情形下,主题Topic匹配速度是有界的常数
  • 匹配时间不会随着客户端订阅的主题增加而增加

定期发布统计信息

  • 定期通过系统主题 $SYS/METRICS 发布每个Application统计信息
  • 在线客户数、收发消息总数、普通订阅主题数、共享订阅主题数、retain 消息数、服务器持续运行时间

独有的MQTT客户端上线下线通知机制

  • 通过系统主题 $SYS/ONLINE 实时通知客户上线
  • 通过系统主题 $SYS/OFFLINE 实时通知客户下线
  • 避免了传统的需要客户端设置的遗嘱消息才能得到离线的通知,且不能得到上线通知

支持MQTT3.1.1和MQTT5.0 客户互通共存

  • 可以同时接受MQTT3.1.1 & MQTT5.0的客户接入
  • MQTT3.1.1和MQTT5.0客户之间可以互通消息