IotCoreController.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import hashlib
  4. import json
  5. import time
  6. import uuid
  7. import boto3
  8. from django.views import View
  9. from Controller.DeviceConfirmRegion import Device_Region
  10. from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
  11. SerialNumberModel
  12. from Object.IOTCore.IotObject import IOTClient
  13. from Object.ResponseObject import ResponseObject
  14. from Service.CommonService import CommonService
  15. class IotCoreView(View):
  16. def get(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. request_dict = request.GET
  19. operation = kwargs.get('operation', None)
  20. return self.validate(operation, request_dict, request)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. request_dict = request.POST
  24. operation = kwargs.get('operation', None)
  25. return self.validate(operation, request_dict, request)
  26. def validate(self, operation, request_dict, request):
  27. response = ResponseObject()
  28. if operation == 'createKeysAndCertificate':
  29. return self.create_keys_and_certificate(request_dict, response, request)
  30. else:
  31. return response.json(404)
  32. # CVM注册 :正使用
  33. def create_keys_and_certificate(self, request_dict, response, request):
  34. serial_number = request_dict.get('serial_number', None)
  35. serial_number_code = request_dict.get('serial_number_code', None)
  36. token = request_dict.get('token', None)
  37. time_stamp = request_dict.get('time_stamp', None)
  38. device_version = request_dict.get('device_version', None).replace('.', '_') # 物品组命名不能包含'.'
  39. language = request_dict.get('language', None)
  40. if serial_number and token and time_stamp and serial_number_code and device_version and language:
  41. uid_code = CommonService.decode_data(serial_number_code)
  42. token = int(CommonService.decode_data(token))
  43. time_stamp = int(time_stamp)
  44. now_time = int(time.time())
  45. distance = now_time - time_stamp
  46. thingGroup = device_version + '_' + language
  47. # if token != time_stamp and distance > 600: 暂时去掉延时
  48. # if token != time_stamp or serial_number != serial_number_code :
  49. # return response.json(404)
  50. serial = serial_number[0:6]
  51. iotqs = iotdeviceInfoModel.objects.filter(serial_number__serial_number=serial)
  52. # 判断设备是否已注册证书
  53. if not iotqs.exists():
  54. ip = CommonService.get_ip_address(request)
  55. region_id = Device_Region().get_device_region(ip)
  56. iotClient = IOTClient(region_id)
  57. res = iotClient.create_keys_and_certificate(serial, thingGroup)
  58. nowTime = int(time.time())
  59. token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(nowTime)).encode('utf-8')).hexdigest()
  60. sn = SerialNumberModel.objects.get(serial_number=serial)
  61. iotdeviceInfoModel.objects.create(serial_number=sn,
  62. endpoint=res[0]['endpoint'],
  63. certificate_id=res[0]['certificateId'],
  64. certificate_pem=res[0]['certificatePem'],
  65. public_key=res[0]['publicKey'],
  66. private_key=res[0]['privateKey'],
  67. thing_name=res[1]['ThingName'],
  68. token_iot_number=token_iot_number
  69. )
  70. res = {
  71. 'certificateId': res[0]['certificateId'],
  72. 'certificatePem': res[0]['certificatePem'],
  73. 'publicKey': res[0]['publicKey'],
  74. 'privateKey': res[0]['privateKey'],
  75. 'endpoint': res[0]['endpoint']
  76. }
  77. return response.json(0, {'res': res})
  78. else:
  79. iot = iotqs[0]
  80. res = {
  81. 'certificateId': iot.certificate_id,
  82. 'certificatePem': iot.certificate_pem,
  83. 'publicKey': iot.public_key,
  84. 'privateKey': iot.private_key,
  85. 'endpoint': iot.endpoint
  86. }
  87. # print('此设备已注册证书')
  88. return response.json(0, {'res': res})
  89. else:
  90. return response.json(444)