send_control.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. import requests
  2. import json
  3. from json import JSONDecodeError
  4. from requests.auth import HTTPBasicAuth
  5. from smartfarming.api.views.forecast.all_dict import insect_dict,get_siminfo,get_simsinfo
  6. from kedong.decoration import kedong_deco, PortError
  7. from smartfarming.models.device import MongoDeviceConfig, MongoDevice
  8. @kedong_deco(login_required=True)
  9. def device_control_info(request):
  10. """
  11. 设备控制信息/ 设备操作当前状态
  12. 参数:
  13. d_id 必传 设备自增id
  14. cmd 必传 netconf/paramconf/config/。。。用来标记获取什么类型的配置信息
  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. if MongoDeviceConfig.objects.filter(d_id=d_id,cmd=cmd).exists():
  24. d_config = MongoDeviceConfig.objects.get(d_id=d_id,cmd=cmd)
  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. raise PortError(d_id, "配置未上传")
  36. def user_device_control(request):
  37. """
  38. 用户远程控制设备下发(用于对接)
  39. 参数:
  40. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,7孢子仪 5气象站, 14色诱测报灯 12吸虫塔
  41. device_id 必传 设备号
  42. config 必传 设备控制参数
  43. username 必传 用户名
  44. config 说明:
  45. 测报灯:{'ts': 0, 'tpl': 5, 'tt': 6, 'collt': 10, 'datt': 20, 'htim': 10, 'et': 6, 'st': 20, 'hst': 85, 'tph': 70, 'imgres': 0}
  46. 测报灯拍照:takephoto
  47. }
  48. 具体说明太长 对接口问我要
  49. """
  50. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  51. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  52. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  53. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  54. # myuid = request.myuser.uid
  55. # user_type = request.user_type
  56. post_info = request.POST
  57. username = post_info.get("username")
  58. ip = request.META.get('REMOTE_ADDR')
  59. try:
  60. check_username = DeviceUser.objects.get(real_name=username)
  61. except:
  62. raise PortError('username', "用户名不存在")
  63. if check_username.user_type == 3:
  64. raise PortError('', "控制异常,请联系上级")
  65. device_type_id = post_info.get("device_type_id", '')
  66. device_id = post_info.get("device_id", '')
  67. if not device_id:
  68. raise PortError('device_id',"参数缺失")
  69. devices = Device.objects.all()
  70. try:
  71. device = devices.get(device_id=device_id)
  72. except:
  73. raise PortError("device_id","没有此设备")
  74. if not check_username.user_type == 1 and device.device_expire == "1":
  75. raise PortError("device_id","设备已过期")
  76. config = post_info.get("config", '')
  77. # cmd = post_info.get("cmd", '')
  78. payload = {}
  79. # if work_type == "0":
  80. # payload = {"cmd": "workmode", "ext": {"asleep": "1", "common": "0", "power": "0"}}
  81. # elif work_type == "1":
  82. # payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "1", "power": "0"}}
  83. # elif work_type == "2":
  84. # payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "0", "power": "1"}}
  85. if config:
  86. if config == "takephoto":
  87. payload["cmd"] = "takephoto"
  88. else:
  89. try:
  90. config = json.loads(config)
  91. except JSONDecodeError as e:
  92. config = eval(config)
  93. except:
  94. raise PortError('',"参数类型错误")
  95. payload["cmd"] = "paramconf"
  96. payload["ext"] = config
  97. else:
  98. raise PortError('',"缺少config参数")
  99. topic = ""
  100. if not device_type_id:
  101. raise PortError('device_type_id',"参数缺失")
  102. if int(device_type_id) == 3:
  103. topic = "/yfkj/cbd/sub/%s"%device.device_id
  104. else:
  105. raise PortError('device_type_id',"参数超出范围")
  106. payload = json.dumps(payload)
  107. cmds = {"topic":topic,"payload":payload,"qos":1}
  108. content = "设备类型:%s,下发:%s"
  109. operation_log(check_username.uid, content % (device_type_id, payload), device.device_id, 0, ip)
  110. res = rp(cmds)
  111. if res.status_code == 200:
  112. return True
  113. def user_get_device_config(request):
  114. """
  115. 查询设备配置信息/设备监测最新数据 (用于对接)
  116. 参数:
  117. device_type_id 必传 设备类型 3测报灯
  118. device_id 必传 设备号
  119. control_type 必传 操作类型 data 读取设备数据信息
  120. username 必传 用户名
  121. """
  122. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  123. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  124. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  125. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  126. # uid = request.myuser.uid
  127. # user_type = request.user_type
  128. # if user_type == 3:
  129. # raise PortError('', "控制异常,请联系上级")
  130. post_info = request.POST
  131. device_type_id = post_info.get("device_type_id", '')
  132. device_id = post_info.get("device_id", '')
  133. if not device_id:
  134. raise PortError('device_id', "参数缺失")
  135. username = post_info.get("username")
  136. ip = request.META.get('REMOTE_ADDR')
  137. try:
  138. check_username = DeviceUser.objects.get(real_name=username)
  139. except:
  140. raise PortError('username', "用户名不存在")
  141. devices = Device.objects.all()
  142. device = devices.get(device_id=device_id)
  143. # myuser_type = request.user_type
  144. if not check_username.user_type == 1 and device.device_expire == "1":
  145. raise PortError('', "该设备已到期")
  146. control_type = post_info.get("control_type", '')
  147. if not control_type:
  148. raise PortError('control_type',"参数缺失")
  149. payload = {
  150. "cmd": "read",
  151. "ext":control_type
  152. }
  153. topic = ""
  154. if not device_type_id:
  155. raise PortError('device_type_id', "参数缺失")
  156. if int(device_type_id) == 3:
  157. topic = "/yfkj/cbd/sub/%s" % device.device_id
  158. else:
  159. raise PortError('device_type_id', "参数超出范围")
  160. # elif int(device_type_id) == 2:
  161. # topic = "/yfkj/scd/sub/%s" % device.device_id
  162. # elif int(device_type_id) == 4:
  163. # topic = "/yfkj/xycb/s2c/%s" % device.device_id
  164. # elif int(device_type_id) == 5:
  165. # topic = "/yfkj/qxz/sub/%s" % device.device_id
  166. # payload = {
  167. # "cmd": "read",
  168. # "ext": {"type": control_type}
  169. # }
  170. # elif int(device_type_id) == 7:
  171. # topic = "/yfkj/bzy/s2c/%s" % device.device_id
  172. # elif int(device_type_id) == 9:
  173. # topic = "/yfkj/tccbd/sub/%s" % device.device_id
  174. # elif int(device_type_id) == 14:
  175. # topic = "yfkj/color/s2c/%s" % device.device_id
  176. # payload = {"cmd":"read","ext":"data"}
  177. # elif int(device_type_id) == 8:
  178. # topic = "/yfkj/xyv3/s2c/%s" % device.device_id
  179. cmd = {"topic": topic, "payload": json.dumps(payload), "qos": 1}
  180. res = requests.post("%s"%config_dict['mqtt_config']["http"], json=cmd,
  181. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"], config_dict['mqtt_config']["secret_key"]))
  182. if res.status_code == 200:
  183. return True
  184. else:
  185. return False
  186. @kedong_deco(login_required=True)
  187. def device_control(request):
  188. """
  189. 设备下发控制
  190. 参数:
  191. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,7孢子仪 5气象站, 14色诱测报灯 12吸虫塔
  192. d_id 必传 设备自增id
  193. config 非必传 设备控制参数
  194. work_type 非必传 工作模式时 必传 0节能 1常规 2加强
  195. cmd 非必传 下发服务器配置使用 setnet
  196. device_name 必传 设备名称
  197. config 说明:
  198. 测报灯:{'ts': 0, 'tpl': 5, 'tt': 6, 'collt': 10, 'datt': 20, 'htim': 10, 'et': 6, 'st': 20, 'hst': 85, 'tph': 70, 'imgres': 0}
  199. 孢子仪:{'datt': 0, 'drop_time': 0, 'imgres': 0, 'set_temp': 25, 'coll_time': ['7-9', '10-11', Ellipsis], 'cul_time': 24, 'wind_sw': 0}
  200. 杀虫灯:{'timctrl': 1, 'et': 22, 'st': 20}
  201. 色诱测报灯: {'cmd': 'photoconf','ext': {'start': '18','end': '22','freq': '20'} 下发设置工作时间
  202. }
  203. 具体说明太长 对接口问我要
  204. """
  205. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  206. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  207. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  208. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  209. myuid = request.myuser.uid
  210. user_type = request.user_type
  211. if user_type == 3:
  212. raise PortError('', "控制异常,请联系上级")
  213. post_info = request.POST
  214. device_type_id = post_info.get("device_type_id", '')
  215. d_id = post_info.get("d_id", '')
  216. req = post_info.get("req","")
  217. work_type = post_info.get("work_type", '')
  218. device_name = post_info.get("device_name", '')
  219. if not d_id:
  220. raise PortError('d_id',"参数缺失")
  221. devices = MongoDevice.objects.all()
  222. try:
  223. device = devices.get(id=int(d_id))
  224. except:
  225. raise PortError("d_id","没有此设备")
  226. if not user_type == 1 and device.device_expire == "1":
  227. raise PortError("d_id","设备已过期")
  228. if device_name:
  229. device.device_name = device_name
  230. device.save()
  231. config = post_info.get("config", '')
  232. cmd = post_info.get("cmd", '')
  233. payload = {}
  234. if work_type == "0":
  235. payload = {"cmd": "workmode", "ext": {"asleep": "1", "common": "0", "power": "0"}}
  236. elif work_type == "1":
  237. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "1", "power": "0"}}
  238. elif work_type == "2":
  239. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "0", "power": "1"}}
  240. if config:
  241. try:
  242. config = json.loads(config)
  243. except:
  244. raise PortError('',"参数类型错误")
  245. if not work_type:
  246. if not config:
  247. raise PortError('config', "参数缺失")
  248. payload["cmd"] = "paramconf"
  249. payload["ext"] = config
  250. if req == "ctr_clear":
  251. payload = {"cmd": "ctr_clear"}
  252. topic = ""
  253. if not device_type_id:
  254. raise PortError('device_type_id',"参数缺失")
  255. if int(device_type_id) == 3:
  256. topic = "/yfkj/cbd/sub/%s"%device.device_id
  257. elif int(device_type_id) == 2:
  258. topic = "/yfkj/scd/sub/%s"%device.device_id
  259. elif int(device_type_id) == 4:
  260. topic = "/yfkj/xycb/s2c/%s"%device.device_id
  261. elif int(device_type_id) in [5, 8]:
  262. topic = "/yfkj/qxz/sub/%s"%device.device_id
  263. timeout = config.get("timeout","")
  264. content = config.get("content","")
  265. interval = config.get("interval","")
  266. if content:
  267. payload["cmd"] = "dotled"
  268. payload["ext"] = {
  269. "content":content,
  270. "timeout":timeout,
  271. }
  272. cmds = {"topic": topic, "payload": payload, "qos": 1}
  273. content = "气象站:%s,下发:%s"
  274. rp(cmds)
  275. if interval:
  276. payload["cmd"] = "config"
  277. payload["ext"] = {"interval":interval}
  278. cmds = {"topic": topic, "payload": payload, "qos": 1}
  279. rp(cmds)
  280. return True
  281. elif int(device_type_id) == 7:
  282. topic = "/yfkj/bzy/s2c/%s"%device.device_id
  283. elif int(device_type_id) == 14:
  284. payload = config
  285. topic = "yfkj/color/s2c/%s"%device.device_id
  286. elif int(device_type_id) == 12:
  287. topic = "/yfkj/cbd/sub/%s"%device.device_id
  288. if cmd == "setnet":
  289. ftp = config["ftp"]
  290. mqtt = config["mqtt"]
  291. mqtt["qos"] = 0
  292. payload = {
  293. "cmd":cmd,
  294. "ftp": ftp,
  295. "mqtt": mqtt,
  296. }
  297. payload = json.dumps(payload)
  298. cmds = {"topic":topic,"payload":payload,"qos":1}
  299. content = "设备类型:%s,下发:%s"
  300. # TODO 大数据平台转发
  301. print(cmds)
  302. response_code = 200
  303. if response_code == 200:
  304. return True
  305. @kedong_deco(login_required=True)
  306. def clear_insects_permission(request):
  307. """
  308. 杀虫灯账户是否具有清虫权限
  309. """
  310. uid = request.myuser.uid
  311. data = [0, 0]
  312. return data
  313. def clear_insects(request):
  314. """
  315. 杀虫灯批量一键自清虫
  316. """
  317. uid = request.myuser.uid
  318. myuser = request.myuser
  319. device_query = Device.devices(uid=uid,myuser=myuser)
  320. scd_query = device_query.filter(device_type_id=2)
  321. scd_imei_list = [i.device_id for i in scd_query]
  322. for i in scd_imei_list:
  323. topic = "/yfkj/scd/sub/%s" % i
  324. payload = json.dumps({"cmd": "ctr_clear"})
  325. cmds = {"topic":topic,"payload":payload,"qos":1}
  326. try:
  327. res = rp(cmds)
  328. if res.status_code != 200:
  329. return False
  330. except:
  331. return False
  332. return True
  333. def scd_device_control(request):
  334. """
  335. 杀虫灯批量下发控制接口
  336. 参数:
  337. imei_list 必传 设备imei号 为选中的设备下发
  338. config 必传 设备控制参数
  339. config 说明:
  340. 杀虫灯:{"st":"20","et":"2","ds":"0","ts":"0","tt":"4","dattim":"30","clt":"120"}
  341. 下发成功后返回值:
  342. "data": [],
  343. 下发未成功返回值:
  344. "data": [
  345. "863488050761140" 下发未成功设备号
  346. ],
  347. }
  348. """
  349. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  350. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  351. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  352. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  353. imei_list = request.POST.get("imei_list")
  354. config = request.POST.get("config", '')
  355. uid = request.myuser.uid
  356. myuser = request.myuser
  357. if not config:
  358. raise PortError("config","配置信息未传")
  359. if not imei_list:
  360. raise PortError("imei_list","设备列表未传")
  361. try:
  362. config = json.loads(config)
  363. except:
  364. raise PortError('',"参数类型错误")
  365. data = []
  366. payload = {}
  367. payload["cmd"] = "paramconf"
  368. payload["ext"] = config
  369. payload = json.dumps(payload)
  370. device_ids = json.loads(imei_list)
  371. device_query = Device.devices(uid=uid,myuser=myuser)
  372. scd_query = device_query.filter(device_type_id=2)
  373. scd_list = [i.device_id for i in scd_query]
  374. for i in device_ids:
  375. if i in scd_list:
  376. topic = "/yfkj/scd/sub/%s" % i
  377. cmds = {"topic":topic,"payload":payload,"qos":1}
  378. try:
  379. res = rp(cmds)
  380. if res.status_code == 200:
  381. pass
  382. else:
  383. data.append(i)
  384. except:
  385. data.append(i)
  386. else:
  387. raise PortError('permission error',"%s设备非用户账户下"%i)
  388. return data
  389. @kedong_deco(login_required=True)
  390. def get_device_config(request):
  391. """
  392. 查询设备配置信息/设备监测最新数据 刷新按钮
  393. 参数:
  394. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪 14色诱测报 12吸虫塔
  395. d_id 必传 设备自增id
  396. control_type 必传 操作类型 data 读取设备数据信息/serverconf 读取服务器配置信息
  397. """
  398. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  399. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  400. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  401. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  402. # uid = request.myuser.uid
  403. # user_type = request.user_type
  404. # if user_type == 3:
  405. # raise PortError('', "控制异常,请联系上级")
  406. imei_list = ["866950041980524","866950041980458","866950041975045","866950041941286","866950041941203","866950041980425","866950041941377"]
  407. post_info = request.POST
  408. device_type_id = post_info.get("device_type_id", '')
  409. d_id = post_info.get("d_id", '')
  410. if not d_id:
  411. raise PortError('d_id', "参数缺失")
  412. devices = MongoDevice.objects.all()
  413. device = devices.get(id=int(d_id))
  414. myuser_type = request.user_type
  415. if not myuser_type == 1 and device.device_expire == "1":
  416. raise PortError('', "该设备已到期")
  417. control_type = post_info.get("control_type", '')
  418. if not control_type:
  419. raise PortError('control_type',"参数缺失")
  420. payload = {
  421. "cmd": "read",
  422. "ext":control_type
  423. }
  424. topic = ""
  425. if not device_type_id:
  426. raise PortError('device_type_id', "参数缺失")
  427. if int(device_type_id) == 3 or int(device_type_id) == 12:
  428. topic = "/yfkj/cbd/sub/%s" % device.device_id
  429. elif int(device_type_id) == 2:
  430. topic = "/yfkj/scd/sub/%s" % device.device_id
  431. elif int(device_type_id) == 4:
  432. topic = "/yfkj/xycb/s2c/%s" % device.device_id
  433. elif int(device_type_id) == 5:
  434. topic = "/yfkj/qxz/sub/%s" % device.device_id
  435. payload = {
  436. "cmd": "read",
  437. "ext": {"type": control_type}
  438. }
  439. elif int(device_type_id) == 7:
  440. topic = "/yfkj/bzy/s2c/%s" % device.device_id
  441. elif int(device_type_id) == 9:
  442. topic = "/yfkj/tccbd/sub/%s" % device.device_id
  443. elif int(device_type_id) == 14:
  444. topic = "yfkj/color/s2c/%s" % device.device_id
  445. payload = {"cmd":"read","ext":"data"}
  446. elif int(device_type_id) == 8:
  447. topic = "/yfkj/xyv3/s2c/%s" % device.device_id
  448. if device.device_id in imei_list:
  449. topic = "yfkj/xycb/s2c/%s" % device.device_id
  450. cmd = {"topic": topic, "payload": json.dumps(payload), "qos": 1}
  451. # res = requests.post("http://www.yfzhwlw.com:8080/api/v2/mqtt/publish",
  452. # data=json.dumps(cmd, indent=1), auth=HTTPBasicAuth("admin", "yfkj_6019"))
  453. # else:
  454. # cmd = {"topic": topic, "payload": json.dumps(payload), "qos": 1}
  455. # res = requests.post("%s"%config_dict['mqtt_config']["http"], json=cmd,
  456. # auth=HTTPBasicAuth(config_dict['mqtt_config']["user"], config_dict['mqtt_config']["secret_key"]))
  457. # TODO 暂时处理调用http接口
  458. code = 200
  459. if code == 200:
  460. return True
  461. else:
  462. return False
  463. @kedong_deco(login_required=True)
  464. def admin_device_control(request):
  465. """
  466. 单个按钮管理员操作 设备控制
  467. 参数:
  468. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪, 9糖醋测报灯 14色诱测报灯 8性诱3.0 12吸虫塔
  469. d_id 必传 设备自增id
  470. cmd 必传 设备控制参数 poweroff关机
  471. poweron开机
  472. reboot重启
  473. update升级
  474. coldoff制冷关闭
  475. coldon制冷开启
  476. takephoto拍照
  477. autotakephoto 对焦拍照
  478. boot1 屏幕禁用
  479. boot0 屏幕取消禁用
  480. turnset 设置定时卷粘虫板时间
  481. turn 卷粘虫带/转仓
  482. photoset 拍照时刻
  483. repower 重新上电
  484. data 数据上传
  485. mqttconf mqtt网络配置
  486. close_shake 关闭震动
  487. open_shake 开启震动
  488. clearworm 清网
  489. dtu_reboot 重启
  490. dtu_update 升级
  491. test 杀虫灯一键测试
  492. big_data 平台转换到大数据平台
  493. yfwlw 平台转发到四情平台
  494. location 手动定位,传lat、lng 参数
  495. imei 修改设备号, 传 imei 参数设备号
  496. photo_num 拍照数量 传num 参数 拍照数
  497. parm 非必传 当某些控制操作需要参数限制的时候 必传 (比如设置定时时间10分钟 传 10)
  498. """
  499. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  500. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  501. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  502. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  503. #气象站 下发主题 /yfkj/qxz/sub/+imei
  504. #性诱测报 下发主题 yfkj/color/s2c
  505. post_info = request.POST
  506. cmd = post_info.get("cmd", '')
  507. if not cmd:
  508. raise PortError('cmd', "参数缺失")
  509. device_type_id = post_info.get("device_type_id", '')
  510. parm = post_info.get('parm', "")
  511. d_id = post_info.get("d_id", '')
  512. if not d_id:
  513. raise PortError('d_id',"参数缺失")
  514. devices = MongoDevice.objects.all()
  515. device_id = devices.get(id=int(d_id)).device_id
  516. payload = ""
  517. topic = ""
  518. if not device_type_id:
  519. raise PortError('device_type_id',"参数缺失")
  520. if int(device_type_id) == 3 or int(device_type_id) == 12:
  521. topic = "/yfkj/cbd/sub/%s"%device_id
  522. payload = {"cmd": cmd}
  523. if cmd == "boot1":
  524. payload = {"cmd":"switch","ext":{"boot":1}}
  525. elif cmd == "boot0":
  526. payload = {"cmd":"switch","ext":{"boot":0}}
  527. elif cmd == "close_shake":
  528. payload = {"cmd": "shake", "ext":{"ws":0}}
  529. elif cmd == "open_shake":
  530. payload = {"cmd": "shake", "ext":{"ws":1}}
  531. elif cmd == "yfwlw":
  532. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  533. elif cmd =="imei":
  534. # 修改imei
  535. imei = post_info.get("imei", '')
  536. payload = {"cmd":"setimei","ext":{"imei":imei}}
  537. elif int(device_type_id) == 2:
  538. topic = "/yfkj/scd/sub/%s" % device_id
  539. if cmd == "clear":
  540. if not parm:
  541. raise PortError('parm',"参数缺失")
  542. payload = {"cmd":"clear","ext":{ "clt":int(parm)}}
  543. elif cmd == "test":
  544. payload = {"cmd":"test"}
  545. elif cmd == "yfwlw": # 平台切换
  546. payload ={"cmd":"paramconf","ext":{"type": "120.27.222.26"}}
  547. elif cmd == "paramconf1": # 标配物联网
  548. payload = {"cmd":"paramconf","ext":{"vt": "uart"}}
  549. elif cmd == "paramconf2": # 物联网自清虫
  550. payload = {"cmd":"paramconf","ext":{"vt": "uart-ZQC"}}
  551. elif cmd == "paramconf3": # 物联网光控
  552. payload = {"cmd":"paramconf","ext":{"vt": "uart-light"}}
  553. elif cmd == "paramconf4": # 物联网光控自清虫
  554. payload = {"cmd":"paramconf","ext":{"vt": "uart-light-ZQC"}}
  555. else:
  556. payload = {"cmd": cmd}
  557. elif int(device_type_id) == 4:
  558. topic = "/yfkj/xycb/s2c/%s" % device_id
  559. payload = {"cmd": cmd}
  560. if cmd == "turnset":
  561. if not parm:
  562. raise PortError('parm',"参数缺失")
  563. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  564. elif cmd == "turn":
  565. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  566. elif cmd == "photoset":
  567. if not parm:
  568. raise PortError('parm', "参数缺失")
  569. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  570. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  571. elif cmd == "repower":
  572. payload = {"cmd": "repower","ext":""}
  573. elif cmd == "yfwlw":
  574. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  575. elif int(device_type_id) == 8:
  576. topic = "/yfkj/xyv3/s2c/%s" % device_id
  577. payload = {"cmd": cmd}
  578. if cmd == "turnset":
  579. if not parm:
  580. raise PortError('parm',"参数缺失")
  581. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  582. elif cmd == "turn":
  583. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  584. elif cmd == "photoset":
  585. if not parm:
  586. raise PortError('parm', "参数缺失")
  587. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  588. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  589. elif cmd == "repower":
  590. payload = {"cmd": "repower","ext":""}
  591. elif int(device_type_id) == 5:
  592. topic = "/yfkj/qxz/sub/%s" % device_id
  593. payload = {
  594. "cmd": cmd
  595. }
  596. elif int(device_type_id) == 7:
  597. lists = ["update","reboot","poweroff","poweron","coldoff","coldon","dtu_update","dtu_reboot"]
  598. payload = {"cmd": cmd}
  599. if cmd == "takephoto":
  600. payload = {"cmd": "ctrl", "ext": {"type": "takephoto"}}
  601. elif cmd in lists:
  602. payload = {"cmd":cmd}
  603. elif cmd == "autotakephoto":
  604. payload = {"ext":{"type":"auto_takephoto"},"cmd":"ctrl"}
  605. elif cmd == "turn":
  606. payload = {"ext":{"type":"turn"},"cmd":"ctrl"}
  607. elif cmd == "big_data":
  608. # 大数据平台:
  609. payload ={"cmd": "platform", "ext": {"type": "8.136.98.49"}}
  610. elif cmd == "yfwlw":
  611. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  612. elif cmd == "location":
  613. #设置手动定位
  614. lat = post_info.get("lat", '')
  615. lng = post_info.get("lng", '')
  616. payload ={"cmd":"location", "ext":{"lat":lat,"lng":lng,"type":0}}
  617. elif cmd == "imei":
  618. # 修改设备ID:
  619. imei = post_info.get("imei", '')
  620. payload = {"cmd":"setimei","ext":{"imei":imei}}
  621. elif cmd == "photo_num":
  622. num = int(post_info.get("num", ''))
  623. payload = {"cmd":"warn","ext":{"status":num,"type":"get_photo_step"}}
  624. topic = "/yfkj/bzy/s2c/%s" % device_id
  625. elif int(device_type_id) == 9:
  626. topic = "/yfkj/tccbd/sub/%s" % device_id
  627. if cmd == "takephoto":
  628. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  629. elif cmd == "reboot":
  630. payload = {"cmd":"reboot","ext":""}
  631. elif cmd == "update":
  632. payload = {"cmd":"update","ext":""}
  633. elif cmd == "status":
  634. payload = {"cmd": "read", "ext": {"type": "status"}}
  635. elif cmd == "paramconf":
  636. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  637. elif cmd == "boot1":
  638. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  639. elif int(device_type_id) == 14:
  640. topic = "yfkj/color/s2c/%s" % device_id
  641. if cmd == "update":
  642. payload = {"cmd": "dtu_update"}
  643. elif cmd == "reboot":
  644. payload = {"cmd": "dtu_reboot"}
  645. elif cmd =="takephoto":
  646. payload = {"cmd":"rtu_takephoto"}
  647. payload = json.dumps(payload)
  648. data = {"topic":topic,"payload":payload,"qos":1}
  649. # TODO 调用大数据平台接口
  650. response_code = 200
  651. if response_code == 200:
  652. return True
  653. else:
  654. return False
  655. def tccbd_device_control(request):
  656. """
  657. 糖醋测报单个按钮操作/设备设置
  658. 参数:
  659. device_type_id 必传 设备类型 9 糖醋测报灯
  660. d_id 必传 设备自增id
  661. cmd 必传 设备控制参数 reboot重启
  662. update升级
  663. takephoto拍照
  664. boot1 屏幕禁用
  665. status 查询最新状态
  666. paramconf 查询配置信息
  667. set 下发设置所需参数
  668. st 定时开始时间
  669. et 定时结束时间
  670. collt 收集时间
  671. htim 糖醋液发挥时间
  672. datt 数据上传时间间隔
  673. pump_sec 水泵打开时间
  674. shake_sec 电磁阀打开时间
  675. jp 加液排水时间
  676. """
  677. post_info = request.POST
  678. device_type_id = post_info.get("device_type_id", '')
  679. d_id = post_info.get("d_id", '')
  680. cmd = post_info.get("cmd", '')
  681. devices = Device.objects.all()
  682. device_id = devices.get(id=int(d_id)).device_id
  683. if not cmd:
  684. raise PortError('cmd', "参数缺失")
  685. if int(device_type_id) == 9:
  686. if cmd == "takephoto":
  687. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  688. elif cmd == "reboot":
  689. payload = {"cmd":"reboot","ext":""}
  690. elif cmd == "update":
  691. payload = {"cmd":"update","ext":""}
  692. elif cmd == "status":
  693. payload = {"cmd": "read", "ext": {"type": "status"}}
  694. elif cmd == "paramconf":
  695. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  696. elif cmd == "boot1":
  697. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  698. elif cmd == "set":
  699. st = post_info.get('st') #定时开始时间
  700. et = post_info.get('et')#定时结束时间
  701. collt = post_info.get('collt') #收集时间
  702. htim = post_info.get('htim') #糖醋液发挥时间
  703. datt = post_info.get('datt') #数据上传时间间隔
  704. pump_sec = post_info.get('pump_sec') #pump_sec水泵打开时间
  705. shake_sec = post_info.get('shake_sec') #电磁阀打开时间
  706. jp = post_info.get("jp") # 加液排水时间
  707. payload = {"cmd": "paramconf","ext": {"st": int(st),"et": int(et),"collt": int(collt),"htim": int(htim),"datt": int(datt),"pump_sec": int(pump_sec),"shake_sec": int(shake_sec),"jp":int(jp),"boot": 0}}
  708. topic = "/yfkj/tccbd/sub/%s" % device_id
  709. payload = json.dumps(payload)
  710. data = {"topic":topic,"payload":payload,"qos":1}
  711. res = requests.post("%s" % config_dict['mqtt_config']["http"], json=data,
  712. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"], config_dict['mqtt_config']["secret_key"]))
  713. if res.status_code == 200:
  714. return True
  715. else:
  716. raise PortError('cmd', "设备类型错误")
  717. def device_sim(request):
  718. """
  719. 设备查询sim卡接口
  720. d_id 必传 设备自增id
  721. iccid 非必传 用户填写的iccid
  722. type 必传 sim卡类型 sim hksim 海康sim change修改 iccid
  723. """
  724. post_info = request.POST
  725. _device_id = post_info.get("d_id")
  726. iccid = post_info.get("iccid")
  727. types = post_info.get("type")
  728. if not _device_id:
  729. raise PortError('d_id', "未传设备id")
  730. if iccid and not iccid.isalnum():
  731. # if not iccid.isalnum():
  732. raise PortError('iccid', "不能输入特殊字符")
  733. data = []
  734. try:
  735. device = Device.objects.get(id=_device_id)
  736. except:
  737. raise PortError('d_id', "没有该设备")
  738. if types == "hksim":
  739. data.append({"iccid":device.simid})
  740. elif types == "sim":
  741. if device.device_type_id == 7:
  742. models = BZYData
  743. elif device.device_type_id == 4:
  744. models = XYCBData
  745. elif device.device_type_id == 2:
  746. models = SCDData
  747. elif device.device_type_id == 3:
  748. models = CBDData
  749. elif device.device_type_id == 8:
  750. models = XYThreeData
  751. elif device.device_type_id == 14:
  752. models = SYCBData
  753. elif device.device_type_id == 12:
  754. models = XCTData
  755. else:
  756. raise PortError('d_id', "暂无该设备类型")
  757. # if device.device_type_id == 12:
  758. # models = XCTData
  759. decic = models.objects.filter(device_id=_device_id).order_by('-id')[:1]
  760. # decic = DeviceData.objects.filter(device_id=_device_id).order_by('-addtime')[:1]
  761. for i in decic:
  762. try:
  763. iccid = eval(i.device_data)["iccid"]
  764. except:
  765. iccid = ""
  766. data.append({"iccid":iccid})
  767. elif types == "change":
  768. device.simid = iccid
  769. device.save()
  770. data.append({"iccid":iccid})
  771. else:
  772. raise PortError('d_id', "参数有误")
  773. return data