浏览代码

新增设备上传日志界面接口,封装签名Token函数

locky 3 年之前
父节点
当前提交
d23a460800
共有 3 个文件被更改,包括 136 次插入98 次删除
  1. 91 1
      AdminController/LogManagementController.py
  2. 2 94
      Controller/IotCoreController.py
  3. 43 3
      Service/CommonService.py

+ 91 - 1
AdminController/LogManagementController.py

@@ -9,12 +9,14 @@ import uuid
 import boto3
 import threading
 import logging
+
+import requests
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 
 from Controller.CheckUserData import date_handler
-from Model.models import Device_Info, Role, MenuModel, RequestRecordModel
+from Model.models import Device_Info, Role, MenuModel, RequestRecordModel, iotdeviceInfoModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -49,6 +51,12 @@ class LogManagementView(View):
             userID = tko.userID
             if operation == 'getRequestList':
                 return self.getRequestList(request_dict, response)
+            elif operation == 'getDeviceIotInfoList':
+                return self.getDeviceIotInfoList(request_dict, response)
+            elif operation == 'requestPublishMqtt':
+                return self.requestPublishMqtt(request_dict, response)
+            else:
+                return response.json(404)
 
     def getRequestList(self, request_dict, response):
         pageNo = request_dict.get('pageNo', None)
@@ -96,3 +104,85 @@ class LogManagementView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    def getDeviceIotInfoList(self, request_dict, response):
+        serial_number = request_dict.get('serial_number', None)
+        uid = request_dict.get('uid', None)
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if serial_number or uid:
+                if serial_number:
+                    iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number__contains=serial_number)
+                if uid:
+                    iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid__contains=uid)
+                if not iot_device_info_qs.exists():
+                    return response.json(0)
+                total = len(iot_device_info_qs)
+                iot_device_info_qs = iot_device_info_qs.values('serial_number', 'uid', 'thing_name', 'thing_groups',
+                                                               'add_time', 'update_time')[(page - 1) * line:page * line]
+            else:
+                total = iotdeviceInfoModel.objects.filter().count()
+                iot_device_info_qs = iotdeviceInfoModel.objects.filter().values('serial_number', 'uid', 'thing_name',
+                                                                                'thing_groups', 'add_time', 'update_time')[(page - 1) * line:page * line]
+
+            iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
+            # 获取序列号的uid
+            for iot_device_info in iot_device_info_list:
+                if not iot_device_info['uid']:
+                    device_info_qs = Device_Info.objects.filter(serial_number__contains=iot_device_info['serial_number']).values('UID')
+                    if device_info_qs.exists():
+                        iot_device_info['uid'] = device_info_qs[0]['UID']
+            return response.json(0, {'list': iot_device_info_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def requestPublishMqtt(self, request_dict, response):
+        # 通用发布主题通知
+        uid = request_dict.get('uid', None)
+        msg = request_dict.get('msg', None)
+        thing_name = request_dict.get('thing_name', None)
+        topic_name = request_dict.get('topic_name', None)
+        if not all([uid, msg, thing_name, topic_name]):
+            return response.json(444)
+
+        try:
+            # 设备没被添加不发送
+            device_info_qs = Device_Info.objects.filter(UID=uid).values('UID', 'serial_number')
+            if not device_info_qs.exists():
+                return response.json(10043)
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(thing_name=thing_name).values('endpoint', 'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
+            endpoint = iot[0]['endpoint']
+            Token = iot[0]['token_iot_number']
+
+            # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
+            # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
+            # post请求url发布MQTT消息
+            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
+            authorizer_name = 'Ansjer_Iot_Auth'
+            signature = CommonService.rsa_sign(Token)  # Token签名
+            headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
+                       'x-amz-customauthorizer-signature': signature}
+            msg = eval(msg)
+            r = requests.post(url=url, headers=headers, json=msg, timeout=2)
+            if r.status_code == 200:
+                res = r.json()
+                if res['message'] == 'OK':
+                    return response.json(0)
+                return response.json(10044)
+            else:
+                # print('发布失败')
+                return response.json(10044)
+        except Exception as e:
+            # print(e)
+            return response.json(500, repr(e))

+ 2 - 94
Controller/IotCoreController.py

@@ -242,7 +242,7 @@ class IotCoreView(View):
             return response.json(444)
 
         try:
-            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
+            # 获取设备的物品名后缀
             device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
             if not device_info_qs.exists():
                 return response.json(10043)
@@ -268,60 +268,7 @@ class IotCoreView(View):
             # post请求url来发布MQTT消息
             url = 'https://{}/topics/{}'.format(endpoint, topic_name)
             authorizer_name = 'Ansjer_Iot_Auth'
-            signature = self.rsa_sign(Token)  # Token签名
-            headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
-                       'x-amz-customauthorizer-signature': signature}
-            params = {'command': MSG}
-            r = requests.post(url=url, headers=headers, json=params, timeout=2)
-            if r.status_code == 200:
-                res = r.json()
-                if res['message'] == 'OK':
-                    return response.json(0)
-                return response.json(10044)
-            else:
-                # print('发布失败')
-                return response.json(10044)
-        except Exception as e:
-            # print(e)
-            return response.json(500, repr(e))
-
-    def request_publish_mqtt(self, request_dict, response, request):
-        # 通用发布主题通知
-        UID = request_dict.get('UID', None)
-        MSG = request_dict.get('MSG', None)
-        return_topic_name = request_dict.get('return_topic_name', None)
-        if not all([UID, MSG]):
-            return response.json(444)
-
-        try:
-            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
-            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
-            if not device_info_qs.exists():
-                return response.json(10043)
-            uid = device_info_qs[0]['UID']
-            serial_number = device_info_qs[0]['serial_number']
-            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
-            thing_name_suffix = serial_number if serial_number != '' else uid
-            # 获取数据组织将要请求的url
-            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
-                                                                                                   'endpoint',
-                                                                                                   'token_iot_number')
-            if not iot.exists():
-                return response.json(10043)
-            thing_name = iot[0]['thing_name'][14:]  # IoT core上的物品名: Ansjer_Device_ + 序列号+企业编码/uid
-            endpoint = iot[0]['endpoint']
-            Token = iot[0]['token_iot_number']
-            # Token = '297a601b3925e04daab5a60280650e09'
-            topic_name = thing_name + return_topic_name     # MQTT主题
-            if return_topic_name == 'get_s3_key_return':
-                MSG = self.get_s3_key_return_msg(endpoint)
-
-            # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
-            # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
-            # post请求url来发布MQTT消息
-            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
-            authorizer_name = 'Ansjer_Iot_Auth'
-            signature = self.rsa_sign(Token)  # Token签名
+            signature = CommonService.rsa_sign(Token)  # Token签名
             headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
                        'x-amz-customauthorizer-signature': signature}
             params = {'command': MSG}
