怎么用Python開發(fā)EMQXMQTT服務(wù)器插件

這篇文章主要講解了“怎么用Python開發(fā)EMQ X MQTT服務(wù)器插件”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么用Python開發(fā)EMQ X MQTT服務(wù)器插件”吧!

創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計(jì),龍港網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:龍港等地區(qū)。龍港做網(wǎng)站價(jià)格咨詢:18980820575

從 v4.1 版本開始,EMQ X MQTT 服務(wù)器 提供了專門的多語言支持插件 emqx_extension_hook ,現(xiàn)已支持使用其他編程語言來處理 EMQ X 中的鉤子事件,開發(fā)者可以使用 Python 或者 Java 快速開發(fā)自己的插件,在官方功能的基礎(chǔ)上進(jìn)行擴(kuò)展,滿足自己的業(yè)務(wù)場(chǎng)景。例如:

  • 驗(yàn)證某客戶端的登錄權(quán)限:客戶端連接時(shí)觸發(fā)對(duì)應(yīng)函數(shù),通過參數(shù)獲取客戶端信息后通過讀取數(shù)據(jù)庫、比對(duì)等操作判定是否有登錄權(quán)限

  • 記錄客戶端在線狀態(tài)與上下線歷史:客戶端狀態(tài)變動(dòng)時(shí)觸發(fā)對(duì)應(yīng)函數(shù),通過參數(shù)獲取客戶端信息,改寫數(shù)據(jù)庫中客戶端在線狀態(tài)

  • 校驗(yàn)?zāi)晨蛻舳说?PUB/SUB 的操作權(quán)限:發(fā)布/訂閱時(shí)觸發(fā)對(duì)應(yīng)函數(shù),通過參數(shù)獲取客戶端信息與當(dāng)前主題,判定客戶端是否有對(duì)應(yīng)的操作權(quán)限

  • 處理會(huì)話 (Sessions) 和 消息 (Message) 事件,實(shí)現(xiàn)訂閱關(guān)系與消息處理/存儲(chǔ):消息發(fā)布、狀態(tài)變動(dòng)時(shí)觸發(fā)對(duì)應(yīng)函數(shù),獲取當(dāng)前客戶端信息、消息狀態(tài)與消息內(nèi)容,轉(zhuǎn)發(fā)到 Kafka 或數(shù)據(jù)庫進(jìn)行存儲(chǔ)。

注:消息(Message) 類鉤子,僅在企業(yè)版中支持。

Python 和 Java 驅(qū)動(dòng)基于 Erlang/OTP-Port 進(jìn)程間通信實(shí)現(xiàn),本身具有非常高的吞吐性能,本文以 Python 拓展為例介紹 EMQ X 跨語言拓展使用方式。

怎么用Python開發(fā)EMQ X MQTT服務(wù)器插件

Python 拓展使用示例

要求

  • EMQ X 所在服務(wù)器需安裝 Python 3.6 以上版本

使用步驟

  1. 通過 pip 安裝 Python SDK

  2. 調(diào)整 EMQ X 配置,確保相關(guān)配置項(xiàng)正確指向 Python 項(xiàng)目

  3. 引入 SDK 編寫代碼

Python 插件安裝

通過 pip 命令在本地安裝 SDK,確保使用 pip3 進(jìn)行安裝

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 編寫業(yè)務(wù)邏輯,示例程序如下:

## 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):

  	# 使用裝飾器注冊(cè) 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}')
        # 用戶名為空時(shí),ACL 驗(yàn)證不通過
        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 不為空時(shí),驗(yàn)證通過
        if clientinfo.clientid != '':
            return True
        return False

    # on_message_* 僅支持企業(yè)版
    @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

啟動(dòng)

啟動(dòng) emqx_extension_hook 插件,如果配置錯(cuò)誤或代碼編寫錯(cuò)誤將無法正常啟動(dòng)。啟動(dòng)后嘗試建立 MQTT 連接并觀察業(yè)務(wù)運(yùn)行情況。

./bin/emqx_ctl plugins load emqx_extension_hook

感謝各位的閱讀,以上就是“怎么用Python開發(fā)EMQ X MQTT服務(wù)器插件”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么用Python開發(fā)EMQ X MQTT服務(wù)器插件這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:怎么用Python開發(fā)EMQXMQTT服務(wù)器插件
分享鏈接:http://muchs.cn/article6/pidjig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、面包屑導(dǎo)航App開發(fā)、微信小程序、網(wǎng)站制作、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營