send_control.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. from pickle import decode_long
  2. import requests
  3. import json
  4. import logging
  5. from requests.auth import HTTPBasicAuth
  6. from django.conf import settings
  7. from smartfarming.api.views.forecast.all_dict import insect_dict,get_siminfo,get_simsinfo
  8. from kedong.decoration import kedong_deco, PortError
  9. from smartfarming.models.device import MongoDeviceConfig, MongoDevice
  10. from smartfarming.models.weather import MongoQXZ_Base_Info
  11. logger = logging.getLogger("control")
  12. config_dict = settings.CONFIG
  13. @kedong_deco(login_required=True)
  14. def device_control_info(request):
  15. # 设备控制信息/ 设备操作当前状态
  16. post_info = request.POST
  17. d_id = post_info.get("d_id", '')
  18. cmd = post_info.get("cmd", '')
  19. if not cmd:
  20. raise PortError('cmd',"参数缺失")
  21. if not d_id:
  22. raise PortError('d_id', "参数缺失")
  23. device_config = MongoDeviceConfig.objects.filter(d_id=d_id,cmd=cmd)
  24. if device_config.exists():
  25. d_config = device_config.first()
  26. try:
  27. config = json.loads(d_config.device_config)
  28. except:
  29. config = eval(d_config.device_config)
  30. if "ext" in config:
  31. d_config = config["ext"]
  32. else:
  33. d_config = config
  34. return d_config
  35. else:
  36. device = MongoDevice.objects.filter(id=d_id, device_type_id__in = [5, 8])
  37. if device:
  38. device = device.first()
  39. raise PortError(d_id, "配置未上传")
  40. @kedong_deco(login_required=True)
  41. def device_control(request):
  42. # 设备下发控制
  43. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  44. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  45. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  46. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  47. post_info = request.POST
  48. device_type_id = post_info.get("device_type_id", '')
  49. d_id = post_info.get("d_id", '')
  50. req = post_info.get("req","")
  51. work_type = post_info.get("work_type", '')
  52. device_name = post_info.get("device_name", '')
  53. if not d_id:
  54. raise PortError('d_id',"参数缺失")
  55. devices = MongoDevice.objects.all()
  56. try:
  57. device = devices.get(id=int(d_id))
  58. except:
  59. raise PortError("d_id","没有此设备")
  60. if device.device_expire == "1":
  61. raise PortError("d_id","设备已过期")
  62. if device_name:
  63. device.device_name = device_name
  64. device.save()
  65. config = post_info.get("config", '')
  66. cmd = post_info.get("cmd", '')
  67. payload = {}
  68. if work_type == "0":
  69. payload = {"cmd": "workmode", "ext": {"asleep": "1", "common": "0", "power": "0"}}
  70. elif work_type == "1":
  71. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "1", "power": "0"}}
  72. elif work_type == "2":
  73. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "0", "power": "1"}}
  74. if config:
  75. try:
  76. config = json.loads(config)
  77. except:
  78. raise PortError('',"参数类型错误")
  79. if not work_type:
  80. if not config:
  81. raise PortError('config', "参数缺失")
  82. payload["cmd"] = "paramconf"
  83. payload["ext"] = config
  84. if req == "ctr_clear":
  85. payload = {"cmd": "ctr_clear"}
  86. topic = ""
  87. if not device_type_id:
  88. raise PortError('device_type_id',"参数缺失")
  89. if int(device_type_id) == 3:
  90. topic = "/yfkj/cbd/sub/%s"%device.device_id
  91. elif int(device_type_id) == 2:
  92. topic = "/yfkj/scd/sub/%s"%device.device_id
  93. elif int(device_type_id) == 4:
  94. topic = "/yfkj/xycb/s2c/%s"%device.device_id
  95. elif int(device_type_id) in [5, 8]:
  96. topic = "/yfkj/qxz/sub/%s"%device.device_id
  97. timeout = config.get("timeout","")
  98. content = config.get("content","")
  99. interval = config.get("interval","")
  100. if content:
  101. payload["cmd"] = "dotled"
  102. payload["ext"] = {
  103. "content":content,
  104. "timeout":timeout,
  105. }
  106. cmds = {"topic": topic, "payload": payload, "qos": 1}
  107. content = "气象站:%s,下发:%s"
  108. if interval:
  109. payload["cmd"] = "config"
  110. payload["ext"] = {"interval":interval}
  111. cmds = {"topic": topic, "payload": payload, "qos": 1}
  112. logger.warning(f"设备下发的指令:{cmds}")
  113. response = requests.post(
  114. "%s" % config_dict['mqtt_config']["http"],
  115. json=cmds,timeout=(3),
  116. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"],
  117. config_dict['mqtt_config']["secret_key"])
  118. )
  119. logger.warning(f"设备的返回值:{response}")
  120. # response_code = 200
  121. response_code = response.status_code
  122. if response_code == 200:
  123. return True
  124. else:
  125. return False
  126. elif int(device_type_id) == 7:
  127. topic = "/yfkj/bzy/s2c/%s"%device.device_id
  128. elif int(device_type_id) == 14:
  129. payload = config
  130. topic = "yfkj/color/s2c/%s"%device.device_id
  131. elif int(device_type_id) == 12:
  132. topic = "/yfkj/cbd/sub/%s"%device.device_id
  133. if cmd == "setnet":
  134. ftp = config["ftp"]
  135. mqtt = config["mqtt"]
  136. mqtt["qos"] = 0
  137. payload = {
  138. "cmd":cmd,
  139. "ftp": ftp,
  140. "mqtt": mqtt,
  141. }
  142. payload = json.dumps(payload)
  143. cmds = {"topic":topic,"payload":payload,"qos":1}
  144. content = "设备类型:%s,下发:%s"
  145. # mqtt 协议
  146. logger.warning(f"设备下发的指令:{cmds}")
  147. response = requests.post(
  148. "%s" % config_dict['mqtt_config']["http"],
  149. json=cmds,timeout=(3),
  150. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"],
  151. config_dict['mqtt_config']["secret_key"])
  152. )
  153. logger.warning(f"设备的返回值:{response}")
  154. response_code = response.status_code
  155. if response_code == 200:
  156. device_config = MongoDeviceConfig.objects.get(d_id=d_id)
  157. device_config.device_config = str(payload)
  158. device_config.save()
  159. logger.warning(f"修改设备{d_id} 成功: {str(payload)}")
  160. return True
  161. else:
  162. return False
  163. @kedong_deco(login_required=True)
  164. def clear_insects_permission(request):
  165. """
  166. 杀虫灯账户是否具有清虫权限
  167. """
  168. uid = request.myuser.uid
  169. data = [0, 0]
  170. return data
  171. @kedong_deco(login_required=True)
  172. def get_device_config(request):
  173. """
  174. 查询设备配置信息/设备监测最新数据 刷新按钮
  175. 参数:
  176. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪 14色诱测报 12吸虫塔
  177. d_id 必传 设备自增id
  178. control_type 必传 操作类型 data 读取设备数据信息/serverconf 读取服务器配置信息
  179. """
  180. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  181. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  182. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  183. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  184. post_info = request.POST
  185. device_type_id = post_info.get("device_type_id", '')
  186. d_id = post_info.get("d_id", '')
  187. if not d_id:
  188. raise PortError('d_id', "参数缺失")
  189. devices = MongoDevice.objects.all()
  190. device = devices.get(id=int(d_id))
  191. myuser_type = request.user_type
  192. if not myuser_type == 1 and device.device_expire == "1":
  193. raise PortError('', "该设备已到期")
  194. control_type = post_info.get("control_type", '')
  195. if not control_type:
  196. raise PortError('control_type',"参数缺失")
  197. payload = {
  198. "cmd": "read",
  199. "ext":control_type
  200. }
  201. topic = ""
  202. if not device_type_id:
  203. raise PortError('device_type_id', "参数缺失")
  204. if int(device_type_id) == 3 or int(device_type_id) == 12:
  205. topic = "/yfkj/cbd/sub/%s" % device.device_id
  206. elif int(device_type_id) == 2:
  207. topic = "/yfkj/scd/sub/%s" % device.device_id
  208. elif int(device_type_id) == 4:
  209. topic = "/yfkj/xycb/s2c/%s" % device.device_id
  210. elif int(device_type_id) == 5:
  211. topic = "/yfkj/qxz/sub/%s" % device.device_id
  212. payload = {
  213. "cmd": "read",
  214. "ext": {"type": control_type}
  215. }
  216. elif int(device_type_id) == 7:
  217. topic = "/yfkj/bzy/s2c/%s" % device.device_id
  218. elif int(device_type_id) == 9:
  219. topic = "/yfkj/tccbd/sub/%s" % device.device_id
  220. elif int(device_type_id) == 14:
  221. topic = "yfkj/color/s2c/%s" % device.device_id
  222. payload = {"cmd":"read","ext":"data"}
  223. elif int(device_type_id) == 8:
  224. topic = "/yfkj/xyv3/s2c/%s" % device.device_id
  225. cmd = {
  226. "topic": topic,
  227. "payload": json.dumps(payload),
  228. "qos": 1
  229. }
  230. # mqtt 协议
  231. logger.warning(f"设备下发的指令:{cmd}")
  232. response = requests.post(
  233. "%s"%config_dict['mqtt_config']["http"],
  234. json=cmd,
  235. auth=HTTPBasicAuth(
  236. config_dict['mqtt_config']["user"],
  237. config_dict['mqtt_config']["secret_key"]
  238. )
  239. )
  240. logger.warning(f"设备的返回值:{response}")
  241. response_code = response.status_code
  242. if response_code == 200:
  243. return True
  244. else:
  245. return False
  246. @kedong_deco(login_required=True)
  247. def admin_device_control(request):
  248. """
  249. 单个按钮管理员操作 设备控制
  250. """
  251. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  252. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  253. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  254. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  255. #气象站 下发主题 /yfkj/qxz/sub/+imei
  256. #性诱测报 下发主题 yfkj/color/s2c
  257. post_info = request.POST
  258. cmd = post_info.get("cmd", '')
  259. if not cmd:
  260. raise PortError('cmd', "参数缺失")
  261. device_type_id = post_info.get("device_type_id", '')
  262. parm = post_info.get('parm', "")
  263. d_id = post_info.get("d_id", '')
  264. if not d_id:
  265. raise PortError('d_id',"参数缺失")
  266. devices = MongoDevice.objects.all()
  267. device_id = devices.get(id=int(d_id)).device_id
  268. payload = ""
  269. topic = ""
  270. if not device_type_id:
  271. raise PortError('device_type_id',"参数缺失")
  272. if int(device_type_id) == 3 or int(device_type_id) == 12:
  273. topic = "/yfkj/cbd/sub/%s"%device_id
  274. payload = {"cmd": cmd}
  275. if cmd == "boot1":
  276. payload = {"cmd":"switch","ext":{"boot":1}}
  277. elif cmd == "boot0":
  278. payload = {"cmd":"switch","ext":{"boot":0}}
  279. elif cmd == "close_shake":
  280. payload = {"cmd": "shake", "ext":{"ws":0}}
  281. elif cmd == "open_shake":
  282. payload = {"cmd": "shake", "ext":{"ws":1}}
  283. elif cmd == "yfwlw":
  284. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  285. elif cmd =="imei":
  286. # 修改imei
  287. imei = post_info.get("imei", '')
  288. payload = {"cmd":"setimei","ext":{"imei":imei}}
  289. elif int(device_type_id) == 2:
  290. topic = "/yfkj/scd/sub/%s" % device_id
  291. if cmd == "clear":
  292. if not parm:
  293. raise PortError('parm',"参数缺失")
  294. payload = {"cmd":"clear","ext":{ "clt":int(parm)}}
  295. elif cmd == "test":
  296. payload = {"cmd":"test"}
  297. elif cmd == "yfwlw": # 平台切换
  298. payload ={"cmd":"paramconf","ext":{"type": "120.27.222.26"}}
  299. elif cmd == "paramconf1": # 标配物联网
  300. payload = {"cmd":"paramconf","ext":{"vt": "uart"}}
  301. elif cmd == "paramconf2": # 物联网自清虫
  302. payload = {"cmd":"paramconf","ext":{"vt": "uart-ZQC"}}
  303. elif cmd == "paramconf3": # 物联网光控
  304. payload = {"cmd":"paramconf","ext":{"vt": "uart-light"}}
  305. elif cmd == "paramconf4": # 物联网光控自清虫
  306. payload = {"cmd":"paramconf","ext":{"vt": "uart-light-ZQC"}}
  307. else:
  308. payload = {"cmd": cmd}
  309. elif int(device_type_id) == 4:
  310. topic = "/yfkj/xycb/s2c/%s" % device_id
  311. payload = {"cmd": cmd}
  312. if cmd == "turnset":
  313. if not parm:
  314. raise PortError('parm',"参数缺失")
  315. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  316. elif cmd == "turn":
  317. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  318. elif cmd == "photoset":
  319. if not parm:
  320. raise PortError('parm', "参数缺失")
  321. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  322. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  323. elif cmd == "repower":
  324. payload = {"cmd": "repower","ext":""}
  325. elif cmd == "yfwlw":
  326. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  327. elif int(device_type_id) == 8:
  328. topic = "/yfkj/xyv3/s2c/%s" % device_id
  329. payload = {"cmd": cmd}
  330. if cmd == "turnset":
  331. if not parm:
  332. raise PortError('parm',"参数缺失")
  333. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  334. elif cmd == "turn":
  335. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  336. elif cmd == "photoset":
  337. if not parm:
  338. raise PortError('parm', "参数缺失")
  339. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  340. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  341. elif cmd == "repower":
  342. payload = {"cmd": "repower","ext":""}
  343. elif int(device_type_id) == 5:
  344. topic = "/yfkj/qxz/sub/%s" % device_id
  345. payload = {
  346. "cmd": cmd
  347. }
  348. elif int(device_type_id) == 7:
  349. lists = ["update","reboot","poweroff","poweron","coldoff","coldon","dtu_update","dtu_reboot"]
  350. payload = {"cmd": cmd}
  351. if cmd == "takephoto":
  352. payload = {"cmd": "ctrl", "ext": {"type": "takephoto"}}
  353. elif cmd in lists:
  354. payload = {"cmd":cmd}
  355. elif cmd == "autotakephoto":
  356. payload = {"ext":{"type":"auto_takephoto"},"cmd":"ctrl"}
  357. elif cmd == "turn":
  358. payload = {"ext":{"type":"turn"},"cmd":"ctrl"}
  359. elif cmd == "big_data":
  360. # 大数据平台:
  361. payload ={"cmd": "platform", "ext": {"type": "8.136.98.49"}}
  362. elif cmd == "yfwlw":
  363. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  364. elif cmd == "location":
  365. #设置手动定位
  366. lat = post_info.get("lat", '')
  367. lng = post_info.get("lng", '')
  368. payload ={"cmd":"location", "ext":{"lat":lat,"lng":lng,"type":0}}
  369. elif cmd == "imei":
  370. # 修改设备ID:
  371. imei = post_info.get("imei", '')
  372. payload = {"cmd":"setimei","ext":{"imei":imei}}
  373. elif cmd == "photo_num":
  374. num = int(post_info.get("num", ''))
  375. payload = {"cmd":"warn","ext":{"status":num,"type":"get_photo_step"}}
  376. topic = "/yfkj/bzy/s2c/%s" % device_id
  377. elif int(device_type_id) == 9:
  378. topic = "/yfkj/tccbd/sub/%s" % device_id
  379. if cmd == "takephoto":
  380. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  381. elif cmd == "reboot":
  382. payload = {"cmd":"reboot","ext":""}
  383. elif cmd == "update":
  384. payload = {"cmd":"update","ext":""}
  385. elif cmd == "status":
  386. payload = {"cmd": "read", "ext": {"type": "status"}}
  387. elif cmd == "paramconf":
  388. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  389. elif cmd == "boot1":
  390. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  391. elif int(device_type_id) == 14:
  392. topic = "yfkj/color/s2c/%s" % device_id
  393. if cmd == "update":
  394. payload = {"cmd": "dtu_update"}
  395. elif cmd == "reboot":
  396. payload = {"cmd": "dtu_reboot"}
  397. elif cmd =="takephoto":
  398. payload = {"cmd":"rtu_takephoto"}
  399. payload = json.dumps(payload)
  400. data = {"topic":topic,"payload":payload,"qos":1}
  401. logger.warning(f"设备下发的指令:{data}")
  402. response = requests.post(
  403. "%s" % config_dict['mqtt_config']["http"],
  404. json=data,
  405. auth=HTTPBasicAuth(
  406. config_dict['mqtt_config']["user"],
  407. config_dict['mqtt_config']["secret_key"]
  408. )
  409. )
  410. logger.warning(f"设备的返回值:{response}")
  411. response_code = response.status_code
  412. if response_code == 200:
  413. device_config = MongoDeviceConfig.objects.get(d_id=d_id)
  414. device_config.device_config = str(payload)
  415. device_config.save()
  416. logger.warning(f"修改设备{d_id} 成功: {str(payload)}")
  417. return True
  418. else:
  419. return False