python mqtt服务器框架_使用 Python 开发 EMQ X MQTT 服务器插件

从 v4.1 版本开始,EMQ X MQTT 服务器 提供了专门的多语言支持插件 emqx_extension_hook ,现已支持使用其他编程语言来处理 EMQ X 中的钩子事件,开发者可以使用 Python 或者 Java 快速开发自己的插件,在官方功能的基础上进行扩展,满足自己的业务场景。例如:验证某客户端的登录权限:客户端连接时触发对应函数,通过参数获取客户端信息后通过读取数据库、比对等操作判定是否有登录权限

记录客户端在线状态与上下线历史:客户端状态变动时触发对应函数,通过参数获取客户端信息,改写数据库中客户端在线状态

校验某客户端的 PUB/SUB 的操作权限:发布/订阅时触发对应函数,通过参数获取客户端信息与当前主题,判定客户端是否有对应的操作权限

处理会话 (Sessions) 和 消息 (Message) 事件,实现订阅关系与消息处理/存储:消息发布、状态变动时触发对应函数,获取当前客户端信息、消息状态与消息内容,转发到 Kafka 或数据库进行存储。注:消息(Message) 类钩子,仅在企业版中支持。

Python 和 Java 驱动基于 Erlang/OTP-Port 进程间通信实现,本身具有非常高的吞吐性能,本文以 Python 拓展为例介绍 EMQ X 跨语言拓展使用方式。

Python 拓展使用示例

要求EMQ X 所在服务器需安装 Python 3.6 以上版本

使用步骤调整 EMQ X 配置,确保相关配置项正确指向 Python 项目

引入 SDK 编写代码

Python 插件安装

通过 pip 命令在本地安装 SDK,确保使用 pip3 进行安装:

pip3 install emqx-extension-sdk

修改配置

修改 emqx-extension-hook 插件配置,正确使用拓展:

## Setup the supported drivers

##

## Value: python2 | python3 | java

exhook.drivers = python3

## Search path for scripts/library

exhook.drivers.python3.path = data/extension/hooks.py

## Call timeout

##

## Value: Duration

##exhook.drivers.python3.call_timeout = 5s

## Initial module name

## Your filename or module name

exhook.drivers.python3.init_module = hooks

编写代码

在 emqx/data/extension 目录下新建 hooks.py 文件,引入 SDK 编写业务逻辑,示例程序如下:

## data/extension/hooks.py

from emqx_extension.hooks import EmqxHookSdk, hooks_handler

from emqx_extension.types import EMQX_CLIENTINFO_PARSE_T, EMQX_MESSAGE_PARSE_T

# 继承 SDK HookSdk 类

class CustomHook(EmqxHookSdk):

# 使用装饰器注册 hooks

@hooks_handler()

def on_client_connect(self,

conninfo: EMQX_CLIENTINFO_PARSE_T = None,

props: dict = None,

state: list = None):

print(f'[Python SDK] [on_client_connect] {conninfo.clientid} connecte')

@hooks_handler()

def on_client_connected(self,

clientinfo: EMQX_CLIENTINFO_PARSE_T,

state: list = None):

print(

f'[Python SDK] [on_client_connected] {clientinfo.clientid} connected')

@hooks_handler()

def on_client_check_acl(self, clientinfo: EMQX_CLIENTINFO_PARSE_T,

pubsub: str,

topic: str,

result: bool,

state: tuple) -> bool:

print(

f'[Python SDK] [on_client_check_acl] {clientinfo.username} check ACL: {pubsub} {topic}')

# 用户名为空时,ACL 验证不通过

if clientinfo.username == '':

return False

return True

@hooks_handler()

def on_client_authenticate(self, clientinfo: EMQX_CLIENTINFO_PARSE_T, authresult,

state) -> bool:

print(

f'[Python SDK] [on_client_authenticate] {clientinfo.clientid} authenticate')

# clientid 不为空时,验证通过

if clientinfo.clientid != '':

return True

return False

# on_message_* 仅支持企业版

@hooks_handler()

def on_message_publish(self, message: EMQX_MESSAGE_PARSE_T, state):

print(

f'[Python SDK] [on_message_publish] {message.topic} {message.payload}')

emqx_hook = CustomHook(hook_module=f'{__name__}.emqx_hook')

def init():

return emqx_hook.start()

def deinit():

return

启动

启动 emqx_extension_hook 插件,如果配置错误或代码编写错误将无法正常启动。启动后尝试建立 MQTT 连接并观察业务运行情况。

./bin/emqx_ctl plugins load emqx_extension_hook

进阶开发

目前 EMQ X Python 拓展 SDK 是开源的,如果对可控性、性能要求更高,或需要使用 Python 2.7 版本的运行环境,欢迎贡献代码或基于原始示例进行开发:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python使用MQTT可以通过以下步骤进行: 1. 导入paho-mqtt库:首先需要使用pip安装paho-mqtt库。可以通过运行以下命令来安装:`pip install paho-mqtt` 2. 创建MQTT客户端:使用paho-mqtt库创建一个MQTT客户端对象,可以指定客户端ID和其他参数。 3. 连接到MQTT Broker:使用客户端对象连接到MQTT Broker,需要提供Broker的地址和端口号。 4. 订阅主题:使用客户端对象订阅感兴趣的主题,可以使用通配符来订阅多个主题。 5. 发布消息:使用客户端对象发布消息到指定的主题。 6. 处理消息:使用回调函数处理接收到的消息,可以在回调函数中定义消息到达后的逻辑处理。 下面是一个使用Python实现MQTT连接和发布订阅的示例代码: ```python import paho.mqtt.client as mqtt # MQTT Broker的地址和端口号 broker = 'broker.emqx.io' port = 1883 # 客户端ID client_id = f'python-mqtt-{random.randint(0, 1000)}' # 连接到MQTT Broker的回调函数 def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker") else: print("Failed to connect, return code %d\n", rc) # 发布消息的回调函数 def on_publish(client, userdata, mid): print("Message published") # 创建MQTT客户端 client = mqtt.Client(client_id) # 设置回调函数 client.on_connect = on_connect client.on_publish = on_publish # 连接到MQTT Broker client.connect(broker, port) # 订阅主题 client.subscribe("/python/mqtt") # 发布消息 client.publish("/python/mqtt", "Hello MQTT") # 循环监听消息 client.loop_forever() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值