从 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 以上版本

使用步骤

  1. 通过 pip 安装 Python SDK
  2. 调整 EMQ X 配置,确保相关配置项正确指向 Python 项目
  3. 引入 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.pyfrom 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 Falsereturn 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 Truereturn 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 版本的运行环境,欢迎贡献代码或基于原始示例进行开发:

  • 代码仓库:emqx-extension-python-sdk
  • Python 原始示例,可使用该示例自行封装:emqx-extension-hook main.py

版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.io/cn/blog/develop-emqx-plugin-using-python

python 服务器_使用 Python 开发 EMQ X MQTT 服务器插件相关推荐

  1. 网页测试本地服务器_音视频开发搭建一个直播服务器

    现在抖音.快手等直播实在是太火了,因此对音视频的开发非常感兴趣.查阅了相关资料,使用Nginx搭建一个简单的直播跟点播流媒体服务器,能够实时推流到服务器,同时在网页端播放直播的视频. 先上效果 使用O ...

  2. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

  3. Mqtt开发笔记:Mqtt服务器搭建

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  4. 从零开始建立 EMQ X MQTT 服务器 的 K8S 集群

    EMQ X Team 提供了 Helm chart 方便用户在 kubernetes 集群上一键部署 EMQ X MQTT 服务器, 这是 EMQ X Team 最推荐的在 kubernetes 或 ...

  5. arcgis中python批处理_基于Python的ArcGIS空间数据格式批处理转换工具开发

    基于 Python 的 ArcGIS 空间数据格式批处理转换工具开 发 焦 洋,邓 鑫,李胜才 [摘 要] 摘 要 ArcGIS 仅提供了单个文件的空间数据格式转换工具.本文首先 研究基于 Pytho ...

  6. python搭建web服务器_用Python建立最简单的web服务器

    利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令:python -m Web服务器模块 [端口号,默认8000]例如:python -m Sim ...

  7. python socket服务器_记-python socket服务器端四部曲

    1.创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个TCPsocket对象\ 2.设置socket选项 s. ...

  8. python 标准差_标准差python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 方差是每个值与均值的差值的平方的平均值,标准差是方差的平方根(这是有用的,因为取 ...

  9. 网络安全用python吗_使用Python进行网络安全渗透——密码攻击测试器

    相关文章: 本篇将会涉及: HTTP 基本认证 对HTTP Basic认证进行密码暴力攻击测试 什么是HTTP 基本认证 HTTP基本认证(HTTP Basic Authentication)是HTT ...

  10. 福州python招聘_【Python程序员招聘|Python程序员最新招聘信息】-看准网

    立即投递 职位薪资:6000-10000 经验:不限 学历:不限 类型:全职 linux下python编程 对接ai平台做应用 立即投递 职位薪资:8000-13000 经验:不限 学历:本科 类型: ...

最新文章

  1. IPsec ××× 配置實例
  2. mysql profiling表_Mysql-性能分析(profiling 工具)
  3. 【技术趋势】2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
  4. Swift Package Manager 库制作
  5. python利器的使用-PPython:PHP 拥抱 Python 的利器
  6. WPF快速指导1:资源
  7. unity android ndk的作用,Unity中编写Android下使用的so插件
  8. 给定一个函数做其最佳平方逼近c语言,求函数f(x)在指定区间上对于Φ=span{1,x}最佳平方逼近多项式: (1),[1,3]; (2...
  9. StringBuilder内存碎片对性能的影响
  10. 在线ajax测试,在线测试 - SosoApi,简单强大的api接口文档管理平台
  11. Linux之镜像源篇
  12. 支持xp的最高配置? 20210518
  13. Windows 10 下载官方正版ISO镜像文件
  14. KL距离(衡量两个概率分布的差异情况)
  15. openwrt 添加usb网卡_如何在双网卡的蜗牛星际上打一个openwrt软路由和NAS一体机
  16. 计算机专业综述参考文献,2019年计算机专业文献综述格式及要求.doc
  17. android程序图标透明,怎么把android手机软件图标变透明
  18. 利用Python(pyserial、minimalmodbus、modbus_tk)进行单片机通信
  19. springboot整合liquibase(补充)
  20. tomcat启动许多gc_tomcat gc问题总结

热门文章

  1. 管理 ciner-volumes
  2. 0=iiLen 在C++中
  3. Evernote CEO给想做长久公司创业者的3个建议
  4. 「leetcode」491.递增子序列【回溯算法】详细图解!
  5. 网络数据抓包分析工具Debookee 8 for Mac
  6. (转 留存)Windows环境下的NodeJS+NPM+GIT+Bower安装配置步骤
  7. 《OpenGL ES 3.x游戏开发(下卷)》一2.8 小结
  8. laravel路由基本知识
  9. C++中“强制转换”的四大天王
  10. 客户端登陆服务器用户名验证