IotCoreController.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 Object.TokenObject import TokenObject
  15. from Service.CommonService import CommonService
  16. class IotCoreView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. request_dict = request.GET
  20. operation = kwargs.get('operation', None)
  21. return self.validate(operation, request_dict, request)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. request_dict = request.POST
  25. operation = kwargs.get('operation', None)
  26. return self.validate(operation, request_dict, request)
  27. def validate(self, operation, request_dict, request):
  28. token = TokenObject(request_dict.get('token', None))
  29. response = ResponseObject()
  30. if operation == 'createKeysAndCertificate':
  31. return self.create_keys_and_certificate(request_dict, response, request)
  32. elif operation == 'thingRegroup':
  33. return self.thing_regroup(request_dict, response, request)
  34. else:
  35. if token.code != 0:
  36. return response.json(token.code)
  37. if operation == 'clearIotCerm':
  38. return self.clear_Iot_Cerm(request_dict, response)
  39. else:
  40. return response.json(404)
  41. # CVM注册 :正使用
  42. def create_keys_and_certificate(self, request_dict, response, request):
  43. serial_number = request_dict.get('serial_number', None)
  44. serial_number_code = request_dict.get('serial_number_code', None)
  45. token = request_dict.get('token', None)
  46. time_stamp = request_dict.get('time_stamp', None)
  47. device_version = request_dict.get('device_version', None).replace('.', '_') # 物品组命名不能包含'.'
  48. language = request_dict.get('language', None)
  49. if serial_number and token and time_stamp and serial_number_code and device_version and language:
  50. serial_number_code = CommonService.decode_data(serial_number_code)
  51. token = int(CommonService.decode_data(token))
  52. time_stamp = int(time_stamp)
  53. now_time = int(time.time())
  54. distance = now_time - time_stamp
  55. thingGroup = device_version + '_' + language
  56. if token != time_stamp or distance > 60000 or distance < -60000 or serial_number != serial_number_code: # 为了全球化时间控制在一天内
  57. return response.json(404)
  58. serial = serial_number[0:6]
  59. iotqs = iotdeviceInfoModel.objects.filter(serial_number__serial_number=serial)
  60. # 判断设备是否已注册证书
  61. if not iotqs.exists():
  62. ip = CommonService.get_ip_address(request)
  63. region_id = Device_Region().get_device_region(ip)
  64. iotClient = IOTClient(region_id)
  65. res = iotClient.create_keys_and_certificate(serial_number, thingGroup)
  66. nowTime = int(time.time())
  67. token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(nowTime)).encode('utf-8')).hexdigest()
  68. sn = SerialNumberModel.objects.get(serial_number=serial)
  69. iotdeviceInfoModel.objects.create(serial_number=sn,
  70. endpoint=res[0]['endpoint'],
  71. certificate_id=res[0]['certificateId'],
  72. certificate_pem=res[0]['certificatePem'],
  73. public_key=res[0]['publicKey'],
  74. private_key=res[0]['privateKey'],
  75. thing_name=res[1]['ThingName'],
  76. token_iot_number=token_iot_number
  77. )
  78. res = {
  79. 'certificateId': res[0]['certificateId'],
  80. 'certificatePem': res[0]['certificatePem'],
  81. 'publicKey': res[0]['publicKey'],
  82. 'privateKey': res[0]['privateKey'],
  83. 'endpoint': res[0]['endpoint']
  84. }
  85. return response.json(0, {'res': res})
  86. else:
  87. iot = iotqs[0]
  88. res = {
  89. 'certificateId': iot.certificate_id,
  90. 'certificatePem': iot.certificate_pem,
  91. 'publicKey': iot.public_key,
  92. 'privateKey': iot.private_key,
  93. 'endpoint': iot.endpoint
  94. }
  95. # print('此设备已注册证书')
  96. return response.json(0, {'res': res})
  97. else:
  98. return response.json(444)
  99. def thing_regroup(self, request_dict, response, request):
  100. # 物品重新分组
  101. token = request_dict.get('token', None)
  102. time_stamp = request_dict.get('time_stamp', None)
  103. serial_number = request_dict.get('serial_number', None)
  104. device_version = request_dict.get('device_version', None)
  105. language = request_dict.get('language', None)
  106. if not all([serial_number, device_version, language, token, time_stamp]):
  107. return response.json(444)
  108. # 封装token认证
  109. token = int(CommonService.decode_data(token))
  110. time_stamp = int(time_stamp)
  111. now_time = int(time.time())
  112. distance = now_time - time_stamp
  113. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  114. return response.json(404)
  115. ip = CommonService.get_ip_address(request)
  116. region_id = Device_Region().get_device_region(ip)
  117. thingName = 'Ansjer_Device_' + serial_number
  118. new_thingGroupName = (device_version + '_' + language).replace('.', '_') # 物品组命名不能包含'.'
  119. # 调试参数
  120. # thingName = 'Ansjer_Device_00EBEX'
  121. # new_thingGroupName = 'C1Pro_V1_0_1_cn'
  122. iotClient = IOTClient(region_id)
  123. try:
  124. # 获取旧物品组
  125. list_groups_res = iotClient.client.list_thing_groups_for_thing(thingName=thingName, maxResults=1)
  126. old_thingGroupName = list_groups_res['thingGroups'][0]['groupName']
  127. # 没有新物品组则创建
  128. list_thing_groups_res = iotClient.client.list_thing_groups(namePrefixFilter=new_thingGroupName
  129. , maxResults=1, recursive=False)
  130. if not list_thing_groups_res['thingGroups']:
  131. attributes = {
  132. "update_time": "0"
  133. }
  134. thingGroupProperties = {
  135. "thingGroupDescription": "OTA",
  136. "attributePayload": {
  137. "attributes": attributes,
  138. "merge": False # 更新时覆盖掉而不是合并
  139. }
  140. }
  141. iotClient.client.create_thing_group(thingGroupName=new_thingGroupName
  142. , thingGroupProperties=thingGroupProperties)
  143. iotClient.client.update_thing_groups_for_thing(thingName=thingName
  144. , thingGroupsToAdd=[new_thingGroupName]
  145. , thingGroupsToRemove=[old_thingGroupName])
  146. # 更新设备版本信息
  147. Device_Info.objects.filter(serial_number=serial_number).update(version=device_version)
  148. return response.json(0)
  149. except Exception as e:
  150. print(e)
  151. return response.json(500, repr(e))
  152. def clear_Iot_Cerm(self, userID, request_dict, response):
  153. serial_number = request_dict.get('serial_number', None)
  154. if serial_number:
  155. iot = iotdeviceInfoModel.objects.filter(thing_name="Ansjer_Device_" + serial_number)
  156. if iot.exists():
  157. iot.delete()
  158. return response.json(0)
  159. else:
  160. return response.json(444)