from qcloudsms_py import SmsSingleSender from qcloudsms_py.httpclient import HTTPError from qcloudsms_py import SmsMultiSender import os 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))) # 引入django配置文件 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yfwlw_pro.settings") # 你的django的settings文件 import django # os.environ.setdefault("DJANGO_SETTINGS_MODULE", # "yfwlw_pro.settings") # project_name 项目名称 django.setup() import json import time import requests import datetime from apps.ReportManage.all_dict import mobile_list, insect_dict_new, qxz_dict from apps.AppInfoManage.models import Equip, Equip_type, CBDphoto, Msg_Send, Msg_Conf, Equip_SimInfo, SCDstatus, CBDstatus, RecentCBDdata, MyUser,JKphoto, BZYdata, QXZstatus,QXZdata,\ QXZstatus_New, QXZ_Conf, QXZ_Default_Conf, MyUser, JKphoto, BZYphoto, QXZdata_New, Group, QXZ_Alarm, QXZ_Alarm_Log from apps.SimInfo.views import get_siminfo import paho.mqtt.client as mqtt # 短信应用 SDK AppID appid = 1400227496 # SDK AppID 以1400开头 # 短信应用 SDK AppKey appkey = "c9aba961bd30072f1e1b9272077abaea" from requests.auth import HTTPBasicAuth import xlrd, xlwt import random from django.db import transaction import re import math import os import urllib.parse import urllib.request 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 send_msg(phone,imei,eNum): # msgconf = eval(i.conf) # 需要发送短信的手机号码 # 短信模板ID,需要在短信控制台中申请 template_id = 587861 # NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请 # 签名 sms_sign = "云飞科技" # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请 ssender = SmsSingleSender(appid, appkey) params = [imei,eNum] # 当模板没有参数时,`params = []` try: result = ssender.send_with_param(86, phone, template_id, params, sign=sms_sign, extend="", ext="") # 签名参数未提供或者为空时,会使用默认签名发送短信 except HTTPError as e: print(e) result = e except Exception as e: print(e) result = e print(result) # Msg_Send.objects.create(mobile=msgconf["phone"],equip_id=i.equip_id,send_dec=params,result_desc=result) print("----发送成功",phone) return result # 从服务器接受到消息后回调此函数 : 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: alarm = eval(QXZ_Alarm.objects.get(equip_id=imei).conf) except: alarm = "" nowtime = datetime.datetime.now().strftime('%Y%m%d') if alarm != "": try: # 判断主题: if "pub" in msg.topic: # 将json字符串解析: payload = json.loads(msg.payload.decode()) if payload.get("cmd") == "terminalData": print("<-----transpond data!----->") data = payload.get("ext") # data = json.dumps(data, cls=CJSONEncoder) print("参数类型为:",type(data)) print("发送数据为:",data) print("列表数据为:",type(data["data"])) aa = data["data"] print("len",len(aa)) for i in aa: print(i['eKey']) print(i['eValue']) cc = i["eKey"] print("预警值=======>>",alarm["dat"][cc]) # 先判断是否设置的有预警值 if alarm["dat"][cc].split("#")[1] != "": # 如果值大于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表 try: logs = QXZ_Alarm_Log.objects.get(equip_id=imei,ekey=i["eKey"]) except: logs = "" if logs == "": # 此处判断大于小于设定的预警值 # 如果小于 if alarm["dat"][cc].split("#")[0] == "0": print("----小") if i['eValue'] < alarm["dat"][cc].split("#")[1]: a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1]) print(a) QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="小于预警") # # msgconf = eval(i.conf) # # 需要发送短信的手机号码 # phone_numbers = alarm["tel"] # # 短信模板ID,需要在短信控制台中申请 # template_id = 587861 # NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请 # # 签名 # sms_sign = "云飞科技" # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请 # ssender = SmsSingleSender(appid, appkey) # params = [imei,qxz_dict[i['eNum']][1]] # 当模板没有参数时,`params = []` # try: # result = ssender.send_with_param(86, phone_numbers, # template_id, params, sign=sms_sign, extend="", ext="") # 签名参数未提供或者为空时,会使用默认签名发送短信 # except HTTPError as e: # print(e) # except Exception as e: # print(e) # print(result) # # Msg_Send.objects.create(mobile=msgconf["phone"],equip_id=i.equip_id,send_dec=params,result_desc=result) # pest_name = [] # print("----发送成功",phone_numbers) # 判断值是否小于 # 如果值小于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表 # 如果大于 elif alarm["dat"][cc].split("#")[0] == "1": # 判断值是否大于 if i['eValue'] > alarm["dat"][cc].split("#")[1]: a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1]) print(a) QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="大于预警") print("====log为空!") elif logs != "": if (logs.upl_time).strftime('%Y%m%d') != nowtime: if alarm["dat"][cc].split("#")[0] == "0": a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1]) print(a) QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="小于预警") # 判断值是否小于 # 如果值小于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表 # 如果大于 elif alarm["dat"][cc].split("#")[0] == "1": a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1]) print(a) QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="大于预警") print("当天没有发送过短信") else: print("此通道未设置预警!!!") except Exception as e: print(e) if __name__ == '__main__': client = mqtt.Client( client_id="QXZ_MSG_ALARM", 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()