CommonService.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import datetime
  2. import time
  3. from pathlib import Path
  4. from random import Random
  5. import base64
  6. import ipdb
  7. import requests
  8. import OpenSSL.crypto as ct
  9. from base64 import encodebytes
  10. import simplejson as json
  11. from django.core import serializers
  12. from django.utils import timezone
  13. from pyipip import IPIPDatabase
  14. from model.models import iotdeviceInfoModel, UidRtspModel
  15. # 复用性且公用较高封装代码在这
  16. class CommonService:
  17. # 生成随机数
  18. @staticmethod
  19. def encrypt_data(randomlength=8, number=False):
  20. str = ''
  21. if number == False:
  22. characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
  23. 'tUuVvWwXxYyZz0123456789'
  24. else:
  25. characterSet = '0123456789'
  26. length = len(characterSet) - 1
  27. random = Random()
  28. for index in range(randomlength):
  29. str += characterSet[random.randint(0, length)]
  30. return str
  31. # 加密
  32. # @staticmethod
  33. def encrypt_pwd(self, userPwd):
  34. for i in range(1, 4):
  35. if i == 1:
  36. userPwd = self.RandomStr(3, False)+userPwd+self.RandomStr(3, False)
  37. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  38. if i == 2:
  39. userPwd = self.RandomStr(2, False)+str(userPwd)+self.RandomStr(2, False)
  40. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  41. if i == 3:
  42. userPwd = self.RandomStr(1, False)+str(userPwd)+self.RandomStr(1, False)
  43. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  44. return userPwd
  45. # 解密
  46. @staticmethod
  47. def decode_pwd(password):
  48. for i in range(1, 4):
  49. if i == 1:
  50. # 第一次先解密
  51. password = base64.b64decode(password)
  52. password = password.decode('utf-8')
  53. # 截去第一位,最后一位
  54. password = password[1:-1]
  55. if i == 2:
  56. # 第2次先解密
  57. password = base64.b64decode(password)
  58. password = password.decode('utf-8')
  59. # 去前2位,后2位
  60. password = password[2:-2]
  61. if i == 3:
  62. # 第3次先解密
  63. password = base64.b64decode(password)
  64. password = password.decode('utf-8')
  65. # 去前3位,后3位
  66. password = password[3:-3]
  67. return password
  68. # 生成随机字符串
  69. @staticmethod
  70. def RandomStr(randomlength=8, number=False):
  71. str = ''
  72. if number == False:
  73. characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
  74. 'tUuVvWwXxYyZz0123456789'
  75. else:
  76. characterSet = '0123456789'
  77. length = len(characterSet) - 1
  78. random = Random()
  79. for index in range(randomlength):
  80. str += characterSet[random.randint(0, length)]
  81. return str
  82. @staticmethod
  83. def query_serial_with_uid(uid):
  84. # 根据uid查询序列号,存在则返回序列号,否则返uid
  85. uid_qs = UidRtspModel.objects.filter(uid=uid).values('serial_number')
  86. if uid_qs.exists():
  87. serial_number = uid_qs[0]['serial_number']
  88. if serial_number:
  89. return serial_number
  90. return uid
  91. @staticmethod
  92. def req_publish_mqtt_msg(identification_code, topic_name, msg, qos=1):
  93. """
  94. 通用发布MQTT消息函数
  95. @param identification_code: 标识码
  96. @param topic_name: 主题名
  97. @param msg: 消息内容
  98. @param qos: mqtt qos等级
  99. @return: boolean
  100. """
  101. if not all([identification_code, topic_name]):
  102. return False
  103. if identification_code.endswith('11L'):
  104. thing_name = 'LC_' + identification_code
  105. else:
  106. thing_name = 'Ansjer_Device_' + identification_code
  107. try:
  108. # 获取数据组织将要请求的url
  109. iot = iotdeviceInfoModel.objects.filter(
  110. thing_name=thing_name).values(
  111. 'endpoint', 'token_iot_number')
  112. if not iot.exists():
  113. return False
  114. endpoint = iot[0]['endpoint']
  115. Token = iot[0]['token_iot_number']
  116. # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
  117. # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
  118. # post请求url发布MQTT消息
  119. url = 'https://{}/topics/{}?qos={}'.format(endpoint, topic_name, qos)
  120. authorizer_name = 'Ansjer_Iot_Auth'
  121. signature = CommonService.rsa_sign(Token) # Token签名
  122. headers = {
  123. 'x-amz-customauthorizer-name': authorizer_name,
  124. 'Token': Token,
  125. 'x-amz-customauthorizer-signature': signature}
  126. r = requests.post(url=url, headers=headers, json=msg, timeout=2)
  127. if r.status_code == 200:
  128. res = r.json()
  129. if res['message'] == 'OK':
  130. return True
  131. return False
  132. else:
  133. return False
  134. except Exception as e:
  135. return False
  136. @staticmethod
  137. def rsa_sign(Token):
  138. # 私钥签名Token
  139. if not Token:
  140. return ''
  141. private_key_file = '''-----BEGIN RSA PRIVATE KEY-----
  142. MIIEpQIBAAKCAQEA5iJzEDPqtGmFMggekVro6C0lrjuC2BjunGkrFNJWpDYzxCzE
  143. X5jf4/Fq7hcIaQd5sqHugDxPVollSLPe9zNilbrd0sZfU+Ed8gRVuKW9KwfE9XFr
  144. L0pt6bKRQ0IIRfiZ9TuR0tsQysvcO1GZSXcYfPue3tGM1zOnWFThWDqZ06+sOxzt
  145. RMRl4yNfbpCG4MfxG3itNXOfrjZv2OMLSXrxmzubSvRpUYSvQPs4fm9302SAnySY
  146. 0MKzx6H6528ZQm/IDDSZy6EmNBIyTRDfxC56vnYcXvqedAQh7jJnjdvt6Q4MhASH
  147. eIYi1FBSdu2NT6wgpnrqXzx5pq9kR/lnsLID0wIDAQABAoIBAQCiF4GT1/1oNSpr
  148. ouxk1PNXFPWFUsVGD8mAwVJmx//eiY7MjfuCmdqYYmI+cFqsH2fIOeYSzGfVO9Dq
  149. 9EYHN1oovAWhf7eFDPpajFMUSyiCNmazub8VAAeKowtNpCTPo9pMsDh1m3aoYA4u
  150. ebrN0+Sbo16y8kWRDgDAZoiR7DSMs8lczk16hwfv5mw8XpNDbaL3Coi4Koe2S1Yh
  151. 2SX3vWFlpd7qF1ZYXuZIp+b8JPrV7n9eUKoFgzj0gqgwQK80CoexIjiOrNMPvkQa
  152. q+8kCvFjAzKxOK7e8gjM8lMRiGodb61kmYZkkJzFwWO4EaGbl34lfVECd1Ixp3tF
  153. be0OWAGBAoGBAPSteXDzzToD8ovM7LL11x0jWwI6HOiHu89kZtW566rIezjWBuA2
  154. TxrcYKM3h9jQRXS3CsMdoIv6XGk5lqM8ADtjn23FBWe/THYLh8bm8JOgh5RRWQDg
  155. SvkLfi9Ih2mM4NJfmuuDOh3Nze2efLM7+kOZWUQwF2Zx9mL5jvRBk351AoGBAPDI
  156. sYmT2Li+i5+0vykA2m5uPF8ZOW8BGtAfCZv0suW7BNzSgin78g9WapRd/4p0NNiL
  157. /nVMqPPCpd1akCUpV+GDWQt0hV+HZjxANE0KWhciQRyo2qvo51j8SWILJSgh0tXC
  158. aTF8qt6oGw3VN3m57vKhbrlDaz0J/NDJFci6msAnAoGBAOuG6bXPGijUj+//DYKf
  159. n7jOxdZ49kboEePrtAncdHzri6IEdI3z+WXT6bpzw/LzWUimwldb96WHFNm9s8Hi
  160. Ch8hIODbnP5naUTgiIzw1XhmONyPCewL/F+LrqX5XVA/alNX8JrwsUrrR2WLAGLQ
  161. Q3I69XDsEjptTU2tCO0bCs3ZAoGBAJ2lCHfm0JHET230zONvp5N9oREyVqQSuRdh
  162. +syc3TQDyh85w/bw+X6JOaaCFHj1tFPC9Iqf8k4GNspCLPXnp54CfR4+38O3xnvU
  163. HWoDSRC0YKT++IxtJGriYrlKSr2Hx54kdvLriIPW1D+uRW/xCDza7L9nIKMKEvgv
  164. b4/IfOEpAoGAeKM9Te7T1VzlAkS0CJOwanzwYV/zrex84WuXxlsGgPQ871lTs5AP
  165. H1QLfLfFXH+UVrCEC2yv4eml/cqFkpB3gE5i4MQ8GPVIOSs5tsIyl8YUA03vdNdB
  166. GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
  167. -----END RSA PRIVATE KEY-----'''
  168. # 使用密钥文件方式
  169. # private_key_file_path = os.path.join(BASE_DIR, 'static/iotCore/private.pem')#.replace('\\', '/')
  170. # private_key_file = open(private_key_file_path, 'r')
  171. private_key = ct.load_privatekey(ct.FILETYPE_PEM, private_key_file)
  172. signature = ct.sign(private_key, Token.encode('utf8'), 'sha256')
  173. signature = encodebytes(signature).decode('utf8').replace('\n', '')
  174. # print('signature:', signature)
  175. return signature