| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- 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()
|