Explorar o código

Merge branch 'master' of http://47.107.129.126:10080/azserver/AnsjerPush

# Conflicts:
#	Controller/DetectController.py
WuYiPei %!s(int64=5) %!d(string=hai) anos
pai
achega
98d811297d
Modificáronse 5 ficheiros con 259 adicións e 37 borrados
  1. 4 2
      AnsjerPush/urls.py
  2. 34 34
      Controller/DetectController.py
  3. 154 0
      Controller/ShadowController.py
  4. 66 0
      Model/models.py
  5. 1 1
      Object/ETkObject.py

+ 4 - 2
AnsjerPush/urls.py

@@ -15,10 +15,12 @@ Including another URLconf
 """
 from django.contrib import admin
 from django.urls import path
-from Controller import DetectController
+from Controller import DetectController,ShadowController
 
 
 urlpatterns = [
     path('admin/', admin.site.urls),
-    path('notify/push', DetectController.NotificationView.as_view())
+    path('notify/push', DetectController.NotificationView.as_view()),
+    path('deviceShadow/update', ShadowController.update_device_shadow),
+    path('deviceShadow/generateUTK', ShadowController.generate_utk),
 ]

+ 34 - 34
Controller/DetectController.py

@@ -32,6 +32,7 @@ from Service.CommonService import CommonService
 
 
 # http://test.dvema.com/notify/push?uidToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJQMldOR0pSRDJFSEE1RVU5MTExQSJ9.xOCI5lerk8JOs5OcAzunrKCfCrtuPIZ3AnkMmnd-bPY&n_time=1526845794&channel=1&event_type=51&is_st=0
+# http://test.dvema.com/notify/push?etk=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJQMldOR0pSRDJFSEE1RVU5MTExQSJ9.xOCI5lerk8JOs5OcAzunrKCfCrtuPIZ3AnkMmnd-bPY&n_time=1526845794&channel=1&event_type=51&is_st=0
 
 
 # 移动侦测接口
@@ -47,14 +48,15 @@ class NotificationView(View):
     #     # operation = kwargs.get('operation')
     #     return self.validation(request.POST)
 
-    def validation11(self, request_dict):
+    def validation(self, request_dict):
         response = ResponseObject()
         uidToken = request_dict.get('uidToken', None)
+        etk = request_dict.get('etk', None)
         channel = request_dict.get('channel', '1')
         n_time = request_dict.get('n_time', None)
         event_type = request_dict.get('event_type', None)
         is_st = request_dict.get('is_st', None)
-        if not all([uidToken, channel, n_time]):
+        if not all([channel, n_time]):
             return JsonResponse(status=200, data={
                 'code': 444,
                 'msg': 'param is wrong'})
@@ -218,7 +220,7 @@ class NotificationView(View):
         else:
             return JsonResponse(status=200, data={'code': 404, 'msg': 'data is not exist'})
 
-######
+
     def do_jpush(self, request_dict, uaql, response, uid, channel, nickname):
         event_type = request_dict.get('event_type', None)
         n_time = request_dict.get('n_time', None)
@@ -410,39 +412,34 @@ class PushNotificationView(View):
                 return JsonResponse(status=200, data=res_data)
             else:
                 redisObj.set_data(key=pkey, val=1, expire=60)
-            uid_set_qs = UidSetModel.objects.filter(uid=uid, detect_status=1)
-            if uid_set_qs.exists():
-                uid_set_id = uid_set_qs[0].id
-                uid_push_qs = UidPushModel.objects.filter(uid_set__id=uid_set_id). \
-                    values('token_val', 'app_type', 'appBundleId', 'push_type',
-                           'userID_id', 'userID__NickName', 'lang', 'tz')
-                if uid_set_qs.exists():
-                    auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                    bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
-                    self.do_bulk_create_info(uid_push_qs, n_time, channel, event_type, is_st, uid)
-                    if is_st == '0' or is_st == '2':
-                        return JsonResponse(status=200, data={'code': 0, 'msg': 'success'})
-                    elif is_st == '1':
-                        # Endpoint以杭州为例,其它Region请按实际情况填写。
-                        obj = '{uid}/{channel}/{filename}.jpeg'.format(uid=uid, channel=channel, filename=n_time)
+            uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid,uid_set__detect_status=1). \
+                values('token_val', 'app_type', 'appBundleId', 'push_type',
+                       'userID_id', 'userID__NickName', 'lang', 'tz','uid_set__nickname')
+            if uid_push_qs.exists():
+                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
+                self.do_bulk_create_info(uid_push_qs, n_time, channel, event_type, is_st, uid)
+                if is_st == '0' or is_st == '2':
+                    return JsonResponse(status=200, data={'code': 0, 'msg': 'success'})
+                elif is_st == '1':
+                    # Endpoint以杭州为例,其它Region请按实际情况填写。
+                    obj = '{uid}/{channel}/{filename}.jpeg'.format(uid=uid, channel=channel, filename=n_time)
+                    # 设置此签名URL在60秒内有效。
+                    url = bucket.sign_url('PUT', obj, 7200)
+                    res_data = {'code': 0, 'img_push': url, 'msg': 'success'}
+                    return JsonResponse(status=200, data=res_data)
+                elif is_st == '3':
+                    # 人形检测带动图
+                    img_url_list = []
+                    for i in range(int(is_st)):
+                        obj = '{uid}/{channel}/{filename}_{st}.jpeg'. \
+                            format(uid=uid, channel=channel, filename=n_time, st=i)
                         # 设置此签名URL在60秒内有效。
                         url = bucket.sign_url('PUT', obj, 7200)
-                        res_data = {'code': 0, 'img_push': url, 'msg': 'success'}
-                        return JsonResponse(status=200, data=res_data)
-                    elif is_st == '3':
-                        # 人形检测带动图
-                        img_url_list = []
-                        for i in range(int(is_st)):
-                            obj = '{uid}/{channel}/{filename}_{st}.jpeg'. \
-                                format(uid=uid, channel=channel, filename=n_time, st=i)
-                            # 设置此签名URL在60秒内有效。
-                            url = bucket.sign_url('PUT', obj, 7200)
-                            img_url_list.append(url)
-                        res_data = {'code': 0, 'img_url_list': img_url_list, 'msg': 'success'}
-                        return JsonResponse(status=200, data=res_data)
+                        img_url_list.append(url)
+                    res_data = {'code': 0, 'img_url_list': img_url_list, 'msg': 'success'}
+                    return JsonResponse(status=200, data=res_data)
 
-                else:
-                    return JsonResponse(status=200, data={'code': 404, 'msg': 'data is not exist'})
             else:
                 return JsonResponse(status=200, data={'code': 404, 'msg': 'data is not exist'})
         else:
@@ -457,12 +454,15 @@ class PushNotificationView(View):
         for dv in uaqs:
             userID_id = dv["userID_id"]
             if userID_id not in userID_ids:
+                uid_nickname = dv['uid_set__nickname']
+                if not uid_nickname:
+                    uid_nickname = uid
                 add_data = {
                     'userID_id': dv["userID_id"],
                     'eventTime': n_time,
                     'eventType': event_type,
                     'devUid': uid,
-                    'devNickName': uid,
+                    'devNickName': uid_nickname,
                     'Channel': channel,
                     'alarm': 'Motion \tChannel:{channel}'.format(channel=channel),
                     'is_st': int(is_st),

+ 154 - 0
Controller/ShadowController.py

@@ -0,0 +1,154 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerPush
+@software: PyCharm
+@DATE: 2020/2/14 13:54
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: ShadowController.py
+@Contact: chanjunkai@163.com
+"""
+# 测试环境
+# test.shadow.dvema.com
+# 生产环境
+# shadow.dvema.com
+# 设备影子更新
+from Object.ResponseObject import ResponseObject
+from Object.ETkObject import ETkObject
+import time
+from Model.models import Device_Info,UidSetModel
+from Service.CommonService import CommonService
+from django.http import JsonResponse
+from Object.UidTokenObject import UidTokenObject
+
+def generate_utk(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'GET':
+        request_dict = request.GET
+    elif request.method == 'POST':
+        request_dict = request.POST
+    else:
+        return response.json(444,'wrong method')
+    username = request_dict.get('username',None)
+    password = request_dict.get('password',None)
+    uid = request_dict.get('uid',None)
+    if username and password:
+        if username == 'debug_user' and password == 'debug_password':
+            # utko = UidTokenObject()
+            # # right
+            # utko.generate(data={'uid': uid})
+            etkObj = ETkObject(etk='')
+            etk = etkObj.encrypt(uid)
+            return response.json(0, {'etk': etk})
+        else:
+            return response.json(404)
+    else:
+        return response.json(444,'username password')
+
+
+
+def update_device_shadow(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'POST':
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request_dict = request.GET
+    else:
+        return response.json(444)
+    etk = request_dict.get('etk', None)
+    eto = ETkObject(etk)
+    uid = eto.uid
+    if uid:
+        # 重置按钮
+        is_reset = request_dict.get('is_reset', None)
+        # 传1则重置设备信息
+        if is_reset == '1':
+            UidSetModel.objects.filter(uid=uid).delete()
+            # 重置设备,判断设备为已删除
+            Device_Info.objects.filter(UID=uid).update(isExist=2)
+        ucode = request_dict.get('ucode', None)
+        version = request_dict.get('version', None)
+        p2p_region = request_dict.get('p2p_region', None)
+        tz = request_dict.get('tz', None)
+        video_code = request_dict.get('video_code', None)
+        ip = CommonService.get_ip_address(request)
+        channel = request_dict.get('channel', None)
+        cloud_vod = request_dict.get('cloud_vod', None)
+        push_status = request_dict.get('push_status', None)
+        pwd = request_dict.get('pwd', None)
+        resetTime = request_dict.get('resetTime', None)
+
+        us_qs = UidSetModel.objects.filter(uid=uid)
+        # 更新
+        nowTime = int(time.time())
+
+        print('-------')
+        print(resetTime)
+        print('-------')
+
+        if us_qs.exists():
+            update_dict = {
+                'updTime': nowTime,
+                'ip': ip
+            }
+            if channel:
+                update_dict['channel'] = channel
+            if p2p_region:
+                update_dict['p2p_region'] = p2p_region
+            if ucode:
+                update_dict['ucode'] = ucode
+            if version:
+                update_dict['version'] = version
+            if tz:
+                update_dict['tz'] = tz
+            if video_code:
+                update_dict['video'] = video_code
+            if cloud_vod:
+                update_dict['cloud_vod'] = cloud_vod
+            if push_status:
+                update_dict['detect_status'] = push_status
+            if pwd:
+                update_dict['pwd'] = pwd
+            us_qs.update(**update_dict)
+            # 如果推送状态开启,返回推送url
+            data = {}
+
+            return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
+        # 新增
+        else:
+            create_dict = {
+                'uid': uid,
+                'addTime': nowTime,
+                'updTime': nowTime,
+                'ip': ip
+            }
+            if channel:
+                create_dict['channel'] = channel
+            if p2p_region:
+                create_dict['p2p_region'] = p2p_region
+            if ucode:
+                create_dict['ucode'] = ucode
+            if version:
+                create_dict['version'] = version
+            if tz:
+                create_dict['tz'] = tz
+            if video_code:
+                create_dict['video_code'] = video_code
+            if cloud_vod:
+                create_dict['cloud_vod'] = cloud_vod
+            if push_status:
+                create_dict['detect_status'] = push_status
+            if pwd:
+                create_dict['pwd'] = pwd
+            if resetTime:
+                create_dict['resetTime'] = resetTime
+            UidSetModel.objects.create(**create_dict)
+            # 如果推送状态开启,返回推送url
+            return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
+    else:
+        return JsonResponse(status=200, data={'code': 403, 'msg': 'error etk'})

+ 66 - 0
Model/models.py

@@ -200,6 +200,72 @@ class Device_User(AbstractBaseUser):
     def is_staff(self):
         return self.is_superuser
 
+class Device_Info(models.Model):
+    id = models.CharField(blank=True, max_length=32, primary_key=True)
+    userID = models.ForeignKey(Device_User, blank=True, to_field='userID', on_delete=models.CASCADE)
+    NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称')
+    UID = models.CharField(blank=True, max_length=32, verbose_name=u'设备UID', default='')
+    SID = models.CharField(blank=True, max_length=32, verbose_name=u'服务器ID', default='')
+    View_Account = models.CharField(blank=True, max_length=32, verbose_name=u'设备用户名称', default='')
+    View_Password = models.CharField(blank=True, max_length=32, verbose_name=u'设备密码', default='')
+    AudioFormat = models.IntegerField(blank=True, default=1, verbose_name=u'初始化影像')
+    EventNotification = models.IntegerField(blank=True, verbose_name=u'报警类型', default=0)
+    ChannelIndex = models.IntegerField(blank=True, verbose_name=u'通道号', default=0)
+    Online = models.BooleanField(blank=True, default=False, verbose_name=u'设备是否在线')
+    mMonitorIndex = models.IntegerField(blank=True, default=-1)
+    Type = models.IntegerField(blank=True, verbose_name='设备类型')
+    DebugMode = models.IntegerField(blank=True, verbose_name=u'调试模式', default=0)
+    NotificationMode = models.IntegerField(blank=True, verbose_name=u'是否报警', default=0)
+    qvgaLevel = models.BooleanField(blank=True, verbose_name=u'SD与HD画面', default=0,
+                                    help_text=u'0代表:SD、1代表:HD')
+    isShare = models.BooleanField(blank=True, verbose_name=u'共享设备',
+                                  help_text=u'是否为共享获取的设备', default=False)
+    primaryUserID = models.CharField(blank=True, verbose_name='主用户id', max_length=32, default='')
+    primaryMaster = models.CharField(max_length=64, verbose_name=u'主用户名', default='')
+    data_joined = models.DateTimeField(blank=True, verbose_name=u'设备添加时间', auto_now_add=True)
+    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True, null=True)
+
+    ip = models.CharField(blank=True, max_length=20, default='', verbose_name=u'设备区域ip')
+    area = models.CharField(blank=True, max_length=100, default='', verbose_name=u'设备区域area')
+    # ios要求新增字段
+    version = models.CharField(blank=True, max_length=20, default='', verbose_name=u'版本号')
+    SpaceUsable = models.CharField(blank=True, max_length=20, default='', verbose_name=u'可用空间')
+    SpaceSum = models.CharField(blank=True, max_length=20, default='', verbose_name=u'总空间')
+    WIFIName = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线名称')
+    WIFIIP = models.CharField(blank=True, max_length=20, default='', verbose_name=u'无线ip')
+    WIFIPwd = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线密码')
+    isDetector = models.BooleanField(blank=True, verbose_name=u'侦测开关0:关闭,1:开启)', default=False)
+    DetectorRank = models.IntegerField(blank=True, default=0, verbose_name=u'侦测灵敏度 1:低,2:中,3:高4:最高')
+    iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False)
+    MirrorType = models.IntegerField(blank=True, default=0, verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像')
+    RecordType = models.IntegerField(blank=True, default=0, verbose_name=u'录像模式(0:关闭,1:全是录像,3:报警录像)')
+    TimeZone = models.CharField(blank=True, max_length=50, default='', verbose_name=u'时区')
+    isVod = models.SmallIntegerField(blank=True, default=0, verbose_name='是否支持云存')  # 是否支持云存设备
+    isExist = models.SmallIntegerField(blank=True, default=1, verbose_name='是否被删除')  # 是否被删除了(需主用户交互) 1存在,0不存在,2设备被重置
+    ###
+    REQUIRED_FIELDS = []
+
+    def __str__(self):
+        return self.NickName
+
+    def model_to_dict(self, fields=None, exclude=None):
+        opts = self._meta
+        data = {}
+        for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
+            if not getattr(f, 'editable', False):
+                continue
+            if fields and f.name not in fields:
+                continue
+            if exclude and f.name in exclude:
+                continue
+            data[f.name] = f.value_from_object(self)
+        return data
+
+    class Meta:
+        db_table = 'device_info'
+        ordering = ('-data_joined',)
+        verbose_name = u'用户设备信息表'
+        verbose_name_plural = verbose_name
 
 class Equipment_Info(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')

+ 1 - 1
Object/ETkObject.py

@@ -62,7 +62,7 @@ class ETkObject(object):
 # print('encode_data:')
 # print(PP)
 # print('decode_data:')
-# eobj = ETkObject(etk=PP)
+# eobj = ETkObject(etk='T1dha3hDUkZOVk9UVTBOMDVVVWxOTlJqRXhNVUU9U2w=')
 # uid = eobj.uid
 # print(uid)