401 lines
15 KiB
Python
Executable File
401 lines
15 KiB
Python
Executable File
import json
|
|
import logging
|
|
from rest_framework.exceptions import ParseError, APIException
|
|
from apps.ecm.service import dispatch_dahua_event, handle_xx_event, loc_change, rail_in, rail_out
|
|
from apps.hrm.services import HrmService
|
|
from apps.third.tapis import dhapis, xxapis, spapis
|
|
from apps.third.errors import TAPI_CODE_WRONG
|
|
from apps.third.dahua import dhClient
|
|
from apps.third.xunxi import xxClient
|
|
from apps.third.speaker import spClient
|
|
from apps.utils.mixins import MyLoggingMixin
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
|
|
from apps.utils.viewsets import CustomGenericViewSet
|
|
from rest_framework.mixins import CreateModelMixin
|
|
from rest_framework.decorators import action
|
|
|
|
from apps.third.serializers import PicSerializer, RequestCommonSerializer
|
|
from rest_framework import serializers
|
|
from django.conf import settings
|
|
from django.conf import settings
|
|
from django.core.cache import cache
|
|
myLogger = logging.getLogger('log')
|
|
# Create your views here.
|
|
|
|
|
|
class DahuaTestView(MyLoggingMixin, APIView):
|
|
"""大华测试接口
|
|
|
|
大华测试接口
|
|
"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
# res = dhClient.face_search(path='/media/2022/07/13/three.jpg')
|
|
res = dhClient.snap(code='1000038$1$0$31')
|
|
return Response(res)
|
|
|
|
|
|
class SpTestView(APIView):
|
|
"""
|
|
音响测试接口
|
|
"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
"""
|
|
音响测试接口
|
|
|
|
音响测试接口
|
|
"""
|
|
# spClient.speak('http://1.203.161.103:2800/media/2022/07/15/alarm2.mp3', ['ls20://0201874E9530'], v_num=2)
|
|
# return Response()
|
|
# params = {"page": 1, "pageSize": 10000}
|
|
# _, res = spClient.request(**spapis['device_list'], params=params)
|
|
_, res = spClient.speak(path='http://192.168.10.249:20309/media/2022/09/01/test.mp3',
|
|
sns=['ls20://020277AA7D06'], v_num=5)
|
|
return Response(res)
|
|
|
|
|
|
class SpeakerViewSet(CustomGenericViewSet):
|
|
"""喇叭视图集
|
|
|
|
喇叭视图集
|
|
"""
|
|
serializer_class = serializers.Serializer
|
|
|
|
@action(methods=['get'], detail=False,
|
|
permission_classes=[IsAuthenticated])
|
|
def headers(self, request, pk=None):
|
|
"""获取headers
|
|
|
|
获取headers
|
|
"""
|
|
return Response({'headers': spClient.headers})
|
|
|
|
|
|
class XxTestView(APIView):
|
|
"""
|
|
寻息测试接口
|
|
"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
json = {
|
|
"railId": "bc0ed1151524490589a9a519685f188f",
|
|
"type": ""
|
|
}
|
|
_, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json)
|
|
return Response(res)
|
|
# ok, res = xxClient.request(
|
|
# url='/api/application/build/buildListV2', json={})
|
|
# if ok == 'success':
|
|
# return Response(res)
|
|
# elif ok == 'fail':
|
|
# raise ParseError(**res)
|
|
# else:
|
|
# raise APIException(**res)
|
|
|
|
# 寻息事件订阅
|
|
|
|
|
|
# class XxListener(stomp.ConnectionListener):
|
|
# def on_error(self, frame):
|
|
# print('received an error "%s"' % frame.body)
|
|
|
|
# def on_message(self, frame):
|
|
# data = json.loads(frame.body)
|
|
# dispatch_xunxi_event(data)
|
|
# print('received a message "%s"' % frame.body)
|
|
|
|
|
|
# if settings.XX_ENABLED:
|
|
# c = stomp.Connection([(settings.XX_MQ_HOST, settings.XX_MQ_PORT)])
|
|
# c.set_listener('', XxListener())
|
|
# c.connect(settings.XX_USERNAME, settings.XX_LICENCE)
|
|
# c.subscribe(settings.XX_QUEUE, id='')
|
|
|
|
|
|
class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
|
|
perms_map = {'post': '*'}
|
|
serializer_class = RequestCommonSerializer
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
"""
|
|
寻息通用调用接口
|
|
|
|
寻息通用调用接口
|
|
"""
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
if vdata.get('code', ''):
|
|
xxapi = xxapis.get(vdata['code'], None)
|
|
if xxapi is None:
|
|
raise ParseError(**TAPI_CODE_WRONG)
|
|
vdata['url'] = xxapi['url']
|
|
vdata['method'] = xxapi['method']
|
|
_, res = xxClient.request(
|
|
url=vdata['url'],
|
|
method=vdata.get('method', 'post'),
|
|
params=vdata.get('params', {}),
|
|
json=vdata.get('json', {}))
|
|
return Response(res)
|
|
|
|
@action(methods=['get'], detail=False,
|
|
permission_classes=[IsAuthenticated])
|
|
def codes(self, request, pk=None):
|
|
"""获取请求短标识
|
|
|
|
获取请求短标识
|
|
"""
|
|
return Response(xxapis)
|
|
|
|
@action(methods=['get'], detail=False,
|
|
permission_classes=[IsAuthenticated])
|
|
def token(self, request, pk=None):
|
|
"""获取token
|
|
|
|
获取token
|
|
"""
|
|
return Response({'token': cache.get('xx_token', '')})
|
|
|
|
@action(methods=['post'], detail=False,
|
|
permission_classes=[IsAdminUser],
|
|
serializer_class=serializers.Serializer)
|
|
def subscribe(self, request, pk=None):
|
|
"""寻息事件一键订阅
|
|
|
|
寻息事件一键订阅
|
|
"""
|
|
xxClient.subscribe('location', '/api/third/xunxi/c_location/')
|
|
xxClient.subscribe('rail', '/api/third/xunxi/c_rail/')
|
|
xxClient.subscribe('oneKeyAlarm', '/api/third/xunxi/c_one_key_alarm/')
|
|
xxClient.subscribe('lowpower', '/api/third/xunxi/c_lowpower/')
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
permission_classes=[IsAdminUser],
|
|
serializer_class=serializers.Serializer)
|
|
def unsubscribe(self, request, pk=None):
|
|
"""取消订阅
|
|
|
|
取消订阅
|
|
"""
|
|
pass
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=[]) # 日志
|
|
def c_location(self, request, pk=None):
|
|
loc_change(data=request.data['data'])
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=['POST']) # 日志
|
|
def c_rail(self, request, pk=None):
|
|
data = request.data
|
|
if data['data']['type'] == 1:
|
|
# 围栏进入
|
|
rail_in(data=data['data'])
|
|
elif data['data']['type'] == 2:
|
|
# 围栏离开
|
|
rail_out(data=data['data'])
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=['POST']) # 日志
|
|
def c_one_key_alarm(self, request, pk=None):
|
|
data = request.data
|
|
if data['data']['event'] == 'alarm':
|
|
handle_xx_event(name='one_key_alarm', data=data['data'])
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=['POST']) # 日志
|
|
def c_lowpower(self, request, pk=None):
|
|
data = request.data
|
|
handle_xx_event(name='low_power', data=data['data'])
|
|
return Response()
|
|
|
|
|
|
class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
|
|
perms_map = {'post': '*'}
|
|
serializer_class = RequestCommonSerializer
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
"""
|
|
大华通用调用接口
|
|
|
|
大华通用调用接口
|
|
"""
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
if vdata.get('code', ''):
|
|
xxapi = dhapis.get(vdata['code'], None)
|
|
if xxapi is None:
|
|
raise ParseError(**TAPI_CODE_WRONG)
|
|
vdata['url'] = xxapi['url']
|
|
vdata['method'] = xxapi['method']
|
|
_, res = dhClient.request(
|
|
url=vdata['url'],
|
|
method=vdata.get('method', 'post'),
|
|
params=vdata.get('params', {}),
|
|
json=vdata.get('json', {}))
|
|
return Response(res)
|
|
|
|
@action(methods=['get'], detail=False,
|
|
permission_classes=[IsAuthenticated])
|
|
def codes(self, request, pk=None):
|
|
"""获取请求短标识
|
|
|
|
获取请求短标识
|
|
"""
|
|
return Response(dhapis)
|
|
|
|
@action(methods=['get'], detail=False,
|
|
permission_classes=[IsAuthenticated])
|
|
def token(self, request, pk=None):
|
|
"""获取token
|
|
|
|
获取token
|
|
"""
|
|
return Response({'token': cache.get('dh_token', '')})
|
|
|
|
@action(methods=['post'], detail=False,
|
|
permission_classes=[IsAuthenticated],
|
|
serializer_class=PicSerializer)
|
|
def full_pic(self, request, pk=None):
|
|
"""获取完整图片地址
|
|
|
|
获取完整图片地址
|
|
"""
|
|
return Response({'url': dhClient.get_full_pic(path=request.data.get('path'))})
|
|
|
|
@action(methods=['post'], detail=False,
|
|
permission_classes=[IsAdminUser],
|
|
serializer_class=serializers.Serializer)
|
|
def subscribe(self, request, pk=None):
|
|
"""事件订阅
|
|
|
|
事件订阅
|
|
"""
|
|
json_data = {
|
|
"param": {
|
|
"monitors": [
|
|
{
|
|
"monitor": settings.BASE_URL + '/api/third/dahua/c_swip/',
|
|
"monitorType": "url",
|
|
"events": [
|
|
{
|
|
"category": "alarm",
|
|
"subscribeAll": 1,
|
|
"domainSubscribe": 2,
|
|
"authorities": [
|
|
{
|
|
"types": ["42", "43", "44", "45", "46", "48", "49", "51", "52", "53",
|
|
"54", "55", "56", "57", "61", "62", "1420", "1425", "1430",
|
|
"1433", "1434", "1435", "1436", "1437", "1438",
|
|
"1439", "1441", "1442", "1443", "1448", "1449",
|
|
"1450", "1455", "1456", "1461", "1462", "1463",
|
|
"1464", "1467", "1468", "1469", "1470", "1471",
|
|
"1472", "1473", "1474", "1475", "1476", "1487",
|
|
"1488", "1489", "1490", "1491", "1492", "1493",
|
|
"1494", "1667", "4603", "4604", "4626", "4627",
|
|
"4632", "4633"]
|
|
}
|
|
]
|
|
},
|
|
]
|
|
},
|
|
{
|
|
"monitor": settings.BASE_URL + '/api/third/dahua/c_monitor/',
|
|
"monitorType": "url",
|
|
"events": [
|
|
{
|
|
"category": "alarm",
|
|
"subscribeAll": 1,
|
|
"domainSubscribe": 2,
|
|
"authorities": [
|
|
{
|
|
"types": ["302", "303", "305", "306", "307", "309", "311", "313", "314", "316",
|
|
"319", "326", "564", "574", "575", "577",
|
|
"578", "586", "587", "594", "596", "597",
|
|
"613", "614", "639", "665", "672", "675",
|
|
"819", "822", "823", "824", "826", "828",
|
|
"861", "873", "881", "882", "888", "962",
|
|
"963", "964", "965", "972", "973", "974",
|
|
"980", "981", "989", "1001000", "1001001",
|
|
"1001003", "1001004", "1001005", "1001006", "1001007", "1001008"]
|
|
}
|
|
]
|
|
},
|
|
]
|
|
}
|
|
],
|
|
"subsystem": {
|
|
"subsystemType": 0,
|
|
"name": settings.DAHUA_SUBSCRIBE,
|
|
"magic": settings.DAHUA_SUBSCRIBE
|
|
}
|
|
}
|
|
}
|
|
dhClient.request(**dhapis['mq_subscribe'], json=json_data)
|
|
return Response()
|
|
|
|
@action(methods=['delete'], detail=False,
|
|
permission_classes=[IsAdminUser],
|
|
serializer_class=serializers.Serializer)
|
|
def unsubscribe(self, request, pk=None):
|
|
"""取消事件订阅
|
|
|
|
取消事件订阅
|
|
"""
|
|
dhClient.request(**dhapis['mq_unsubscribe'],
|
|
params={'name': settings.DAHUA_SUBSCRIBE})
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=['POST']) # 日志
|
|
def c_swip(self, request, pk=None):
|
|
"""门禁事件
|
|
|
|
门禁事件
|
|
"""
|
|
data = request.data
|
|
method = data['method']
|
|
subsystem = data.get('subsystem', None)
|
|
if method == 'alarm.msg' and subsystem == 'evo-accesscontrol':
|
|
HrmService.swipe(data=data)
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[], throttle_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=['POST']) # 日志
|
|
def c_monitor(self, request, pk=None):
|
|
"""监控事件
|
|
|
|
监控事件
|
|
"""
|
|
data = request.data
|
|
dispatch_dahua_event(data=data)
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False,
|
|
authentication_classes=[], permission_classes=[],
|
|
serializer_class=serializers.Serializer, logging_methods=[]) # 日志
|
|
def face_deploy(self, request, pk=None):
|
|
"""人脸库同步到所有智能设备
|
|
|
|
人脸库同步到所有智能设备
|
|
"""
|
|
dhClient.face_deploy()
|
|
return Response()
|