qxz_mqtt_client.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. # -*- coding: utf-8 -*-
  2. # File Name:mqtt_chat_client.py
  3. # Python Version:3.5.1
  4. import os
  5. import django
  6. import sys
  7. BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 定位到你的django根目录
  8. sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))
  9. os.environ.setdefault("DJANGO_SETTINGS_MODULE",
  10. "yfwlw_pro.settings") # project_name 项目名称
  11. django.setup()
  12. print("<-----python_mqtt_client_qxz is run----->")
  13. import paho.mqtt.client as mqtt
  14. import json
  15. from apps.AppInfoManage.models import Equip, Equip_type, MyUser, Alarm_record, QXZdata, QXZstatus, QXZswitchstatus, QXZswitchdata, QXZAutoswitch, QXZTimingswitch
  16. import re
  17. import datetime
  18. class CJSONEncoder(json.JSONEncoder):
  19. def default(self, obj):
  20. if isinstance(obj, datetime):
  21. return obj.strftime('%Y-%m-%d %H:%M:%S')
  22. elif isinstance(obj, date):
  23. return obj.strftime('%Y-%m-%d')
  24. else:
  25. return json.JSONEncoder.default(self, obj)
  26. # 连接后的操作: 0为成功
  27. def on_connect(client, userdata, flags, rc):
  28. # print("Connected with result code "+str(rc))
  29. client.subscribe("/yfkj/qxz/pub/#")
  30. # *****成功发布******
  31. def on_publish(msg, rc):
  32. if rc == 0:
  33. print("publish success,msg = "+msg)
  34. # 从服务器接受到消息后回调此函数 :
  35. def on_message(client, userdata, msg):
  36. print('\r')
  37. print('=================================================')
  38. print('\r')
  39. print("<-----topic:\n" + msg.topic + ';\n')
  40. print("Message:\n" + str(msg.payload) + "----->\n")
  41. # 从主题中获取imei
  42. # imei = msg.topic[14:len(msg.topic)]
  43. imei = re.sub("\D", "", msg.topic)
  44. print("<-----imei:", imei, "----->")
  45. try:
  46. # 判断主题:
  47. if "pub" in msg.topic:
  48. # 将json字符串解析:
  49. payload = json.loads(msg.payload.decode())
  50. qxz_exist = Equip.objects.filter(equip_id=imei)
  51. if payload.get("cmd") == "terminalData":
  52. print("<-----uploading data!----->")
  53. extdata = payload.get("ext")
  54. # print("extdata:", extdata)
  55. # 设备存在,进一步判断状态表是否存在:
  56. if qxz_exist.exists():
  57. print("<-----this equip is existed!----->")
  58. try:
  59. e_id = Equip.objects.get(equip_id=imei)
  60. except:
  61. print("<-----this equip didn't exist!----->")
  62. try:
  63. # 设备数据表直接储存数据
  64. QXZdata.objects.create(equip_id=e_id, qxz_data=extdata)
  65. print("<-----data update success!----->")
  66. except:
  67. print("<-----data update failed!----->")
  68. # 设备状态表存在、刷新状态表:
  69. if QXZstatus.objects.filter(equip_id=imei).exists():
  70. print("<-----this equip's status is existed!----->")
  71. try:
  72. sta = QXZstatus.objects.get(equip_id=imei)
  73. sta.qxz_status=extdata
  74. sta.save()
  75. print("<-----status update success!----->")
  76. except:
  77. print("<-----status update failed!----->")
  78. else:
  79. # 设备状态表不存在、创建状态表:
  80. print("<-----this equip's status is not existed!----->")
  81. try:
  82. QXZstatus.objects.create(equip_id=e_id, qxz_status=extdata)
  83. print("<-----this equip's status table re-create successed!----->")
  84. except:
  85. print("<-----this equip's status table re-create failed!----->")
  86. else:
  87. pass
  88. # # 设备不存在,在设备列表中创建:
  89. # equip_t = Equip_type.objects.get(type_id=5)
  90. # try:
  91. # e_id = Equip.objects.create(equip_id=imei, equip_type=equip_t)
  92. # print("<-----this imei add successed!----->")
  93. # try:
  94. # # 设备数据表直接储存数据
  95. # QXZdata.objects.create(equip_id=e_id, qxz_data=extdata)
  96. # print("<-----data update success!----->")
  97. # except:
  98. # print("<-----data update failed!----->")
  99. # try:
  100. # QXZstatus.objects.create(equip_id=e_id, qxz_status=extdata)
  101. # print("<-----this imei register successed!----->")
  102. # except:
  103. # print("<-----this imei register failed!----->")
  104. # except:
  105. # print("<-----this imei add failed!----->")
  106. elif payload.get("cmd") == "control":
  107. # extdata = eval(payload.get("ext"))["runStatus"]
  108. extdata = payload.get("ext")['runStatus']
  109. print("extdata:", extdata)
  110. # 设备存在,进一步判断开关表是否存在:
  111. if qxz_exist.exists():
  112. print("<-----this equip is existed!----->")
  113. try:
  114. e_id = Equip.objects.get(equip_id=imei)
  115. except:
  116. print("<-----this equip didn't exist!----->")
  117. if QXZswitchstatus.objects.filter(equip_id=imei).exists():
  118. print("<-----this switch status is existed!----->")
  119. try:
  120. sta = QXZswitchstatus.objects.get(equip_id=imei)
  121. sta.qxz_switch=extdata
  122. sta.save()
  123. print("<-----switchstatus update success!----->")
  124. except:
  125. print("<-----switchstatus update failed!----->")
  126. else:
  127. # 设备开关表不存在、创建开关表:
  128. print("<-----this switch switchstatus is not existed!----->")
  129. try:
  130. QXZswitchstatus.objects.create(equip_id=e_id, qxz_switch=extdata)
  131. print("<-----this switchstatus table re-create successed!----->")
  132. except:
  133. print("<-----this switchstatus table re-create failed!----->")
  134. # 气象站开关自定义名字表
  135. if QXZswitchdata.objects.filter(equip_id=imei).exists():
  136. if QXZswitchdata.objects.get(equip_id=e_id).qxz_switch_data == "[]":
  137. # 设备开关配置表存在、更新开关配置表:
  138. print("<-----this switch switchdata existed!----->")
  139. extdata = payload.get("ext")['runStatus']
  140. data = []
  141. for i in extdata:
  142. print(i["JK"])
  143. data.append({"JK":i["JK"],"name":""})
  144. print(data)
  145. try:
  146. QXZswitchdata.objects.filter(equip_id=e_id).update(qxz_switch_data=data)
  147. print("<-----this switchdata table update successed!----->")
  148. except Exception as e:
  149. print(e)
  150. print("<-----this switchdata table update failed!----->")
  151. else:
  152. # 设备开关配置表不存在、创建开关配置表:
  153. print("<-----this switch switchdata is not existed!----->")
  154. extdata = payload.get("ext")['runStatus']
  155. data = []
  156. for i in extdata:
  157. print(i["JK"])
  158. data.append({"JK":i["JK"],"name":""})
  159. print(data)
  160. try:
  161. QXZswitchdata.objects.create(equip_id=e_id, qxz_switch_data=data)
  162. print("<-----this switchdata table re-create successed!----->")
  163. except Exception as e:
  164. print(e)
  165. print("<-----this switchdata table re-create failed!----->")
  166. # if QXZswitchdata.objects.get(equip_id=imei).qxz_switch_data != "[]":
  167. # print("<-----this switchdata is existed!----->")
  168. # else:
  169. # # 设备开关配置表不存在、创建开关配置表:
  170. # print("<-----this switch switchdata is not existed!----->")
  171. # extdata = payload.get("ext")['runStatus']
  172. # data = []
  173. # for i in extdata:
  174. # print(i["JK"])
  175. # data.append({"JK":i["JK"],"name":""})
  176. # print(data)
  177. # try:
  178. # QXZswitchdata.objects.create(equip_id=e_id, qxz_switch_data=data)
  179. # print("<-----this switchdata table re-create successed!----->")
  180. # except Exception as e:
  181. # print(e)
  182. # print("<-----this switchdata table re-create failed!----->")
  183. elif payload.get("cmd") == "auto":
  184. # extdata = eval(payload.get("ext"))["runStatus"]
  185. extdata = payload.get("ext")['runStatus']
  186. print("extdata:", extdata)
  187. # 设备存在,进一步判断阈值表是否存在:
  188. if qxz_exist.exists():
  189. print("<-----this equip is existed!----->")
  190. try:
  191. e_id = Equip.objects.get(equip_id=imei)
  192. except:
  193. print("<-----this equip didn't exist!----->")
  194. if QXZAutoswitch.objects.filter(equip_id=imei).exists():
  195. print("<-----this autoswitch is existed!----->")
  196. try:
  197. sta = QXZAutoswitch.objects.get(equip_id=imei)
  198. sta.qxz_auto=extdata
  199. sta.save()
  200. print("<-----switchstatus update success!----->")
  201. except:
  202. print("<-----switchstatus update failed!----->")
  203. else:
  204. # 设备阈值表不存在、创建阈值表:
  205. print("<-----this switch autoswitch is not existed!----->")
  206. try:
  207. QXZAutoswitch.objects.create(equip_id=e_id, qxz_auto=extdata)
  208. print("<-----this autoswitch table re-create successed!----->")
  209. except:
  210. print("<-----this autoswitch table re-create failed!----->")
  211. elif payload.get("cmd") == "timing":
  212. extdata = payload.get("ext")['setTime']
  213. print("extdata:", extdata)
  214. # 设备存在,进一步判断定时表是否存在:
  215. if qxz_exist.exists():
  216. print("<-----this equip is existed!----->")
  217. try:
  218. e_id = Equip.objects.get(equip_id=imei)
  219. except:
  220. print("<-----this equip didn't exist!----->")
  221. if QXZTimingswitch.objects.filter(equip_id=imei).exists():
  222. print("<-----this timingstatus is existed!----->")
  223. try:
  224. sta = QXZTimingswitch.objects.get(equip_id=imei)
  225. sta.qxz_timing=extdata
  226. sta.save()
  227. print("<-----timingstatus update success!----->")
  228. except:
  229. print("<-----timingstatus update failed!----->")
  230. else:
  231. # 设备阈值表不存在、创建阈值表:
  232. print("<-----this switch timingstatus is not existed!----->")
  233. try:
  234. QXZTimingswitch.objects.create(equip_id=e_id, qxz_timing=extdata)
  235. print("<-----this timingstatus table re-create successed!----->")
  236. except:
  237. print("<-----this timingstatus table re-create failed!----->")
  238. except:
  239. pass
  240. if __name__ == '__main__':
  241. client = mqtt.Client(
  242. client_id="PY_MQTT_CLIENTC_QXZ",
  243. clean_session=True,
  244. userdata=None,
  245. # protocol=MQTTv311,# 数据库版本
  246. )
  247. # 必须设置,否则会返回「Connected with result code 4」
  248. client.username_pw_set("admin", "password")
  249. client.on_connect = on_connect
  250. client.on_message = on_message
  251. HOST = "127.0.0.1"
  252. client.connect(HOST, 1883, 60)
  253. client.loop_forever()