[FreeMQTT](https://freemqtt.cn/) 简介
===================================
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+
###### 克隆源码
```bash
$ git clone https://github.com/chenglinning/freemqtt.git
```
或
```bash
$ git clone https://gitee.com/ningchenglin/freemqtt
```
###### 进入freemqtt 路径
```bash
$ cd ./freemqtt
```
###### 安装依赖包
```bash
$ python -m pip install -r requirements.txt
```
###### 运行
```bash
$ python ./freemqttd.py
[I 240921 16:54:11 freemqttd:91] freemqttd started
```
###### 生成客户端密码(Token)
```bash
$ ./freemqtt_token myapp2
AppID: myapp2
Token: gVRVsBqw3bQSD4CQ4rFOXtfGQMelHJmEaNlYtH7GS/A=
```
###### 使用 [mqttx客户端工具](https://mqttx.app/zh) 进行测试
* 输入连接参数

)
* 连接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+
###### 克隆源码
```bash
$ git clone https://github.com/chenglinning/freemqtt.git
```
或
```bash
$ git clone https://gitee.com/ningchenglin/freemqtt
```
###### 进入freemqtt 路径
```bash
$ cd ./freemqtt
```
###### 安装依赖包
```bash
$ python -m pip install -r requirements.txt
```
###### 运行
```bash
$ python ./freemqttd.py
[I 240921 16:54:11 freemqttd:91] freemqttd started
```
###### 生成客户端密码(Token)
```bash
$ ./freemqtt_token myapp2
AppID: myapp2
Token: gVRVsBqw3bQSD4CQ4rFOXtfGQMelHJmEaNlYtH7GS/A=
```
###### 使用 [mqttx客户端工具](https://mqttx.app/zh) 进行测试
* 输入连接参数

)
* 连接FreeMQTT

)