qxz_msg_alarm.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. from qcloudsms_py import SmsSingleSender
  2. from qcloudsms_py.httpclient import HTTPError
  3. from qcloudsms_py import SmsMultiSender
  4. import os
  5. import sys
  6. BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 定位到你的django根目录
  7. sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))
  8. # 引入django配置文件
  9. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yfwlw_pro.settings") # 你的django的settings文件
  10. import django
  11. # os.environ.setdefault("DJANGO_SETTINGS_MODULE",
  12. # "yfwlw_pro.settings") # project_name 项目名称
  13. django.setup()
  14. import json
  15. import time
  16. import requests
  17. import datetime
  18. from apps.ReportManage.all_dict import mobile_list, insect_dict_new, qxz_dict
  19. from apps.AppInfoManage.models import Equip, Equip_type, CBDphoto, Msg_Send, Msg_Conf, Equip_SimInfo, SCDstatus, CBDstatus, RecentCBDdata, MyUser,JKphoto, BZYdata, QXZstatus,QXZdata,\
  20. QXZstatus_New, QXZ_Conf, QXZ_Default_Conf, MyUser, JKphoto, BZYphoto, QXZdata_New, Group, QXZ_Alarm, QXZ_Alarm_Log
  21. from apps.SimInfo.views import get_siminfo
  22. import paho.mqtt.client as mqtt
  23. # 短信应用 SDK AppID
  24. appid = 1400227496 # SDK AppID 以1400开头
  25. # 短信应用 SDK AppKey
  26. appkey = "c9aba961bd30072f1e1b9272077abaea"
  27. from requests.auth import HTTPBasicAuth
  28. import xlrd, xlwt
  29. import random
  30. from django.db import transaction
  31. import re
  32. import math
  33. import os
  34. import urllib.parse
  35. import urllib.request
  36. class CJSONEncoder(json.JSONEncoder):
  37. def default(self, obj):
  38. if isinstance(obj, datetime):
  39. return obj.strftime('%Y-%m-%d %H:%M:%S')
  40. elif isinstance(obj, date):
  41. return obj.strftime('%Y-%m-%d')
  42. else:
  43. return json.JSONEncoder.default(self, obj)
  44. # 连接后的操作: 0为成功
  45. def on_connect(client, userdata, flags, rc):
  46. # print("Connected with result code "+str(rc))
  47. client.subscribe("/yfkj/qxz/pub/#")
  48. # *****成功发布******
  49. def on_publish(msg, rc):
  50. if rc == 0:
  51. print("publish success,msg = "+msg)
  52. def send_msg(phone,imei,eNum):
  53. # msgconf = eval(i.conf)
  54. # 需要发送短信的手机号码
  55. # 短信模板ID,需要在短信控制台中申请
  56. template_id = 587861 # NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请
  57. # 签名
  58. sms_sign = "云飞科技" # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请
  59. ssender = SmsSingleSender(appid, appkey)
  60. params = [imei,eNum] # 当模板没有参数时,`params = []`
  61. try:
  62. result = ssender.send_with_param(86, phone,
  63. template_id, params, sign=sms_sign, extend="", ext="") # 签名参数未提供或者为空时,会使用默认签名发送短信
  64. except HTTPError as e:
  65. print(e)
  66. result = e
  67. except Exception as e:
  68. print(e)
  69. result = e
  70. print(result)
  71. # Msg_Send.objects.create(mobile=msgconf["phone"],equip_id=i.equip_id,send_dec=params,result_desc=result)
  72. print("----发送成功",phone)
  73. return result
  74. # 从服务器接受到消息后回调此函数 :
  75. def on_message(client, userdata, msg):
  76. print('\r')
  77. print('=================================================')
  78. print('\r')
  79. print("<-----topic:\n" + msg.topic + ';\n')
  80. print("Message:\n" + str(msg.payload) + "----->\n")
  81. # 从主题中获取imei
  82. # imei = msg.topic[14:len(msg.topic)]
  83. imei = re.sub("\D", "", msg.topic)
  84. print("<-----imei:", imei, "----->")
  85. try:
  86. alarm = eval(QXZ_Alarm.objects.get(equip_id=imei).conf)
  87. except:
  88. alarm = ""
  89. nowtime = datetime.datetime.now().strftime('%Y%m%d')
  90. if alarm != "":
  91. try:
  92. # 判断主题:
  93. if "pub" in msg.topic:
  94. # 将json字符串解析:
  95. payload = json.loads(msg.payload.decode())
  96. if payload.get("cmd") == "terminalData":
  97. print("<-----transpond data!----->")
  98. data = payload.get("ext")
  99. # data = json.dumps(data, cls=CJSONEncoder)
  100. print("参数类型为:",type(data))
  101. print("发送数据为:",data)
  102. print("列表数据为:",type(data["data"]))
  103. aa = data["data"]
  104. print("len",len(aa))
  105. for i in aa:
  106. print(i['eKey'])
  107. print(i['eValue'])
  108. cc = i["eKey"]
  109. print("预警值=======>>",alarm["dat"][cc])
  110. # 先判断是否设置的有预警值
  111. if alarm["dat"][cc].split("#")[1] != "":
  112. # 如果值大于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表
  113. try:
  114. logs = QXZ_Alarm_Log.objects.get(equip_id=imei,ekey=i["eKey"])
  115. except:
  116. logs = ""
  117. if logs == "":
  118. # 此处判断大于小于设定的预警值
  119. # 如果小于
  120. if alarm["dat"][cc].split("#")[0] == "0":
  121. print("----小")
  122. if i['eValue'] < alarm["dat"][cc].split("#")[1]:
  123. a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1])
  124. print(a)
  125. QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="小于预警")
  126. # # msgconf = eval(i.conf)
  127. # # 需要发送短信的手机号码
  128. # phone_numbers = alarm["tel"]
  129. # # 短信模板ID,需要在短信控制台中申请
  130. # template_id = 587861 # NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请
  131. # # 签名
  132. # sms_sign = "云飞科技" # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请
  133. # ssender = SmsSingleSender(appid, appkey)
  134. # params = [imei,qxz_dict[i['eNum']][1]] # 当模板没有参数时,`params = []`
  135. # try:
  136. # result = ssender.send_with_param(86, phone_numbers,
  137. # template_id, params, sign=sms_sign, extend="", ext="") # 签名参数未提供或者为空时,会使用默认签名发送短信
  138. # except HTTPError as e:
  139. # print(e)
  140. # except Exception as e:
  141. # print(e)
  142. # print(result)
  143. # # Msg_Send.objects.create(mobile=msgconf["phone"],equip_id=i.equip_id,send_dec=params,result_desc=result)
  144. # pest_name = []
  145. # print("----发送成功",phone_numbers)
  146. # 判断值是否小于
  147. # 如果值小于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表
  148. # 如果大于
  149. elif alarm["dat"][cc].split("#")[0] == "1":
  150. # 判断值是否大于
  151. if i['eValue'] > alarm["dat"][cc].split("#")[1]:
  152. a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1])
  153. print(a)
  154. QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="大于预警")
  155. print("====log为空!")
  156. elif logs != "":
  157. if (logs.upl_time).strftime('%Y%m%d') != nowtime:
  158. if alarm["dat"][cc].split("#")[0] == "0":
  159. a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1])
  160. print(a)
  161. QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="小于预警")
  162. # 判断值是否小于
  163. # 如果值小于并且在今天的数据库里没有这条信息的记录则发送短信,并记录进数据表
  164. # 如果大于
  165. elif alarm["dat"][cc].split("#")[0] == "1":
  166. a = send_msg(alarm["tel"],imei,qxz_dict[i['eNum']][1])
  167. print(a)
  168. QXZ_Alarm_Log.objects.create(equip_id=Equip.objects.get(equip_id=imei),logs=a,ekey=i["eKey"],info="大于预警")
  169. print("当天没有发送过短信")
  170. else:
  171. print("此通道未设置预警!!!")
  172. except Exception as e:
  173. print(e)
  174. if __name__ == '__main__':
  175. client = mqtt.Client(
  176. client_id="QXZ_MSG_ALARM",
  177. clean_session=True,
  178. userdata=None,
  179. # protocol=MQTTv311,# 数据库版本
  180. )
  181. # 必须设置,否则会返回「Connected with result code 4」
  182. client.username_pw_set("admin", "password")
  183. client.on_connect = on_connect
  184. client.on_message = on_message
  185. HOST = "127.0.0.1"
  186. client.connect(HOST, 1883, 60)
  187. client.loop_forever()