send_control.py 16 KB

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