FreeMQTT 简介
FreeMQTT 是用 Python 编程语言并基于 Tornado Web 框架开发的 一款MQTT服务器开源软件。
特色
多种传输层协议支持
- MQTT3.1.1 和 MQTT5.0
- MQTT over TCP
- MQTT over Websocket
- TLS / SSL
独特的应用隔离安全机制(多租)
- 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客户之间可以互通消息
快速上手
运行环境
Python3.9+
克隆源码
$ git clone https://github.com/chenglinning/freemqtt.git
或
$ git clone https://gitee.com/ningchenglin/freemqtt
进入freemqtt 路径
$ cd ./freemqtt
安装依赖包
$ python -m pip install -r requirements.txt
运行
$ python ./freemqttd.py
[I 240921 16:54:11 freemqttd:91] freemqttd started
生成客户端密码(Token)
$ ./freemqtt_token myapp2
AppID: myapp2
Token: gVRVsBqw3bQSD4CQ4rFOXtfGQMelHJmEaNlYtH7GS/A=
使用 mqttx客户端工具 进行测试
- 输入连接参数
- 连接FreeMQTT