@@ -391,42 +338,3 @@ class IotCoreView(View):
         MSG['arn'] = arn
         MSG['region_name'] = region_name
         return MSG
-
-
-    def rsa_sign(self, Token):
-        # 私钥签名Token
-        private_key_file = '''-----BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEA5iJzEDPqtGmFMggekVro6C0lrjuC2BjunGkrFNJWpDYzxCzE
-X5jf4/Fq7hcIaQd5sqHugDxPVollSLPe9zNilbrd0sZfU+Ed8gRVuKW9KwfE9XFr
-L0pt6bKRQ0IIRfiZ9TuR0tsQysvcO1GZSXcYfPue3tGM1zOnWFThWDqZ06+sOxzt
-RMRl4yNfbpCG4MfxG3itNXOfrjZv2OMLSXrxmzubSvRpUYSvQPs4fm9302SAnySY
-0MKzx6H6528ZQm/IDDSZy6EmNBIyTRDfxC56vnYcXvqedAQh7jJnjdvt6Q4MhASH
-eIYi1FBSdu2NT6wgpnrqXzx5pq9kR/lnsLID0wIDAQABAoIBAQCiF4GT1/1oNSpr
-ouxk1PNXFPWFUsVGD8mAwVJmx//eiY7MjfuCmdqYYmI+cFqsH2fIOeYSzGfVO9Dq
-9EYHN1oovAWhf7eFDPpajFMUSyiCNmazub8VAAeKowtNpCTPo9pMsDh1m3aoYA4u
-ebrN0+Sbo16y8kWRDgDAZoiR7DSMs8lczk16hwfv5mw8XpNDbaL3Coi4Koe2S1Yh
-2SX3vWFlpd7qF1ZYXuZIp+b8JPrV7n9eUKoFgzj0gqgwQK80CoexIjiOrNMPvkQa
-q+8kCvFjAzKxOK7e8gjM8lMRiGodb61kmYZkkJzFwWO4EaGbl34lfVECd1Ixp3tF
-be0OWAGBAoGBAPSteXDzzToD8ovM7LL11x0jWwI6HOiHu89kZtW566rIezjWBuA2
-TxrcYKM3h9jQRXS3CsMdoIv6XGk5lqM8ADtjn23FBWe/THYLh8bm8JOgh5RRWQDg
-SvkLfi9Ih2mM4NJfmuuDOh3Nze2efLM7+kOZWUQwF2Zx9mL5jvRBk351AoGBAPDI
-sYmT2Li+i5+0vykA2m5uPF8ZOW8BGtAfCZv0suW7BNzSgin78g9WapRd/4p0NNiL
-/nVMqPPCpd1akCUpV+GDWQt0hV+HZjxANE0KWhciQRyo2qvo51j8SWILJSgh0tXC
-aTF8qt6oGw3VN3m57vKhbrlDaz0J/NDJFci6msAnAoGBAOuG6bXPGijUj+//DYKf
-n7jOxdZ49kboEePrtAncdHzri6IEdI3z+WXT6bpzw/LzWUimwldb96WHFNm9s8Hi
-Ch8hIODbnP5naUTgiIzw1XhmONyPCewL/F+LrqX5XVA/alNX8JrwsUrrR2WLAGLQ
-Q3I69XDsEjptTU2tCO0bCs3ZAoGBAJ2lCHfm0JHET230zONvp5N9oREyVqQSuRdh
-+syc3TQDyh85w/bw+X6JOaaCFHj1tFPC9Iqf8k4GNspCLPXnp54CfR4+38O3xnvU
-HWoDSRC0YKT++IxtJGriYrlKSr2Hx54kdvLriIPW1D+uRW/xCDza7L9nIKMKEvgv
-b4/IfOEpAoGAeKM9Te7T1VzlAkS0CJOwanzwYV/zrex84WuXxlsGgPQ871lTs5AP
-H1QLfLfFXH+UVrCEC2yv4eml/cqFkpB3gE5i4MQ8GPVIOSs5tsIyl8YUA03vdNdB
-GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
------END RSA PRIVATE KEY-----'''
-        # 使用密钥文件方式
-        # private_key_file_path = os.path.join(BASE_DIR, 'static/iotCore/private.pem')#.replace('\\', '/')
-        # private_key_file = open(private_key_file_path, 'r')
-        private_key = ct.load_privatekey(ct.FILETYPE_PEM, private_key_file)
-        signature = ct.sign(private_key, Token.encode('utf8'), 'sha256')
-        signature = encodebytes(signature).decode('utf8').replace('\n', '')
-        # print('signature:', signature)
-        return signature

