gatewayController.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : Rocky
  4. @Time : 2022/5/9 10:51
  5. @File :gatewayController.py
  6. """
  7. import logging
  8. import time
  9. from django.views.generic.base import View
  10. from AnsjerPush.Config.gatewaySensorConfig import SENSOR_TYPE, EVENT_TYPE
  11. from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info, SceneLog, SmartScene
  12. from Object.ResponseObject import ResponseObject
  13. from Object.utils import LocalDateTimeUtil
  14. from Service.CommonService import CommonService
  15. from Service.EquipmentInfoService import EquipmentInfoService
  16. from Service.GatewayService import GatewayPushService
  17. class GatewayView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.GET, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.POST, operation)
  26. def validation(self, request_dict, operation):
  27. response = ResponseObject()
  28. if operation == 'gatewayPush': # 网关推送
  29. return self.gateway_push(request_dict, response)
  30. elif operation == 'sceneLogPush': # 网关推送
  31. return self.scene_log_push(request_dict, response)
  32. else:
  33. return response.json(414)
  34. @staticmethod
  35. def gateway_push(request_dict, response):
  36. """
  37. 网关推送
  38. @param request_dict: 请求参数
  39. @request_dict serial_number: 序列号
  40. @request_dict ieee_addr: 长地址
  41. @request_dict src_addr: 短地址
  42. @request_dict sensor_type: 传感器类型
  43. @request_dict event_type: 事件类型
  44. @request_dict alarm: 消息内容
  45. @request_dict defense: 防御状态,0:撤防,1:防御
  46. @request_dict sensor_status: 拆动状态,拆动时传参
  47. @request_dict sensor_low_power: 低电量
  48. @param response: 响应对象
  49. @return: response
  50. """
  51. logger = logging.getLogger('info')
  52. serial_number = request_dict.get('serial_number', None)
  53. ieee_addr = request_dict.get('ieee_addr', None)
  54. src_addr = request_dict.get('src_addr', None)
  55. sensor_type = int(request_dict.get('sensor_type', None))
  56. event_type = int(request_dict.get('event_type', None))
  57. alarm = request_dict.get('alarm', None)
  58. defense = int(request_dict.get('defense', None))
  59. sensor_status = request_dict.get('sensor_status', None)
  60. logger.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
  61. if not all([serial_number, ieee_addr, src_addr, sensor_type, event_type, alarm]):
  62. return response.json(444)
  63. n_time = int(time.time())
  64. try:
  65. nickname = serial_number
  66. # 查询子设备表id
  67. gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
  68. device_type=sensor_type, ieee_addr=ieee_addr,
  69. src_addr=src_addr).values('id', 'nickname')
  70. if gateway_sub_device_qs.exists():
  71. gateway_sub_device_id = gateway_sub_device_qs[0]['id']
  72. nickname = gateway_sub_device_qs[0]['nickname']
  73. sensor_record_dict = {
  74. 'gateway_sub_device_id': gateway_sub_device_id,
  75. 'alarm': alarm,
  76. 'event_type': event_type,
  77. 'created_time': n_time,
  78. }
  79. # 处理温湿度
  80. if sensor_type == SENSOR_TYPE['tem_hum_sensor'] and (
  81. event_type == EVENT_TYPE['temperature'] or event_type == EVENT_TYPE['humidity']):
  82. num = request_dict.get('num', None)
  83. num = str(int(num) / 100)
  84. sensor_record_dict['alarm'] = num
  85. if event_type == EVENT_TYPE['temperature']:
  86. alarm += ':' + num + '℃'
  87. else:
  88. alarm += ':' + num + '%'
  89. # 写入传感器记录数据
  90. SensorRecord.objects.create(**sensor_record_dict)
  91. # (门磁,烟雾,人体)传感器被拆动/拆动恢复,修改拆动状态
  92. if sensor_status:
  93. gateway_sub_device_qs.update(is_tampered=1)
  94. elif sensor_type == SENSOR_TYPE['door_magnet'] or sensor_type == SENSOR_TYPE['smoke_sensor'] or \
  95. sensor_type == SENSOR_TYPE['body_sensor']:
  96. gateway_sub_device_qs.update(is_tampered=0)
  97. # 撤防状态不推送
  98. if defense == 0:
  99. return response.json(0)
  100. device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
  101. if not device_info_qs.exists():
  102. return response.json(173)
  103. equipment_info_list = []
  104. for device_info in device_info_qs:
  105. user_id = device_info['userID_id']
  106. # 组织存储数据
  107. local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
  108. equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
  109. local_date_time,
  110. add_time=n_time,
  111. event_time=n_time,
  112. receive_time=n_time,
  113. device_uid=serial_number,
  114. device_nick_name=nickname,
  115. alarm=alarm,
  116. event_type=event_type,
  117. device_user_id=user_id,
  118. ))
  119. if equipment_info_list:
  120. # 根据日期获得星期几
  121. week = LocalDateTimeUtil.date_to_week(local_date_time)
  122. EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
  123. # 查询推送配置数据
  124. gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
  125. values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
  126. 'tz')
  127. if not gateway_push_qs.exists():
  128. continue
  129. kwargs = {
  130. 'n_time': n_time,
  131. 'event_type': event_type,
  132. 'nickname': nickname,
  133. }
  134. # 推送到每台登录账号的手机
  135. for gateway_push in gateway_push_qs:
  136. app_bundle_id = gateway_push['app_bundle_id']
  137. push_type = gateway_push['push_type']
  138. token_val = gateway_push['token_val']
  139. lang = gateway_push['lang']
  140. tz = gateway_push['tz'] if gateway_push['tz'] else 0
  141. # 获取推送所需数据
  142. msg_title = GatewayPushService.get_msg_title(app_bundle_id, nickname)
  143. msg_text = GatewayPushService.get_msg_text(n_time, tz, lang, alarm)
  144. kwargs['msg_title'] = msg_title
  145. kwargs['msg_text'] = msg_text
  146. kwargs['app_bundle_id'] = app_bundle_id
  147. kwargs['token_val'] = token_val
  148. try:
  149. # 推送消息
  150. if push_type == 0: # ios apns
  151. kwargs['launch_image'] = 'https://d2cjxvw3tr9apc.cloudfront.net/app/push_images/智能按钮.228.png'
  152. GatewayPushService.ios_apns_push(**kwargs)
  153. elif push_type == 1: # android gcm
  154. kwargs['message_icon'] = 'https://d2cjxvw3tr9apc.cloudfront.net/app/push_images/智能按钮.228.png'
  155. GatewayPushService.android_fcm_push(**kwargs)
  156. elif push_type == 2: # android 极光推送
  157. GatewayPushService.android_jpush(**kwargs)
  158. except Exception as e:
  159. logger.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  160. continue
  161. return response.json(0)
  162. except Exception as e:
  163. logger.info('---网关推送接口异常--- {}'.format(repr(e)))
  164. return response.json(500, repr(e))
  165. @staticmethod
  166. def scene_log_push(request_dict, response):
  167. """
  168. 网关推送
  169. @param request_dict: 请求参数
  170. @request_dict serial_number: 序列号
  171. @request_dict ieee_addr: 长地址
  172. @request_dict src_addr: 短地址
  173. @request_dict sensor_type: 传感器类型
  174. @request_dict event_type: 事件类型
  175. @request_dict alarm: 消息内容
  176. @param response: 响应对象
  177. @return: response
  178. """
  179. logger = logging.getLogger('info')
  180. scene_id = request_dict.get('sceneId', None)
  181. status = request_dict.get('status', None)
  182. logger.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
  183. if not all([scene_id, status]):
  184. return response.json(444)
  185. smart_scene_qs = SmartScene.objects.filter(id=scene_id).values('scene_name', 'conditions', 'tasks', 'device_id',
  186. 'sub_device_id', 'user_id')
  187. if not smart_scene_qs.exists():
  188. return response.json(174)
  189. nickname = ''
  190. scene_name = smart_scene_qs[0]['scene_name']
  191. tasks = smart_scene_qs[0]['tasks']
  192. device_id = smart_scene_qs[0]['device_id']
  193. sub_device_id = smart_scene_qs[0]['sub_device_id']
  194. n_time = int(time.time())
  195. user_id = smart_scene_qs[0]['user_id']
  196. log_dict = {
  197. 'scene_id': scene_id,
  198. 'scene_name': scene_name,
  199. 'tasks': tasks,
  200. 'status': status,
  201. 'device_id': device_id,
  202. 'sub_device_id': sub_device_id,
  203. 'created_time': n_time,
  204. }
  205. tasks = eval(tasks)
  206. # if sub_device_id:
  207. # sub_device_info_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('device_id', 'nickname')
  208. # nickname = sub_device_info_qs[0]['nickname']
  209. # device_id = sub_device_info_qs[0]['device_id']
  210. #
  211. # device_info_qs = Device_Info.objects.filter(id=device_id).values('userID_id', 'NickName')
  212. # if not device_info_qs.exists():
  213. # return response.json(173)
  214. # if not nickname:
  215. # nickname = device_info_qs[0]['NickName']
  216. #
  217. # user_id = device_info_qs[0]['userID_id']
  218. try:
  219. # 存储日志
  220. # scene_log = {
  221. # 'conditions': conditions,
  222. # 'tasks': tasks
  223. # }
  224. # log_dict['scene_log'] = json.dumps(scene_log)
  225. SceneLog.objects.create(**log_dict)
  226. # 推送日志
  227. gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
  228. values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
  229. 'tz')
  230. if not gateway_push_qs.exists():
  231. return response.json(174)
  232. for task in tasks:
  233. event_type = task['event_type']
  234. if event_type == '1001':
  235. kwargs = {
  236. 'n_time': n_time,
  237. 'event_type': event_type,
  238. 'nickname': nickname,
  239. }
  240. event_info = task['value']
  241. # 推送到每台登录账号的手机
  242. for gateway_push in gateway_push_qs:
  243. app_bundle_id = gateway_push['app_bundle_id']
  244. push_type = gateway_push['push_type']
  245. token_val = gateway_push['token_val']
  246. lang = gateway_push['lang']
  247. tz = gateway_push['tz'] if gateway_push['tz'] else 0
  248. # 获取推送所需数据
  249. # msg_title = GatewayPushService.get_msg_title(app_bundle_id, nickname)
  250. # msg_text = GatewayPushService.get_msg_text(n_time, tz, lang, event_info)
  251. kwargs['msg_title'] = nickname
  252. kwargs['msg_text'] = event_info
  253. kwargs['app_bundle_id'] = app_bundle_id
  254. kwargs['token_val'] = token_val
  255. try:
  256. # 推送消息
  257. if push_type == 0: # ios apns
  258. GatewayPushService.ios_apns_push(**kwargs)
  259. elif push_type == 1: # android gcm
  260. GatewayPushService.android_fcm_push(**kwargs)
  261. elif push_type == 2: # android 极光推送
  262. GatewayPushService.android_jpush(**kwargs)
  263. except Exception as e:
  264. logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  265. continue
  266. return response.json(0)
  267. except Exception as e:
  268. logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
  269. return response.json(500, repr(e))