基于python實(shí)現(xiàn)mqtt連接類(lèi)

本篇文章介紹mqtt基于python語(yǔ)言在生產(chǎn)環(huán)境的使用

paho-mqtt的安裝

pip install paho-mqtt #可以指定版本paho-mqtt==1.5.0

import re
import json
from inspect import isfunction
import paho.mqtt.client as mqtt
from settings import Config


class EMQClient(object):
    '''
    EMQx Mqtt client class
    usage:
        client = EMQClient(config=config)
    '''
    # MQTT client
    client = None
    # MQTT message callback handlers
    message_handlers = {'common': []}
    # MQTT config dict
    config = None
    # callback handler
    handlers = {}

    def __init__(self, config, **kwargs):
        self.config = {kv[0].lower(): kv[1] for kv in config.items()}
        if 'handlers' in kwargs and isinstance(kwargs['handlers'], dict):
            self.handlers = kwargs['handlers']

        self.client = mqtt.Client(
            client_id=self.config['client_id'] if 'client_id' in self.config else None)
        self.client.on_connect = self.on_connect
        self.client.on_disconnect = self.on_disconnect
        self.client.on_message = self.on_message
        self.client.on_subscribe = self.on_subscribe

    def connect(self):
        '''connect to the mqtt server. '''
        self.client.username_pw_set(
            self.config['username'] if 'username' in self.config else None, self.config['password'])
        # 'admin', '123456')
        self.client.connect(
            self.config['host'], self.config['port'],
            keepalive=self.config['keepalive'] if 'keepalive' in self.config else 60)
        self.client.loop_start()

    def disconnect(self):
        self.client.loop_stop()

    def set_handler(self, handler, func):
        '''
        add callback hanlder
        :param type: handler type
        :param handler: handle message function
        '''
        if handler not in ['connect_handler', 'disconnect_handler', 'subscribe_handler']:
            return False

        self.handlers[handler] = func

    def add_message_handler(self, handler, topic='common'):
        '''
        add message hanlder
        :param handler: handle message function
        :param topic: handle the assigned topic message, `common` means will handle all messages
        '''
        if topic not in self.message_handlers:
            self.message_handlers[topic] = []

        self.message_handlers[topic].append(handler)

    def on_connect(self, client, userdata, flags, rc):
        '''
        callback func when client connected to the mqtt server.
        rc  0:連接成功
            1:連接被拒絕-協(xié)議版本不正確
            2:連接被拒絕-無(wú)效的客戶(hù)端標(biāo)識(shí)符
            3:連接被拒絕-服務(wù)器不可用
            4:連接被拒絕-用戶(hù)名或密碼錯(cuò)誤
            5:連接被拒絕-未經(jīng)授權(quán)
            6-255:當(dāng)前未使用渔扎。
        '''
        print(client, userdata, flags, rc)
        try:
            'connect_handler' in self.handlers and isfunction(self.handlers['connect_handler']) and self.handlers[
                'connect_handler'](self)
        except Exception as e:
            print(e)

    def on_disconnect(self, client, userdata, rc):
        'disconnect_handler' in self.handlers and isfunction(self.handlers['disconnect_handler']) and self.handlers[
            'disconnect_handler'](userdata=userdata, rc=rc)

    def on_subscribe(self, client, userdata, mid, granted_qos):
        'subscribe_handler' in self.handlers and isfunction(self.handlers['subscribe_handler']) and self.handlers[
            'subscribe_handler'](userdata=userdata, mid=mid, granted_qos=granted_qos)

    def on_message(self, client, userdata, message):
        '''
        handle the message when a PUBLISH message is received from the server
        handlers should not set blocked
        '''
        # print(message.payload)
        for topic in self.message_handlers.keys():
            if topic == 'common':
                continue

            regex = re.compile(
                '^{}$'.format(topic.replace('+', '[^\/\s]+').replace('#', '\S+').replace('/', '\/').replace('$', '\$')))
            if regex.match(message.topic):
                for handler in self.message_handlers.get(topic, []):
                    handler(message.payload)

        # call common topic handlers
        for handler in self.message_handlers['common']:
            handler(message)

    def subscribe(self, topic, **kwargs):
        '''
        subscribe topic message
        default set qos to 0
        '''
        print(topic)
        return self.client.subscribe(
            topic, **kwargs)

    def publish(self, topic, message, **kwargs):
        '''publish message through topic'''
        return self.client.publish(topic, json.dumps(message, ensure_ascii=False), **kwargs)

    def unsubscribe(self, topic, properties=None):
        '''unsubscribe topic'''
        return self.client.unsubscribe(topic, properties=properties)

emq_client = EMQClient(config=Config.MQTT_CONFIG)
emq_client.set_handler('connect_handler', connect_handler)
emq_client.connect()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛹锰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绰疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)纷宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蛾方,你說(shuō)我怎么就攤上這事像捶∩仙拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵拓春,是天一觀的道長(zhǎng)释簿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硼莽,這世上最難降的妖魔是什么庶溶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮懂鸵,結(jié)果婚禮上偏螺,老公的妹妹穿的比我還像新娘。我一直安慰自己矾瑰,他們只是感情好砖茸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著殴穴,像睡著了一般凉夯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上采幌,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天劲够,我揣著相機(jī)與錄音,去河邊找鬼休傍。 笑死征绎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磨取。 我是一名探鬼主播人柿,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忙厌!你這毒婦竟也來(lái)了凫岖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逢净,失蹤者是張志新(化名)和其女友劉穎哥放,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體爹土,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甥雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胀茵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片社露。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琼娘,靈堂內(nèi)的尸體忽然破棺而出峭弟,到底是詐尸還是另有隱情赁濒,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布孟害,位于F島的核電站,受9級(jí)特大地震影響挪拟,放射性物質(zhì)發(fā)生泄漏挨务。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一玉组、第九天 我趴在偏房一處隱蔽的房頂上張望谎柄。 院中可真熱鬧,春花似錦惯雳、人聲如沸朝巫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劈猿。三九已至,卻和暖如春潮孽,著一層夾襖步出監(jiān)牢的瞬間揪荣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工往史, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仗颈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓椎例,卻偏偏與公主長(zhǎng)得像挨决,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子订歪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容