python编写一个MQTT

发布端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlite3 import connect
import paho.mqtt.client as mqtt
import time
import datetime
import hashlib
import sys, logging
import threading
import json
import os


class vbox_cloud:
    server_ip = ""
    server_port = 0
    message_handle = ""
    id = ""
    client = ""
    product = ""
    secureKey = "shuncomgw"
    connected = False
    print('*'*50)

    # ("SZ11-CBOX-4","2c6a6f30001f","192.168.30.53",

    def __init__(self,product,id,ip,port,message_handle):
        self.server_ip = ip
        self.id=id
        self.server_port = port
        self.message_handle = message_handle
        self.product = product

    def on_connect(self,client, userdata, flags, rc):
        self.connected = True

    def report_properties(self,properties):
        report_topic="/"+self.product+"/"+self.id+"/properties/report"
        mqtt_msg = {}
        #mqtt_msg["timestamp"]=int(round((time.time()) * 1000))
        #mqtt_msg["messageId"]=messageid
        #messageid = messageid + 1
        mqtt_msg["deviceId"]=self.id
        mqtt_msg["properties"]=properties
        #mqtt_msg["properties"]["switch"] = True
        report_payload=json.dumps(mqtt_msg)

        try:
            self.client.publish(topic=report_topic, payload=report_payload, qos=1)


        except Exception as e:
            print("fail")

    def write_properties_rsp(self,mqtt_msg,result):
        report_topic="/"+self.product+"/"+self.id+"/properties/write/reply"
        del mqtt_msg["properties"]
        mqtt_msg["success"]=result
        report_payload=json.dumps(mqtt_msg)
        self.client.publish(topic=report_topic, payload=report_payload, qos=1)

    def invoke_rsp(self,mqtt_msg,result):
        report_topic="/"+self.product+"/"+self.id+"/function/invoke/reply"
        mqtt_msg["success"]=result
        mqtt_msg["inputs"]= None
        mqtt_msg["output"]="success"
        report_payload=json.dumps(mqtt_msg)
        self.client.publish(topic=report_topic, payload=report_payload, qos=1)


    def report_log(self,log):
        report_topic="/"+self.product+"/"+self.id+"/log"
        mqtt_msg = {}
        mqtt_msg["log"]=log
        mqtt_msg["timestamp"]=int(round((time.time()) * 1000))
        report_payload=json.dumps(mqtt_msg)
        self.client.publish(topic=report_topic, payload=report_payload, qos=1)


    def connect(self):
        print(" client id " + self.id)
        self.client = mqtt.Client(self.id,clean_session=False)
        self.client.on_connect = self.on_connect
        self.client.on_message = self.message_handle
        username,password=self.build_username_passwd()
        print(" username " + username + " password "+password)
        self.client.username_pw_set(username, password)

        conected = False
        while conected == False:
            try:
                self.client.connect(self.server_ip, self.server_port, 60) # 600为keepalive的时间间隔
            except OSError:
                conected = False
            else:
                conected = True
        self.client.loop_start() # 保持连接

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

    def get_str_md5(self,content):
        m = hashlib.md5(content.encode("utf8")) #创建md5对象
        return m.hexdigest()

    def build_username_passwd(self):
        timestamp = int(round((time.time()) * 1000))
        username = self.product+"|"+str(timestamp)
        print("usrname",username)
        passwd = self.product+"|"+str(timestamp)+"|"+self.secureKey
        print("passwd",passwd)
        passwd=self.get_str_md5(passwd)
        print("sec passwd",passwd)
        return username,passwd


if __name__ == '__main__':
    def message_handle(client, userdata, msg):
        print('message_handle参数:',msg.topic + " " + str(msg.payload))
    #     /SZ11-GW-6/2c6a6f00ee6d
    vbox_handle = vbox_cloud("SZ11-GW-6","2c6a6f00ee6d","broker.emqx.io",1883,message_handle)
    vbox_handle.connect()
    while True:
        vbox_handle.report_properties('{"time":123124}')
        time.sleep(3)

订阅段
# -*- coding: utf-8 -*-# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import sz_log

def on_connect(client, userdata, flags, rc):
    sz_log.info("client:",client,"userdata:",userdata)
    sz_log.info("Connected with result code: " + str(rc))



def on_message(client, userdata, msg):
    sz_log.info("client:",client,"userdata:",userdata,"msg:",msg)
    sz_log.info(msg.topic + " " + str(msg.payload))


#   订阅回调
def on_subscribe(client, userdata, mid, granted_qos):
    sz_log.info("client:",client,"userdata:",userdata)
    sz_log.info("On Subscribed: qos = %d" % granted_qos)
    pass


#   取消订阅回调
def on_unsubscribe(client, userdata, mid):
    sz_log.info("On unSubscribed: qos = %d" % mid)
    pass


#   发布消息回调
def on_publish(client, userdata, mid):
    sz_log.info("On onPublish: qos = %d" % mid)
    pass

#   断开链接回调
def on_disconnect( client, userdata, rc):
    sz_log.info("Unexpected disconnection rc = " + str(rc))
    pass


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.on_unsubscribe = on_unsubscribe
client.on_subscribe = on_subscribe
client.connect('broker.emqx.io', 1883, 600) # 600为keepalive的时间间隔
client.subscribe('mqtt11', qos=0)
client.subscribe('/SZ11-GW-6/2c6a6f00ee6d/#', qos=0)
client.loop_forever() # 保持连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值