gatewayController.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2022/5/9 10:51
  4. @Auth : Locky
  5. @File :gatewayController.py
  6. @IDE :PyCharm
  7. """
  8. import logging
  9. import time
  10. from django.views.generic.base import View
  11. from Model.models import UidPushModel, SensorRecord, GatewaySubDevice
  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, request, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.POST, request, operation)
  26. def validation(self, request_dict, request, operation):
  27. response = ResponseObject()
  28. if operation == 'gatewayPush': # 网关推送
  29. return self.gateway_push(request_dict, response)
  30. else:
  31. return response.json(414)
  32. @staticmethod
  33. def gateway_push(request_dict, response):
  34. """
  35. 网关推送
  36. @param request_dict: 请求参数
  37. @request_dict serial_number: 序列号
  38. @request_dict ieee_addr: 长地址
  39. @request_dict src_addr: 短地址
  40. @request_dict sensor_type: 传感器类型
  41. @request_dict event_type: 事件类型
  42. @request_dict alarm: 消息内容
  43. @param response: 响应对象
  44. @return: response
  45. """
  46. logger = logging.getLogger('info')
  47. serial_number = request_dict.get('serial_number', None)
  48. ieee_addr = request_dict.get('ieee_addr', None)
  49. src_addr = request_dict.get('src_addr', None)
  50. sensor_type = request_dict.get('sensor_type', None)
  51. event_type = request_dict.get('event_type', None)
  52. alarm = request_dict.get('alarm', 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. # 查询子设备表id
  59. gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
  60. device_type=sensor_type, ieee_addr=ieee_addr,
  61. src_addr=src_addr).values('id')
  62. if gateway_sub_device_qs.exists():
  63. gateway_sub_device_id = gateway_sub_device_qs[0]['id']
  64. # 写入传感器记录数据
  65. SensorRecord.objects.create(gateway_sub_device_id=gateway_sub_device_id, alarm=alarm,
  66. event_type=event_type, created_time=n_time)
  67. # 查询推送配置数据
  68. uid_push_qs = UidPushModel.objects.filter(uid_set__uid=serial_number, uid_set__detect_status=1). \
  69. values('token_val', 'app_type', 'appBundleId', 'm_code', 'push_type', 'userID_id', 'userID__NickName',
  70. 'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval', 'uid_set__detect_group')
  71. if not uid_push_qs.exists():
  72. return response.json(173)
  73. uid_push_list = [uid_push for uid_push in uid_push_qs]
  74. nickname = uid_push_list[0]['uid_set__nickname']
  75. device_nick_name = nickname if nickname else serial_number
  76. detect_interval = uid_push_list[0]['uid_set__detect_interval']
  77. detect_group = uid_push_list[0]['uid_set__detect_group']
  78. local_date_time = ''
  79. equipment_info_list = []
  80. event_type = int(event_type)
  81. kwargs = {
  82. 'n_time': n_time,
  83. 'event_type': event_type,
  84. 'nickname': device_nick_name,
  85. }
  86. for uid_push in uid_push_list:
  87. device_user_id = uid_push['userID_id']
  88. push_type = uid_push['push_type']
  89. app_bundle_id = uid_push['appBundleId']
  90. token_val = uid_push['token_val']
  91. lang = uid_push['lang']
  92. tz = uid_push['tz'] if uid_push['tz'] else 0
  93. # 获取推送所需数据
  94. msg_title = GatewayPushService.get_msg_title(app_bundle_id, device_nick_name)
  95. msg_text = GatewayPushService.get_msg_text(n_time, tz, lang, alarm)
  96. kwargs['msg_title'] = msg_title
  97. kwargs['msg_text'] = msg_text
  98. kwargs['app_bundle_id'] = app_bundle_id
  99. kwargs['token_val'] = token_val
  100. try:
  101. # 推送消息
  102. if push_type == 0: # ios apns
  103. GatewayPushService.ios_apns_push(**kwargs)
  104. elif push_type == 1: # android gcm
  105. GatewayPushService.android_fcm_push(**kwargs)
  106. elif push_type == 2: # android 极光推送
  107. GatewayPushService.android_jpush(**kwargs)
  108. except Exception as e:
  109. logger.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  110. continue
  111. # 组织存储数据
  112. local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
  113. equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
  114. local_date_time,
  115. add_time=n_time,
  116. event_time=n_time,
  117. receive_time=n_time,
  118. device_uid=serial_number,
  119. device_nick_name=device_nick_name,
  120. alarm=alarm,
  121. event_type=event_type,
  122. device_user_id=device_user_id,
  123. ))
  124. if equipment_info_list:
  125. # 根据日期获得星期几
  126. week = LocalDateTimeUtil.date_to_week(local_date_time)
  127. EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
  128. return response.json(0)
  129. except Exception as e:
  130. logger.info('---网关推送接口异常--- {}'.format(repr(e)))
  131. return response.json(500, repr(e))