python使用mqtt

(1) 安装paho-mqtt包

(2) 导入mqttimport paho.mqtt.client as mqttimport threading

import json
import paho.mqtt.publish as publish


class Thread(threading.Thread):         # 开启一个线程 
    def __init__(self, dat):
        threading.Thread.__init__(self)
        self.Dat = dat

    def run(self):
        c = self.Dat
        c.client = mqtt.Client(c.client_id)
        c.client.on_connect = c.on_connect  # 设置连接上服务器回调函数
        c.client.on_message = c.on_message  # 设置接收到服务器消息回调函数
        c.client.on_subscribe = c.on_subscribe
        c.client.on_publish = c.on_publish
        c.client.on_unsubscribe = c.on_unsubscribe
        c.client.on_disconnect = c.on_disconnect
        nRet = False
        try:
            c.client.connect(c.host, c.port, c.keepalive)  # 连接服务器,端口为1883,维持心跳为60秒
            nRet = True
        except Exception as e:
            print('MQTT errorA', e)  # 打错误
        c.client.loop_forever(retry_first_connection=True)


class ClientProtcal(object):
    def __init__(self):
        pass

    def Byte(self, op):
        data = json.dumps(op).encode('utf-8')
        return data

    def Parse(self, buf):
        op = None
        try:
            op = json.loads(buf.decode('utf-8'))
        except Exception as e:
            print('error', e)
        return op


class MqttClient(object):
    protcal = ClientProtcal()
    logName = ''

    def __init__(self, obj, host, port=1883, keepalive=60, bind_address="", log=None):
        if log:
            self.l = log
        self.name = 'Mqtt'  # 类名
        self.obj = obj      # 对象
        self.q = obj.q
        self.topical = obj.topical      # 主题
        self.client_id = obj.client_id
        self.host = host
        self.port = port
        self.keepalive = keepalive
        self.bind_address = bind_address
        self.client = None
        self.thread = Thread(self)
        self.thread.start()

    def log(self, msg):
        if self.l:
            self.l.logInfo(msg)

    def setName(self, name):
        self.name = name

    def on_connect(self, client, userdata, flags, rc):  # 连接成功
        if self.client:
            for t in self.topical:
                
                # topical = '%s%s' % ('', t)
                self.client.subscribe(t)  # 订阅主题
                self.log('订阅主题:[%s]' % t)

    def subscribes(self, topicals):
        for topical in topicals:
            self.subscribe(topical)

    def subscribe(self, topical):
        if self.client:
            self.client.subscribe(topical)
            self.log('订阅主题:[%s]' % topical)

    def unSubscribe(self, topical):
        if self.client:
            self.client.unsubscribe(topical)
            self.log('取消订阅:[%s]' % topical)

    def on_message(self, client, userdata, msg):  # 接收到消息
        op = self.protcal.Parse(msg.payload)
        s = '收到[%s]推送:[%s]' % (msg.topic, str(op))
     print(s)
self.q.put(op) def on_socket_close(self, client, userdata, socket): self.obj.strNetStaut = 'OffLine' self.obj.netState = 0 pass def close(self): if self.client: self.client.disconnect() def Send(self, topical, op): # 发送消息 if self.client: payload = MqttClient.protcal.Byte(op) res = self.client.publish(topical, payload) @classmethod def single(cls, stopic, payload, host, port): d = MqttClient.protcal.Byte(payload) try: publish.single(stopic, payload=d, hostname=host, client_id="lora1", port=port, protocol=mqtt.MQTTv311) MqttClient.log(MqttClient.logName, '推送主题:[%s][%s]' % (stopic, str(payload))) except Exception as e: print("publish.single err:", e)

 

(3)在需要的用到的地方导入类

mq=MqttClient(obj=self.obj,host=mqttIp,port=mqttPort,keepalive=60)

(4) 发送消息:

mq.send("topicl","message")

(5) 接受消息

class CHMTestThread(threading.Thread):  # 线程获取消息,做相应处理
    def __init__(self, dat):
        threading.Thread.__init__(self)
        self.Dat = dat
        self.RunFlag = True

    def run(self):
        obj= self.Dat 
        q = obj.q  
        while self.RunFlag:
            op = q.get()
            if op:
                obj.handle(op)

(6) 在主对象中提供一个处理函数。

class obj(object):
    def __init__():
       print("init")
    def handle(message):
       print(message)

 

posted @ 2020-12-02 22:07  countryboy666  阅读(2682)  评论(0编辑  收藏  举报