|
@@ -24,12 +24,13 @@ from urllib.parse import urlencode
|
|
|
import subprocess
|
|
|
import uuid
|
|
|
# from gevent.pool import Pool
|
|
|
-from model.models import UserModel, UidRtspModel, AlexaAuthModel, UserCountModel
|
|
|
+from model.models import UserModel, UidRtspModel, AlexaAuthModel, UserCountModel, SwitchModel
|
|
|
from object.ResponseObject import ResponseObject
|
|
|
from object.tkObject import tkObject
|
|
|
from service.CommonService import CommonService
|
|
|
from object.RedisObject import RedisObject
|
|
|
from azoauth.config import *
|
|
|
+from datetime import datetime
|
|
|
|
|
|
|
|
|
class authView(TemplateView):
|
|
@@ -149,7 +150,7 @@ class loginHandleView(TemplateView):
|
|
|
user_qs.update(code=code, updTime=nowTime)
|
|
|
else:
|
|
|
UserModel.objects.create(userID=userID, code=code, addTime=nowTime, updTime=nowTime)
|
|
|
- year_month = str(time.strftime('%Y%m', time.localtime(nowTime))) # 获取当前年月
|
|
|
+ year_month = str(time.strftime('%Y%m', time.localtime(nowTime))) # 获取当前年月
|
|
|
user_count_qs = UserCountModel.objects.filter(skill_name=skill_name, year_month=year_month).values('amount')
|
|
|
if not user_count_qs.exists():
|
|
|
UserCountModel.objects.create(skill_name=skill_name, year_month=year_month, amount=1)
|
|
@@ -288,7 +289,7 @@ class oa2RtspStartView(TemplateView):
|
|
|
command = "./pushtool {UID} {PWD} {MSG} 1 {channel}".format(UID=UID, PWD=PWD, MSG=MSG, channel=channel)
|
|
|
# 请求MQTT发布消息
|
|
|
url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX)
|
|
|
- requests_data = {'UID': UID, 'rtsp': MSG, 'enable': '1'} # 1: 开始推流,0: 停止推流; channel: 推流通道
|
|
|
+ requests_data = {'UID': UID, 'rtsp': MSG, 'enable': '1'} # 1: 开始推流,0: 停止推流; channel: 推流通道
|
|
|
r = requests.post(url, requests_data)
|
|
|
if r.status_code == 200:
|
|
|
res = r.json()
|
|
@@ -308,12 +309,12 @@ class oa2RtspStartView(TemplateView):
|
|
|
self.runSendRtspMsg(logger, region, command)
|
|
|
else:
|
|
|
self.runSendRtspMsg(logger, region, command)
|
|
|
- else: # 使用pushtool通知设备推流
|
|
|
+ else: # 使用pushtool通知设备推流
|
|
|
self.runSendRtspMsg(logger, region, command)
|
|
|
|
|
|
# 拉流地址
|
|
|
rtsp_uri = '{}://{}:443/{}'.format(RTSP_PREFIX, RESP_SERVER_DOMAIN, stream_name)
|
|
|
- stop_time = int(time.time()) + 2*60
|
|
|
+ stop_time = int(time.time()) + 2 * 60
|
|
|
expirationTime = time.strftime('%Y-%m-%dT%H:%MZ', time.localtime(stop_time))
|
|
|
|
|
|
res_json = {
|
|
@@ -364,7 +365,7 @@ class oa2RtspStartView(TemplateView):
|
|
|
communicate(timeout=2)
|
|
|
logger.info('back: {}'.format(str(back[0].decode()) + str(back[1].decode())))
|
|
|
except Exception as e:
|
|
|
- self.runSendRtspMsg(logger, 'CN', command) #调用失败时尝试用国内的发送
|
|
|
+ self.runSendRtspMsg(logger, 'CN', command) # 调用失败时尝试用国内的发送
|
|
|
logger.info('调用pushtool异常: {}'.format(repr(e)))
|
|
|
|
|
|
def runSendStop(self, UID, PWD, MSG):
|
|
@@ -409,7 +410,7 @@ class oa2DiscoveryDevice(TemplateView):
|
|
|
userID = user.userID
|
|
|
logger.info('userID: {}'.format(userID))
|
|
|
|
|
|
- #更新事件网关接口
|
|
|
+ # 更新事件网关接口
|
|
|
alexAuth = AlexaAuthModel.objects.filter(token=access_token).order_by('-addTime')
|
|
|
if alexAuth.exists():
|
|
|
auth_res = alexAuth.values()
|
|
@@ -442,7 +443,7 @@ class oa2DiscoveryDevice(TemplateView):
|
|
|
res_json = res.json()
|
|
|
logger.info('正式服务器响应: {}'.format(res_json))
|
|
|
|
|
|
- test_flag = False # 用来区分测试服务器,后面删掉
|
|
|
+ test_flag = False # 用来区分测试服务器,后面删掉
|
|
|
# 添加测试服务器测试
|
|
|
if res_json['result_code'] != 0:
|
|
|
auth_request_url = '{}/oalexa/discoveryuid'.format(SERVER_PREFIX_TEST)
|
|
@@ -508,14 +509,116 @@ class oa2DiscoveryDevice(TemplateView):
|
|
|
logger.info('搜索设备返回值: {}'.format(res_json))
|
|
|
return JsonResponse(res_json, safe=False)
|
|
|
|
|
|
-#新增
|
|
|
+
|
|
|
+class oa2DiscoverySwitch(TemplateView):
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.POST
|
|
|
+ return self.validate(request_dict)
|
|
|
+
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.GET
|
|
|
+ return self.validate(request_dict)
|
|
|
+
|
|
|
+ def validate(self, request_dict):
|
|
|
+ # 增加对code和client_id的校验代码,返回access_token和refresh_token
|
|
|
+ skill_name = request_dict.get("skill_name", 'loocam')
|
|
|
+ access_token = request_dict.get("access_token", None)
|
|
|
+
|
|
|
+ logger = logging.getLogger('django')
|
|
|
+ logger.info('--------{} 开始搜索设备--------'.format(skill_name))
|
|
|
+
|
|
|
+ user_qs = UserModel.objects.filter(access_token=access_token)
|
|
|
+ if not user_qs.exists():
|
|
|
+ return JsonResponse({'错误': '用户数据不存在'})
|
|
|
+
|
|
|
+ response = ResObject()
|
|
|
+ user = user_qs.first()
|
|
|
+ userID = user.userID
|
|
|
+ logger.info('userID: {}'.format(userID))
|
|
|
+
|
|
|
+ # 更新事件网关接口
|
|
|
+ alexAuth = AlexaAuthModel.objects.filter(token=access_token).order_by('-addTime')
|
|
|
+ if alexAuth.exists():
|
|
|
+ auth_res = alexAuth.values()
|
|
|
+ event_access_token = auth_res[0]['access_token']
|
|
|
+ event_refresh_token = auth_res[0]['refresh_token']
|
|
|
+ event_token = auth_res[0]['token']
|
|
|
+ event_expiresTime = auth_res[0]['expiresTime']
|
|
|
+ event_addTime = auth_res[0]['addTime']
|
|
|
+ event_updTime = auth_res[0]['updTime']
|
|
|
+ event_alexa_region = auth_res[0]['alexa_region']
|
|
|
+ AlexaAuthModel.objects.filter(userID=userID).delete()
|
|
|
+ alexAuth.delete()
|
|
|
+ logger.info('update_event_access_token')
|
|
|
+ logger.info(event_token)
|
|
|
+ AlexaAuthModel.objects.create(
|
|
|
+ userID=userID,
|
|
|
+ access_token=event_access_token,
|
|
|
+ refresh_token=event_refresh_token,
|
|
|
+ token=event_token,
|
|
|
+ expiresTime=event_expiresTime,
|
|
|
+ addTime=event_addTime,
|
|
|
+ updTime=event_updTime,
|
|
|
+ alexa_region=event_alexa_region,
|
|
|
+ skill_name=skill_name,
|
|
|
+ )
|
|
|
+
|
|
|
+ auth_request_url = '{}/oalexa/discoveryswitch'.format(SERVER_PREFIX)
|
|
|
+ requests_data = {'sid': 'admin', 'sst': 'admin', 'alexa_user_id': userID}
|
|
|
+ res = requests.post(url=auth_request_url, data=requests_data)
|
|
|
+ res_json = res.json()
|
|
|
+ logger.info('正式服务器响应: {}'.format(res_json))
|
|
|
+
|
|
|
+ test_flag = False # 用来区分测试服务器,后面删掉
|
|
|
+ # 添加测试服务器测试
|
|
|
+ if res_json['result_code'] != 0:
|
|
|
+ auth_request_url = '{}/oalexa/discoveryswitch'.format(SERVER_PREFIX_TEST)
|
|
|
+ res = requests.post(url=auth_request_url, data=requests_data)
|
|
|
+ res_json = res.json()
|
|
|
+ test_flag = True
|
|
|
+
|
|
|
+ logger.info('请求服务器url: {}'.format(auth_request_url))
|
|
|
+ logger.info('服务器响应: {}'.format(res_json))
|
|
|
+
|
|
|
+ if res_json['result_code'] != 0:
|
|
|
+ return response.json(0, res={'msg': 'error'})
|
|
|
+
|
|
|
+ switch_list = res_json['result']['switch_list']
|
|
|
+ now_time = int(time.time())
|
|
|
+ res_json = []
|
|
|
+ for switch in switch_list:
|
|
|
+ serial_number = switch['serial_number']
|
|
|
+ nick = switch['nick']
|
|
|
+ region = 'EU' if switch['region'] == 'EU' else 'EN'
|
|
|
+ switch_info_qs = SwitchModel.objects.filter(serial_number=serial_number, userID=userID)
|
|
|
+ if switch_info_qs.exists():
|
|
|
+ switch_info_qs.update(nick=nick, region=region, updTime=now_time)
|
|
|
+ else:
|
|
|
+ SwitchModel.objects.create(serial_number=serial_number, nick=nick, region=region, addTime=now_time,
|
|
|
+ updTime=now_time, userID=userID)
|
|
|
+ ur_data = {
|
|
|
+ 'endpointId': serial_number,
|
|
|
+ 'friendlyName': nick,
|
|
|
+ 'manufacturerName': skill_name,
|
|
|
+ 'description': 'Camera connected via {}'.format(skill_name),
|
|
|
+ 'modelName': 'P1425-LE',
|
|
|
+ 'manufacturerId': 'zosi-ACCC8E5E7513',
|
|
|
+ }
|
|
|
+ res_json.append(ur_data)
|
|
|
+ logger.info('搜索设备返回值: {}'.format(res_json))
|
|
|
+ return JsonResponse(res_json, safe=False)
|
|
|
+
|
|
|
+
|
|
|
+# 新增
|
|
|
def testRunSendStop(request):
|
|
|
request.encoding = 'utf-8'
|
|
|
if request.method == 'GET':
|
|
|
request_dict = request.GET
|
|
|
- UID=request_dict.get('UID', None)
|
|
|
- PWD=request_dict.get('PWD', None)
|
|
|
- MSG=request_dict.get('MSG', None)
|
|
|
+ UID = request_dict.get('UID', None)
|
|
|
+ PWD = request_dict.get('PWD', None)
|
|
|
+ MSG = request_dict.get('MSG', None)
|
|
|
command = "./pushtool {UID} {PWD} {MSG} 0".format(UID=UID, PWD=PWD, MSG=MSG)
|
|
|
print('command=>{command}'.format(command=command))
|
|
|
try:
|
|
@@ -528,45 +631,46 @@ def testRunSendStop(request):
|
|
|
print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
|
|
|
return JsonResponse({'msg': 'stop Stream', 'code': 0})
|
|
|
|
|
|
-from datetime import datetime
|
|
|
+
|
|
|
def testRunStream(request):
|
|
|
request.encoding = 'utf-8'
|
|
|
if request.method == 'GET':
|
|
|
request_dict = request.GET
|
|
|
- UID=request_dict.get('UID', None)
|
|
|
- PWD=request_dict.get('PWD', None)
|
|
|
- MSG=request_dict.get('MSG', None)
|
|
|
- time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
+ UID = request_dict.get('UID', None)
|
|
|
+ PWD = request_dict.get('PWD', None)
|
|
|
+ MSG = request_dict.get('MSG', None)
|
|
|
+ time1 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG)
|
|
|
print('command=>{command}'.format(command=command))
|
|
|
try:
|
|
|
back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
|
|
|
communicate(timeout=10)
|
|
|
- time2=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
+ time2 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
# print("时间:%s"%datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
|
|
|
except Exception as e:
|
|
|
return repr(e)
|
|
|
else:
|
|
|
print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节
|
|
|
print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
|
|
|
- #return str(back[0].decode()) + str(back[1].decode())
|
|
|
- return JsonResponse({'msg': "star is %s"%time1+",end is %s"%time2, 'code': 0})
|
|
|
+ # return str(back[0].decode()) + str(back[1].decode())
|
|
|
+ return JsonResponse({'msg': "star is %s" % time1 + ",end is %s" % time2, 'code': 0})
|
|
|
# return JsonResponse({'msg': "run stream", 'code': 0})
|
|
|
|
|
|
|
|
|
-#测试是否正常接口
|
|
|
+# 测试是否正常接口
|
|
|
def test(request):
|
|
|
return JsonResponse({'msg': 'Server running normal', 'code': 0})
|
|
|
|
|
|
-#test接口
|
|
|
+
|
|
|
+# test接口
|
|
|
def loadBalancingServer(request):
|
|
|
try:
|
|
|
res1 = requests.get('http://rtsp.zositech.com:10008/api/v1/players', timeout=5)
|
|
|
except Exception as e:
|
|
|
res1 = -1
|
|
|
|
|
|
- time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
- print("时间1:%s"%time1)
|
|
|
+ time1 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
|
|
+ print("时间1:%s" % time1)
|
|
|
# ---------压测接口demo------------
|
|
|
redisObj = RedisObject(db=1)
|
|
|
key1 = 'rtsp.zositech.com'
|
|
@@ -575,7 +679,7 @@ def loadBalancingServer(request):
|
|
|
redis_data2 = redisObj.get_data(key2)
|
|
|
if redis_data1 and redis_data2:
|
|
|
print("进缓存")
|
|
|
- mm=min(redis_data1,redis_data2)
|
|
|
+ mm = min(redis_data1, redis_data2)
|
|
|
if redis_data1 == mm and redis_data1 != -1:
|
|
|
RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
|
|
|
elif redis_data2 == mm and redis_data2 != -1:
|
|
@@ -599,7 +703,7 @@ def loadBalancingServer(request):
|
|
|
# RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
|
|
|
# else:
|
|
|
# RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN1']
|
|
|
- return JsonResponse({'msg': 'The number of people online is :%s'%res1, 'code': 0})
|
|
|
+ return JsonResponse({'msg': 'The number of people online is :%s' % res1, 'code': 0})
|
|
|
|
|
|
|
|
|
class powerController(TemplateView):
|
|
@@ -614,24 +718,26 @@ class powerController(TemplateView):
|
|
|
return self.power_controller(request_dict)
|
|
|
|
|
|
def power_controller(self, request_dict):
|
|
|
- uid = request_dict.get('uid', '')
|
|
|
+ serial_number = request_dict.get('serial_number', '')
|
|
|
access_token = request_dict.get('access_token', '')
|
|
|
- skill_name = request_dict.get('skill_name', 'zosi smart')
|
|
|
+ skill_name = request_dict.get('skill_name', 'loocam')
|
|
|
power_controller = request_dict.get('power_controller', '')
|
|
|
|
|
|
+ if not all([serial_number, access_token, skill_name]):
|
|
|
+ return JsonResponse({'result_code': '500', '错误': '缺少参数'})
|
|
|
user_qs = UserModel.objects.filter(access_token=access_token)
|
|
|
if not user_qs.exists():
|
|
|
- return JsonResponse({'result_code': '500' , '错误': '用户数据不存在'})
|
|
|
-
|
|
|
- ur_qs = UidRtspModel.objects.filter(uid=uid).values('uid', 'nick', 'rtsp_url', 'password', 'region')
|
|
|
- if not ur_qs.exists():
|
|
|
- return JsonResponse({'result_code': '500', '错误': 'uid数据不存在'})
|
|
|
+ return JsonResponse({'result_code': '500', '错误': '用户数据不存在'})
|
|
|
+ userID = user_qs.first().userID
|
|
|
+ switch_qs = SwitchModel.objects.filter(serial_number=serial_number, userID=userID).values('nick', 'region')
|
|
|
+ if not switch_qs.exists():
|
|
|
+ return JsonResponse({'result_code': '500', '错误': 'serial_number数据不存在'})
|
|
|
|
|
|
logger = logging.getLogger('django')
|
|
|
- logger.info('{} 唤醒设备 {}'.format(skill_name, uid))
|
|
|
+ logger.info('{} 唤醒设备 {}'.format(skill_name, serial_number))
|
|
|
# 请求MQTT发布消息
|
|
|
- url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX_TEST) # 测试服务器
|
|
|
- requests_data = {'UID': uid, 'MSG': power_controller} # TurnOn, TurnOff
|
|
|
+ url = '{}/api/loocam/open/socket/alexa-socket-switch'.format(SERVER_PREFIX_TEST) # 测试服务器
|
|
|
+ requests_data = {'serial_number': serial_number, 'power_controller': power_controller} # TurnOn, TurnOff
|
|
|
r = requests.post(url, requests_data)
|
|
|
if r.status_code != 200:
|
|
|
return JsonResponse({'result_code': '500', '错误': '请求响应异常'})
|