send_control.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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. device_config = MongoDeviceConfig.objects.get(d_id=d_id)
  124. device_config.device_config = str(payload)
  125. device_config.save()
  126. logger.warning(f"修改设备控制文件{d_id} 成功: {str(payload)}")
  127. return True
  128. else:
  129. return False
  130. elif int(device_type_id) == 7:
  131. topic = "/yfkj/bzy/s2c/%s"%device.device_id
  132. elif int(device_type_id) == 14:
  133. payload = config
  134. topic = "yfkj/color/s2c/%s"%device.device_id
  135. elif int(device_type_id) == 12:
  136. topic = "/yfkj/cbd/sub/%s"%device.device_id
  137. if cmd == "setnet":
  138. ftp = config["ftp"]
  139. mqtt = config["mqtt"]
  140. mqtt["qos"] = 0
  141. payload = {
  142. "cmd":cmd,
  143. "ftp": ftp,
  144. "mqtt": mqtt,
  145. }
  146. payload = json.dumps(payload)
  147. cmds = {"topic":topic,"payload":payload,"qos":1}
  148. content = "设备类型:%s,下发:%s"
  149. # mqtt 协议
  150. logger.warning(f"设备下发的指令:{cmds}")
  151. response = requests.post(
  152. "%s" % config_dict['mqtt_config']["http"],
  153. json=cmds,timeout=(3),
  154. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"],
  155. config_dict['mqtt_config']["secret_key"])
  156. )
  157. logger.warning(f"设备的返回值:{response}")
  158. response_code = response.status_code
  159. logger.warning(f"控制响应码:{response_code}")
  160. if response_code == 200:
  161. ext = payload.get("ext", {})
  162. if ext:
  163. dattim = ext.get("dattim", "")
  164. clt = ext.get("clt", "")
  165. if int(device_type_id) == 2:
  166. ext = payload.get("ext")
  167. if dattim:
  168. ext.pop("dattim")
  169. ext["dat_f"] = dattim
  170. if clt:
  171. ext.pop("clt")
  172. ext["clt_t"] = clt
  173. payload["ext"] = ext
  174. device_config = MongoDeviceConfig.objects.get(d_id=d_id)
  175. device_config.device_config = str(payload)
  176. device_config.save()
  177. logger.warning(f"修改设备{d_id} 成功: {str(payload)}")
  178. return True
  179. else:
  180. return False
  181. @kedong_deco(login_required=True)
  182. def clear_insects_permission(request):
  183. """
  184. 杀虫灯账户是否具有清虫权限
  185. """
  186. uid = request.myuser.uid
  187. data = [0, 0]
  188. return data
  189. @kedong_deco(login_required=True)
  190. def get_device_config(request):
  191. """
  192. 查询设备配置信息/设备监测最新数据 刷新按钮
  193. 参数:
  194. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪 14色诱测报 12吸虫塔
  195. d_id 必传 设备自增id
  196. control_type 必传 操作类型 data 读取设备数据信息/serverconf 读取服务器配置信息
  197. """
  198. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  199. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  200. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  201. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  202. post_info = request.POST
  203. device_type_id = post_info.get("device_type_id", '')
  204. d_id = post_info.get("d_id", '')
  205. if not d_id:
  206. raise PortError('d_id', "参数缺失")
  207. devices = MongoDevice.objects.all()
  208. device = devices.get(id=int(d_id))
  209. myuser_type = request.user_type
  210. if not myuser_type == 1 and device.device_expire == "1":
  211. raise PortError('', "该设备已到期")
  212. control_type = post_info.get("control_type", '')
  213. if not control_type:
  214. raise PortError('control_type',"参数缺失")
  215. payload = {
  216. "cmd": "read",
  217. "ext":control_type
  218. }
  219. topic = ""
  220. if not device_type_id:
  221. raise PortError('device_type_id', "参数缺失")
  222. if int(device_type_id) == 3 or int(device_type_id) == 12:
  223. topic = "/yfkj/cbd/sub/%s" % device.device_id
  224. elif int(device_type_id) == 2:
  225. topic = "/yfkj/scd/sub/%s" % device.device_id
  226. elif int(device_type_id) == 4:
  227. topic = "/yfkj/xycb/s2c/%s" % device.device_id
  228. elif int(device_type_id) == 5:
  229. topic = "/yfkj/qxz/sub/%s" % device.device_id
  230. payload = {
  231. "cmd": "read",
  232. "ext": {"type": control_type}
  233. }
  234. elif int(device_type_id) == 7:
  235. topic = "/yfkj/bzy/s2c/%s" % device.device_id
  236. elif int(device_type_id) == 9:
  237. topic = "/yfkj/tccbd/sub/%s" % device.device_id
  238. elif int(device_type_id) == 14:
  239. topic = "yfkj/color/s2c/%s" % device.device_id
  240. payload = {"cmd":"read","ext":"data"}
  241. elif int(device_type_id) == 8:
  242. topic = "/yfkj/xyv3/s2c/%s" % device.device_id
  243. cmd = {
  244. "topic": topic,
  245. "payload": json.dumps(payload),
  246. "qos": 1
  247. }
  248. # mqtt 协议
  249. logger.warning(f"设备下发的指令:{cmd}")
  250. response = requests.post(
  251. "%s"%config_dict['mqtt_config']["http"],
  252. json=cmd,
  253. auth=HTTPBasicAuth(
  254. config_dict['mqtt_config']["user"],
  255. config_dict['mqtt_config']["secret_key"]
  256. )
  257. )
  258. logger.warning(f"设备的返回值:{response}")
  259. response_code = response.status_code
  260. if response_code == 200:
  261. return True
  262. else:
  263. return False
  264. @kedong_deco(login_required=True)
  265. def admin_device_control(request):
  266. """
  267. 单个按钮管理员操作 设备控制
  268. """
  269. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  270. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  271. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  272. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  273. #气象站 下发主题 /yfkj/qxz/sub/+imei
  274. #性诱测报 下发主题 yfkj/color/s2c
  275. post_info = request.POST
  276. cmd = post_info.get("cmd", '')
  277. if not cmd:
  278. raise PortError('cmd', "参数缺失")
  279. device_type_id = post_info.get("device_type_id", '')
  280. parm = post_info.get('parm', "")
  281. d_id = post_info.get("d_id", '')
  282. if not d_id:
  283. raise PortError('d_id',"参数缺失")
  284. devices = MongoDevice.objects.all()
  285. device_id = devices.get(id=int(d_id)).device_id
  286. payload = ""
  287. topic = ""
  288. if not device_type_id:
  289. raise PortError('device_type_id',"参数缺失")
  290. if int(device_type_id) == 3 or int(device_type_id) == 12:
  291. topic = "/yfkj/cbd/sub/%s"%device_id
  292. payload = {"cmd": cmd}
  293. if cmd == "boot1":
  294. payload = {"cmd":"switch","ext":{"boot":1}}
  295. elif cmd == "boot0":
  296. payload = {"cmd":"switch","ext":{"boot":0}}
  297. elif cmd == "close_shake":
  298. payload = {"cmd": "shake", "ext":{"ws":0}}
  299. elif cmd == "open_shake":
  300. payload = {"cmd": "shake", "ext":{"ws":1}}
  301. elif cmd == "yfwlw":
  302. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  303. elif cmd =="imei":
  304. # 修改imei
  305. imei = post_info.get("imei", '')
  306. payload = {"cmd":"setimei","ext":{"imei":imei}}
  307. elif int(device_type_id) == 2:
  308. topic = "/yfkj/scd/sub/%s" % device_id
  309. if cmd == "clear":
  310. if not parm:
  311. raise PortError('parm',"参数缺失")
  312. payload = {"cmd":"clear","ext":{ "clt":int(parm)}}
  313. elif cmd == "test":
  314. payload = {"cmd":"test"}
  315. elif cmd == "yfwlw": # 平台切换
  316. payload ={"cmd":"paramconf","ext":{"type": "120.27.222.26"}}
  317. elif cmd == "paramconf1": # 标配物联网
  318. payload = {"cmd":"paramconf","ext":{"vt": "uart"}}
  319. elif cmd == "paramconf2": # 物联网自清虫
  320. payload = {"cmd":"paramconf","ext":{"vt": "uart-ZQC"}}
  321. elif cmd == "paramconf3": # 物联网光控
  322. payload = {"cmd":"paramconf","ext":{"vt": "uart-light"}}
  323. elif cmd == "paramconf4": # 物联网光控自清虫
  324. payload = {"cmd":"paramconf","ext":{"vt": "uart-light-ZQC"}}
  325. else:
  326. payload = {"cmd": cmd}
  327. elif int(device_type_id) == 4:
  328. topic = "/yfkj/xycb/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 cmd == "yfwlw":
  344. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  345. elif int(device_type_id) == 8:
  346. topic = "/yfkj/xyv3/s2c/%s" % device_id
  347. payload = {"cmd": cmd}
  348. if cmd == "turnset":
  349. if not parm:
  350. raise PortError('parm',"参数缺失")
  351. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  352. elif cmd == "turn":
  353. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  354. elif cmd == "photoset":
  355. if not parm:
  356. raise PortError('parm', "参数缺失")
  357. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  358. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  359. elif cmd == "repower":
  360. payload = {"cmd": "repower","ext":""}
  361. elif int(device_type_id) == 5:
  362. topic = "/yfkj/qxz/sub/%s" % device_id
  363. payload = {
  364. "cmd": cmd
  365. }
  366. elif int(device_type_id) == 7:
  367. lists = ["update","reboot","poweroff","poweron","coldoff","coldon","dtu_update","dtu_reboot"]
  368. payload = {"cmd": cmd}
  369. if cmd == "takephoto":
  370. payload = {"cmd": "ctrl", "ext": {"type": "takephoto"}}
  371. elif cmd in lists:
  372. payload = {"cmd":cmd}
  373. elif cmd == "autotakephoto":
  374. payload = {"ext":{"type":"auto_takephoto"},"cmd":"ctrl"}
  375. elif cmd == "turn":
  376. payload = {"ext":{"type":"turn"},"cmd":"ctrl"}
  377. elif cmd == "big_data":
  378. # 大数据平台:
  379. payload ={"cmd": "platform", "ext": {"type": "8.136.98.49"}}
  380. elif cmd == "yfwlw":
  381. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  382. elif cmd == "location":
  383. #设置手动定位
  384. lat = post_info.get("lat", '')
  385. lng = post_info.get("lng", '')
  386. payload ={"cmd":"location", "ext":{"lat":lat,"lng":lng,"type":0}}
  387. elif cmd == "imei":
  388. # 修改设备ID:
  389. imei = post_info.get("imei", '')
  390. payload = {"cmd":"setimei","ext":{"imei":imei}}
  391. elif cmd == "photo_num":
  392. num = int(post_info.get("num", ''))
  393. payload = {"cmd":"warn","ext":{"status":num,"type":"get_photo_step"}}
  394. topic = "/yfkj/bzy/s2c/%s" % device_id
  395. elif int(device_type_id) == 9:
  396. topic = "/yfkj/tccbd/sub/%s" % device_id
  397. if cmd == "takephoto":
  398. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  399. elif cmd == "reboot":
  400. payload = {"cmd":"reboot","ext":""}
  401. elif cmd == "update":
  402. payload = {"cmd":"update","ext":""}
  403. elif cmd == "status":
  404. payload = {"cmd": "read", "ext": {"type": "status"}}
  405. elif cmd == "paramconf":
  406. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  407. elif cmd == "boot1":
  408. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  409. elif int(device_type_id) == 14:
  410. topic = "yfkj/color/s2c/%s" % device_id
  411. if cmd == "update":
  412. payload = {"cmd": "dtu_update"}
  413. elif cmd == "reboot":
  414. payload = {"cmd": "dtu_reboot"}
  415. elif cmd =="takephoto":
  416. payload = {"cmd":"rtu_takephoto"}
  417. payload = json.dumps(payload)
  418. data = {"topic":topic,"payload":payload,"qos":1}
  419. logger.warning(f"设备下发的指令:{data}")
  420. response = requests.post(
  421. "%s" % config_dict['mqtt_config']["http"],
  422. json=data,
  423. auth=HTTPBasicAuth(
  424. config_dict['mqtt_config']["user"],
  425. config_dict['mqtt_config']["secret_key"]
  426. )
  427. )
  428. logger.warning(f"设备的返回值:{response}")
  429. response_code = response.status_code
  430. if response_code == 200:
  431. if cmd not in ["takephoto"]:
  432. device_config = MongoDeviceConfig.objects.get(d_id=d_id)
  433. device_config.device_config = str(payload)
  434. device_config.save()
  435. logger.warning(f"修改设备{d_id} 成功: {str(payload)}")
  436. return True
  437. else:
  438. return False