# -*- coding: utf-8 -*- # File Name:mqtt_chat_client.py # Python Version:3.5.1 import os import django import sys BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 定位到你的django根目录 sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yfwlw_pro.settings") # project_name 项目名称 django.setup() print("<-----python_mqtt_client_qxz is run----->") import paho.mqtt.client as mqtt import json from apps.AppInfoManage.models import Equip, Equip_type, MyUser, Alarm_record, QXZdata, QXZstatus, QXZswitchstatus, QXZswitchdata, QXZAutoswitch, QXZTimingswitch import re import datetime class CJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, date): return obj.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, obj) # 连接后的操作: 0为成功 def on_connect(client, userdata, flags, rc): # print("Connected with result code "+str(rc)) client.subscribe("/yfkj/qxz/pub/#") # *****成功发布****** def on_publish(msg, rc): if rc == 0: print("publish success,msg = "+msg) # 从服务器接受到消息后回调此函数 : def on_message(client, userdata, msg): print('\r') print('=================================================') print('\r') print("<-----topic:\n" + msg.topic + ';\n') print("Message:\n" + str(msg.payload) + "----->\n") # 从主题中获取imei # imei = msg.topic[14:len(msg.topic)] imei = re.sub("\D", "", msg.topic) print("<-----imei:", imei, "----->") try: # 判断主题: if "pub" in msg.topic: # 将json字符串解析: payload = json.loads(msg.payload.decode()) qxz_exist = Equip.objects.filter(equip_id=imei) if payload.get("cmd") == "terminalData": print("<-----uploading data!----->") extdata = payload.get("ext") # print("extdata:", extdata) # 设备存在,进一步判断状态表是否存在: if qxz_exist.exists(): print("<-----this equip is existed!----->") try: e_id = Equip.objects.get(equip_id=imei) except: print("<-----this equip didn't exist!----->") try: # 设备数据表直接储存数据 QXZdata.objects.create(equip_id=e_id, qxz_data=extdata) print("<-----data update success!----->") except: print("<-----data update failed!----->") # 设备状态表存在、刷新状态表: if QXZstatus.objects.filter(equip_id=imei).exists(): print("<-----this equip's status is existed!----->") try: sta = QXZstatus.objects.get(equip_id=imei) sta.qxz_status=extdata sta.save() print("<-----status update success!----->") except: print("<-----status update failed!----->") else: # 设备状态表不存在、创建状态表: print("<-----this equip's status is not existed!----->") try: QXZstatus.objects.create(equip_id=e_id, qxz_status=extdata) print("<-----this equip's status table re-create successed!----->") except: print("<-----this equip's status table re-create failed!----->") else: pass # # 设备不存在,在设备列表中创建: # equip_t = Equip_type.objects.get(type_id=5) # try: # e_id = Equip.objects.create(equip_id=imei, equip_type=equip_t) # print("<-----this imei add successed!----->") # try: # # 设备数据表直接储存数据 # QXZdata.objects.create(equip_id=e_id, qxz_data=extdata) # print("<-----data update success!----->") # except: # print("<-----data update failed!----->") # try: # QXZstatus.objects.create(equip_id=e_id, qxz_status=extdata) # print("<-----this imei register successed!----->") # except: # print("<-----this imei register failed!----->") # except: # print("<-----this imei add failed!----->") elif payload.get("cmd") == "control": # extdata = eval(payload.get("ext"))["runStatus"] extdata = payload.get("ext")['runStatus'] print("extdata:", extdata) # 设备存在,进一步判断开关表是否存在: if qxz_exist.exists(): print("<-----this equip is existed!----->") try: e_id = Equip.objects.get(equip_id=imei) except: print("<-----this equip didn't exist!----->") if QXZswitchstatus.objects.filter(equip_id=imei).exists(): print("<-----this switch status is existed!----->") try: sta = QXZswitchstatus.objects.get(equip_id=imei) sta.qxz_switch=extdata sta.save() print("<-----switchstatus update success!----->") except: print("<-----switchstatus update failed!----->") else: # 设备开关表不存在、创建开关表: print("<-----this switch switchstatus is not existed!----->") try: QXZswitchstatus.objects.create(equip_id=e_id, qxz_switch=extdata) print("<-----this switchstatus table re-create successed!----->") except: print("<-----this switchstatus table re-create failed!----->") # 气象站开关自定义名字表 if QXZswitchdata.objects.filter(equip_id=imei).exists(): if QXZswitchdata.objects.get(equip_id=e_id).qxz_switch_data == "[]": # 设备开关配置表存在、更新开关配置表: print("<-----this switch switchdata existed!----->") extdata = payload.get("ext")['runStatus'] data = [] for i in extdata: print(i["JK"]) data.append({"JK":i["JK"],"name":""}) print(data) try: QXZswitchdata.objects.filter(equip_id=e_id).update(qxz_switch_data=data) print("<-----this switchdata table update successed!----->") except Exception as e: print(e) print("<-----this switchdata table update failed!----->") else: # 设备开关配置表不存在、创建开关配置表: print("<-----this switch switchdata is not existed!----->") extdata = payload.get("ext")['runStatus'] data = [] for i in extdata: print(i["JK"]) data.append({"JK":i["JK"],"name":""}) print(data) try: QXZswitchdata.objects.create(equip_id=e_id, qxz_switch_data=data) print("<-----this switchdata table re-create successed!----->") except Exception as e: print(e) print("<-----this switchdata table re-create failed!----->") # if QXZswitchdata.objects.get(equip_id=imei).qxz_switch_data != "[]": # print("<-----this switchdata is existed!----->") # else: # # 设备开关配置表不存在、创建开关配置表: # print("<-----this switch switchdata is not existed!----->") # extdata = payload.get("ext")['runStatus'] # data = [] # for i in extdata: # print(i["JK"]) # data.append({"JK":i["JK"],"name":""}) # print(data) # try: # QXZswitchdata.objects.create(equip_id=e_id, qxz_switch_data=data) # print("<-----this switchdata table re-create successed!----->") # except Exception as e: # print(e) # print("<-----this switchdata table re-create failed!----->") elif payload.get("cmd") == "auto": # extdata = eval(payload.get("ext"))["runStatus"] extdata = payload.get("ext")['runStatus'] print("extdata:", extdata) # 设备存在,进一步判断阈值表是否存在: if qxz_exist.exists(): print("<-----this equip is existed!----->") try: e_id = Equip.objects.get(equip_id=imei) except: print("<-----this equip didn't exist!----->") if QXZAutoswitch.objects.filter(equip_id=imei).exists(): print("<-----this autoswitch is existed!----->") try: sta = QXZAutoswitch.objects.get(equip_id=imei) sta.qxz_auto=extdata sta.save() print("<-----switchstatus update success!----->") except: print("<-----switchstatus update failed!----->") else: # 设备阈值表不存在、创建阈值表: print("<-----this switch autoswitch is not existed!----->") try: QXZAutoswitch.objects.create(equip_id=e_id, qxz_auto=extdata) print("<-----this autoswitch table re-create successed!----->") except: print("<-----this autoswitch table re-create failed!----->") elif payload.get("cmd") == "timing": extdata = payload.get("ext")['setTime'] print("extdata:", extdata) # 设备存在,进一步判断定时表是否存在: if qxz_exist.exists(): print("<-----this equip is existed!----->") try: e_id = Equip.objects.get(equip_id=imei) except: print("<-----this equip didn't exist!----->") if QXZTimingswitch.objects.filter(equip_id=imei).exists(): print("<-----this timingstatus is existed!----->") try: sta = QXZTimingswitch.objects.get(equip_id=imei) sta.qxz_timing=extdata sta.save() print("<-----timingstatus update success!----->") except: print("<-----timingstatus update failed!----->") else: # 设备阈值表不存在、创建阈值表: print("<-----this switch timingstatus is not existed!----->") try: QXZTimingswitch.objects.create(equip_id=e_id, qxz_timing=extdata) print("<-----this timingstatus table re-create successed!----->") except: print("<-----this timingstatus table re-create failed!----->") except: pass if __name__ == '__main__': client = mqtt.Client( client_id="PY_MQTT_CLIENTC_QXZ", clean_session=True, userdata=None, # protocol=MQTTv311,# 数据库版本 ) # 必须设置,否则会返回「Connected with result code 4」 client.username_pw_set("admin", "password") client.on_connect = on_connect client.on_message = on_message HOST = "127.0.0.1" client.connect(HOST, 1883, 60) client.loop_forever()