gatewayController.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info
  11. from Object.ResponseObject import ResponseObject
  12. from Object.utils import LocalDateTimeUtil
  13. from Service.CommonService import CommonService
  14. from Service.EquipmentInfoService import EquipmentInfoService
  15. from Service.GatewayService import GatewayPushService
  16. class GatewayView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.GET, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.POST, operation)
  25. def validation(self, request_dict, operation):
  26. response = ResponseObject()
  27. if operation == 'gatewayPush': # 网关推送
  28. return self.gateway_push(request_dict, response)
  29. else:
  30. return response.json(414)
  31. @staticmethod
  32. def gateway_push(request_dict, response):
  33. """
  34. 网关推送
  35. @param request_dict: 请求参数
  36. @request_dict serial_number: 序列号
  37. @request_dict ieee_addr: 长地址
  38. @request_dict src_addr: 短地址
  39. @request_dict sensor_type: 传感器类型
  40. @request_dict event_type: 事件类型
  41. @request_dict alarm: 消息内容
  42. @param response: 响应对象
  43. @return: response
  44. """
  45. logger = logging.getLogger('info')
  46. serial_number = request_dict.get('serial_number', None)
  47. ieee_addr = request_dict.get('ieee_addr', None)
  48. src_addr = request_dict.get('src_addr', None)
  49. sensor_type = int(request_dict.get('sensor_type', None))
  50. event_type = int(request_dict.get('event_type', None))
  51. alarm = request_dict.get('alarm', None)
  52. defense = int(request_dict.get('defense', None))
  53. logger.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
  54. if not all([serial_number, ieee_addr, src_addr, sensor_type, event_type, alarm]):
  55. return response.json(444)
  56. n_time = int(time.time())
  57. try:
  58. nickname = serial_number
  59. # 查询子设备表id
  60. gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
  61. device_type=sensor_type, ieee_addr=ieee_addr,
  62. src_addr=src_addr).values('id', 'nickname')
  63. if gateway_sub_device_qs.exists():
  64. gateway_sub_device_id = gateway_sub_device_qs[0]['id']
  65. nickname = gateway_sub_device_qs[0]['nickname']
  66. # 写入传感器记录数据
  67. SensorRecord.objects.create(gateway_sub_device_id=gateway_sub_device_id, alarm=alarm,
  68. event_type=event_type, created_time=n_time)
  69. # 撤防状态不推送
  70. if defense == 0:
  71. return response.json(0)
  72. device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
  73. if not device_info_qs.exists():
  74. return response.json(173)
  75. local_date_time = ''
  76. equipment_info_list = []
  77. for device_info in device_info_qs:
  78. user_id = device_info['userID_id']
  79. # 查询推送配置数据
  80. gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
  81. values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
  82. 'tz')
  83. if not gateway_push_qs.exists():
  84. continue
  85. kwargs = {
  86. 'n_time': n_time,
  87. 'event_type': event_type,
  88. 'nickname': nickname,
  89. }
  90. user_id = gateway_push_qs[0]['user_id']
  91. app_bundle_id = gateway_push_qs[0]['app_bundle_id']
  92. push_type = gateway_push_qs[0]['push_type']
  93. token_val = gateway_push_qs[0]['token_val']
  94. lang = gateway_push_qs[0]['lang']
  95. tz = gateway_push_qs[0]['tz'] if gateway_push_qs[0]['tz'] else 0
  96. # 获取推送所需数据
  97. msg_title = GatewayPushService.get_msg_title(app_bundle_id, nickname)
  98. msg_text = GatewayPushService.get_msg_text(n_time, tz, lang, alarm)
  99. kwargs['msg_title'] = msg_title
  100. kwargs['msg_text'] = msg_text
  101. kwargs['app_bundle_id'] = app_bundle_id
  102. kwargs['token_val'] = token_val
  103. try:
  104. # 推送消息
  105. if push_type == 0: # ios apns
  106. GatewayPushService.ios_apns_push(**kwargs)
  107. elif push_type == 1: # android gcm
  108. GatewayPushService.android_fcm_push(**kwargs)
  109. elif push_type == 2: # android 极光推送
  110. GatewayPushService.android_jpush(**kwargs)
  111. except Exception as e:
  112. logger.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  113. continue
  114. # 组织存储数据
  115. local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
  116. equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
  117. local_date_time,
  118. add_time=n_time,
  119. event_time=n_time,
  120. receive_time=n_time,
  121. device_uid=serial_number,
  122. device_nick_name=nickname,
  123. alarm=alarm,
  124. event_type=event_type,
  125. device_user_id=user_id,
  126. ))
  127. if equipment_info_list:
  128. # 根据日期获得星期几
  129. week = LocalDateTimeUtil.date_to_week(local_date_time)
  130. EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
  131. return response.json(0)
  132. except Exception as e:
  133. logger.info('---网关推送接口异常--- {}'.format(repr(e)))
  134. return response.json(500, repr(e))