IotCoreController.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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)
  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. try:
  70. sn = SerialNumberModel.objects.get(serial_number=serial)
  71. except:
  72. return response.json(444)
  73. iotdeviceInfoModel.objects.create(serial_number=serial,
  74. endpoint=res[0]['endpoint'],
  75. certificate_id=res[0]['certificateId'],
  76. certificate_pem=res[0]['certificatePem'],
  77. public_key=res[0]['publicKey'],
  78. private_key=res[0]['privateKey'],
  79. thing_name=res[1]['ThingName'],
  80. token_iot_number=token_iot_number
  81. )
  82. res = {
  83. 'certificateId': res[0]['certificateId'],
  84. 'certificatePem': res[0]['certificatePem'],
  85. 'publicKey': res[0]['publicKey'],
  86. 'privateKey': res[0]['privateKey'],
  87. 'endpoint': res[0]['endpoint']
  88. }
  89. return response.json(0, {'res': res})
  90. else:
  91. iot = iotqs[0]
  92. res = {
  93. 'certificateId': iot.certificate_id,
  94. 'certificatePem': iot.certificate_pem,
  95. 'publicKey': iot.public_key,
  96. 'privateKey': iot.private_key,
  97. 'endpoint': iot.endpoint
  98. }
  99. # print('此设备已注册证书')
  100. return response.json(0, {'res': res})
  101. else:
  102. return response.json(444)
  103. def thing_regroup(self, request_dict, response, request):
  104. # 物品重新分组
  105. token = request_dict.get('token', None)
  106. time_stamp = request_dict.get('time_stamp', None)
  107. serial_number = request_dict.get('serial_number', None)
  108. device_version = request_dict.get('device_version', None)
  109. language = request_dict.get('language', None)
  110. if not all([serial_number, device_version, language, token, time_stamp]):
  111. return response.json(444)
  112. # 封装token认证
  113. token = int(CommonService.decode_data(token))
  114. time_stamp = int(time_stamp)
  115. now_time = int(time.time())
  116. distance = now_time - time_stamp
  117. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  118. return response.json(404)
  119. ip = CommonService.get_ip_address(request)
  120. region_id = Device_Region().get_device_region(ip)
  121. thingName = 'Ansjer_Device_' + serial_number
  122. new_thingGroupName = (device_version + '_' + language).replace('.', '_') # 物品组命名不能包含'.'
  123. # 调试参数
  124. # thingName = 'Ansjer_Device_00EBEX'
  125. # new_thingGroupName = 'C1Pro_V1_0_1_cn'
  126. iotClient = IOTClient(region_id)
  127. try:
  128. # 获取旧物品组
  129. list_groups_res = iotClient.client.list_thing_groups_for_thing(thingName=thingName, maxResults=1)
  130. old_thingGroupName = list_groups_res['thingGroups'][0]['groupName']
  131. # 没有新物品组则创建
  132. list_thing_groups_res = iotClient.client.list_thing_groups(namePrefixFilter=new_thingGroupName
  133. , maxResults=1, recursive=False)
  134. if not list_thing_groups_res['thingGroups']:
  135. attributes = {
  136. "update_time": "0"
  137. }
  138. thingGroupProperties = {
  139. "thingGroupDescription": "OTA",
  140. "attributePayload": {
  141. "attributes": attributes,
  142. "merge": False # 更新时覆盖掉而不是合并
  143. }
  144. }
  145. iotClient.client.create_thing_group(thingGroupName=new_thingGroupName
  146. , thingGroupProperties=thingGroupProperties)
  147. iotClient.client.update_thing_groups_for_thing(thingName=thingName
  148. , thingGroupsToAdd=[new_thingGroupName]
  149. , thingGroupsToRemove=[old_thingGroupName])
  150. # 更新设备版本信息
  151. Device_Info.objects.filter(serial_number=serial_number).update(version=device_version)
  152. return response.json(0)
  153. except Exception as e:
  154. print(e)
  155. return response.json(500, repr(e))
  156. def clear_Iot_Cerm(self, userID, request_dict, response):
  157. serial_number = request_dict.get('serial_number', None)
  158. if serial_number:
  159. iot = iotdeviceInfoModel.objects.filter(thing_name="Ansjer_Device_" + serial_number)
  160. if iot.exists():
  161. iot.delete()
  162. return response.json(0)
  163. else:
  164. return response.json(444)