+ 43 - 3
Service/CommonService.py

@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+# 高复用性函数封装到CommonService类
 import base64
 import datetime
 import time
@@ -10,9 +11,8 @@ from django.core import serializers
 from django.utils import timezone
 from pyipip import IPIPDatabase
 from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET
-
-
-# 复用性且公用较高封装代码在这
+import OpenSSL.crypto as ct
+from base64 import encodebytes
 from Controller.CheckUserData import RandomStr
 from Service.ModelService import ModelService
 
@@ -432,4 +432,44 @@ class CommonService:
     def encode_data_without_salt(content):
         return base64.b64encode(str(content).encode("utf-8")).decode('utf8')
 
+    @staticmethod
+    def rsa_sign(Token):
+        # 私钥签名Token
+        if not Token:
+            return ''
+        private_key_file = '''-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEA5iJzEDPqtGmFMggekVro6C0lrjuC2BjunGkrFNJWpDYzxCzE
+X5jf4/Fq7hcIaQd5sqHugDxPVollSLPe9zNilbrd0sZfU+Ed8gRVuKW9KwfE9XFr
+L0pt6bKRQ0IIRfiZ9TuR0tsQysvcO1GZSXcYfPue3tGM1zOnWFThWDqZ06+sOxzt
+RMRl4yNfbpCG4MfxG3itNXOfrjZv2OMLSXrxmzubSvRpUYSvQPs4fm9302SAnySY
+0MKzx6H6528ZQm/IDDSZy6EmNBIyTRDfxC56vnYcXvqedAQh7jJnjdvt6Q4MhASH
+eIYi1FBSdu2NT6wgpnrqXzx5pq9kR/lnsLID0wIDAQABAoIBAQCiF4GT1/1oNSpr
+ouxk1PNXFPWFUsVGD8mAwVJmx//eiY7MjfuCmdqYYmI+cFqsH2fIOeYSzGfVO9Dq
+9EYHN1oovAWhf7eFDPpajFMUSyiCNmazub8VAAeKowtNpCTPo9pMsDh1m3aoYA4u
+ebrN0+Sbo16y8kWRDgDAZoiR7DSMs8lczk16hwfv5mw8XpNDbaL3Coi4Koe2S1Yh
+2SX3vWFlpd7qF1ZYXuZIp+b8JPrV7n9eUKoFgzj0gqgwQK80CoexIjiOrNMPvkQa
+q+8kCvFjAzKxOK7e8gjM8lMRiGodb61kmYZkkJzFwWO4EaGbl34lfVECd1Ixp3tF
+be0OWAGBAoGBAPSteXDzzToD8ovM7LL11x0jWwI6HOiHu89kZtW566rIezjWBuA2
+TxrcYKM3h9jQRXS3CsMdoIv6XGk5lqM8ADtjn23FBWe/THYLh8bm8JOgh5RRWQDg
+SvkLfi9Ih2mM4NJfmuuDOh3Nze2efLM7+kOZWUQwF2Zx9mL5jvRBk351AoGBAPDI
+sYmT2Li+i5+0vykA2m5uPF8ZOW8BGtAfCZv0suW7BNzSgin78g9WapRd/4p0NNiL
+/nVMqPPCpd1akCUpV+GDWQt0hV+HZjxANE0KWhciQRyo2qvo51j8SWILJSgh0tXC
+aTF8qt6oGw3VN3m57vKhbrlDaz0J/NDJFci6msAnAoGBAOuG6bXPGijUj+//DYKf
+n7jOxdZ49kboEePrtAncdHzri6IEdI3z+WXT6bpzw/LzWUimwldb96WHFNm9s8Hi
+Ch8hIODbnP5naUTgiIzw1XhmONyPCewL/F+LrqX5XVA/alNX8JrwsUrrR2WLAGLQ
+Q3I69XDsEjptTU2tCO0bCs3ZAoGBAJ2lCHfm0JHET230zONvp5N9oREyVqQSuRdh
++syc3TQDyh85w/bw+X6JOaaCFHj1tFPC9Iqf8k4GNspCLPXnp54CfR4+38O3xnvU
+HWoDSRC0YKT++IxtJGriYrlKSr2Hx54kdvLriIPW1D+uRW/xCDza7L9nIKMKEvgv
+b4/IfOEpAoGAeKM9Te7T1VzlAkS0CJOwanzwYV/zrex84WuXxlsGgPQ871lTs5AP
+H1QLfLfFXH+UVrCEC2yv4eml/cqFkpB3gE5i4MQ8GPVIOSs5tsIyl8YUA03vdNdB
+GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
+-----END RSA PRIVATE KEY-----'''
+        # 使用密钥文件方式
+        # private_key_file_path = os.path.join(BASE_DIR, 'static/iotCore/private.pem')#.replace('\\', '/')
+        # private_key_file = open(private_key_file_path, 'r')
+        private_key = ct.load_privatekey(ct.FILETYPE_PEM, private_key_file)
+        signature = ct.sign(private_key, Token.encode('utf8'), 'sha256')
+        signature = encodebytes(signature).decode('utf8').replace('\n', '')
+        # print('signature:', signature)
+        return signature