发布端
#!/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() # 保持连接