index.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: azoauth
  7. @software: PyCharm
  8. @DATE: 2020/1/13 17:01
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: index.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import json
  15. import threading
  16. import time
  17. import requests
  18. import logging
  19. from django.views.generic import TemplateView
  20. from django.shortcuts import render_to_response
  21. from django.http import JsonResponse
  22. from object.ResObject import ResObject
  23. from urllib.parse import urlencode
  24. import subprocess
  25. import uuid
  26. # from gevent.pool import Pool
  27. from model.models import UserModel,UidRtspModel,AlexaAuthModel
  28. from object.ResponseObject import ResponseObject
  29. from object.tkObject import tkObject
  30. from service.CommonService import CommonService
  31. from object.RedisObject import RedisObject
  32. from azoauth.config import *
  33. class authView(TemplateView):
  34. def post(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. request_dict = json.loads(request.body.decode('utf-8'))
  37. return self.validate(request_dict)
  38. def get(self, request, *args, **kwargs):
  39. request.encoding = 'utf-8'
  40. request_dict = request.GET
  41. return self.validate(request_dict)
  42. def validate(self, request_dict):
  43. state = request_dict.get("state", '')
  44. client_id = request_dict.get("client_id", '')
  45. response_type = request_dict.get("response_type", '')
  46. scope = request_dict.get("scope", '')
  47. redirect_uri = request_dict.get("redirect_uri", '')
  48. context = {
  49. 'state': state,
  50. 'client_id': client_id,
  51. 'response_type': response_type,
  52. 'scope': scope,
  53. 'redirect_uri': redirect_uri
  54. }
  55. return render_to_response("login.html", context)
  56. # Anlapus登录
  57. class authAnlapusView(TemplateView):
  58. def post(self, request, *args, **kwargs):
  59. request.encoding = 'utf-8'
  60. request_dict = json.loads(request.body.decode('utf-8'))
  61. return self.validate(request_dict)
  62. def get(self, request, *args, **kwargs):
  63. request.encoding = 'utf-8'
  64. request_dict = request.GET
  65. return self.validate(request_dict)
  66. def validate(self, request_dict):
  67. state = request_dict.get("state", '')
  68. client_id = request_dict.get("client_id", '')
  69. response_type = request_dict.get("response_type", '')
  70. scope = request_dict.get("scope", '')
  71. redirect_uri = request_dict.get("redirect_uri", '')
  72. context = {
  73. 'state': state,
  74. 'client_id': client_id,
  75. 'response_type': response_type,
  76. 'scope': scope,
  77. 'redirect_uri': redirect_uri
  78. }
  79. return render_to_response("login_anlapus.html", context)
  80. class loginHandleView(TemplateView):
  81. def post(self, request, *args, **kwargs):
  82. request.encoding = 'utf-8'
  83. request_dict = json.loads(request.body.decode('utf-8'))
  84. return self.validate(request_dict)
  85. def get(self, request, *args, **kwargs):
  86. request.encoding = 'utf-8'
  87. request_dict = request.GET
  88. return self.validate(request_dict)
  89. def validate(self, request_dict):
  90. response = ResObject()
  91. user = request_dict.get("user", '')
  92. pwd = request_dict.get("pwd", '')
  93. state = request_dict.get("state", '')
  94. client_id = request_dict.get("client_id", '')
  95. response_type = request_dict.get("response_type", '')
  96. scope = request_dict.get("scope", '')
  97. redirect_uri = request_dict.get("redirect_uri", '')
  98. # 返回code
  99. logger = logging.getLogger('django')
  100. logger.info('------开始认证登录------')
  101. logger.info('redirect_uri: {}'.format(redirect_uri))
  102. if client_id != 'azalexaclient' or response_type != 'code' or scope != 'profile':
  103. return response.json(10, res={'msg': 'error'}, extra={'msg': 'message wrong'})
  104. auth_request_url = '{SERVER_PREFIX}/oalexa/auth'.format(SERVER_PREFIX=SERVER_PREFIX)
  105. requests_data = {'userName': user, 'userPwd': pwd}
  106. res = requests.post(url=auth_request_url, data=requests_data)
  107. if res.status_code != 200:
  108. return response.json(10, res={'错误': '请求响应异常'})
  109. res_json = res.json()
  110. # 添加测试服务器测试
  111. if res_json['result_code'] != 0:
  112. auth_request_url = '{SERVER_PREFIX}/oalexa/auth'.format(SERVER_PREFIX=SERVER_PREFIX_TEST)
  113. res = requests.post(url=auth_request_url, data=requests_data)
  114. if res.status_code != 200:
  115. return response.json(10, res={'错误': '请求响应异常'})
  116. res_json = res.json()
  117. logger.info('请求服务器url: {}'.format(auth_request_url))
  118. logger.info('服务器响应: {}'.format(res_json))
  119. if res_json['result_code'] != 0:
  120. return response.json(10, res={'msg': 'error'}, extra={'msg': res_json['reason']})
  121. nowTime = int(time.time())
  122. code = CommonService.encrypt_data(32)
  123. userID = res_json['result']['userID']
  124. user_qs = UserModel.objects.filter(userID=userID)
  125. if user_qs.exists():
  126. user_qs.update(code=code)
  127. else:
  128. UserModel.objects.create(userID=userID, code=code, addTime=nowTime, updTime=nowTime)
  129. redirect_uri += '?code=' + code + '&state=' + state
  130. return response.json(0, res=redirect_uri)
  131. class oa2TokenView(TemplateView):
  132. def post(self, request, *args, **kwargs):
  133. request.encoding = 'utf-8'
  134. # request_dict = json.loads(request.body.decode('utf-8'))
  135. request_dict = request.POST
  136. return self.validate(request_dict)
  137. def get(self, request, *args, **kwargs):
  138. request.encoding = 'utf-8'
  139. request_dict = request.GET
  140. return self.validate(request_dict)
  141. def validate(self, request_dict):
  142. # 增加对code和client_id的校验代码,返回access_token和refresh_token
  143. code = request_dict.get("code", None)
  144. client_id = request_dict.get("client_id", None)
  145. refresh_token = request_dict.get("refresh_token", None)
  146. logger = logging.getLogger('django')
  147. logger.info('token-------------begin--------')
  148. logger.info(code)
  149. logger.info(client_id)
  150. logger.info(refresh_token)
  151. logger.info(request_dict)
  152. print('client_id:')
  153. print(client_id)
  154. user_qs = UserModel.objects.filter(code=code)
  155. if not user_qs.exists():
  156. user_qs = UserModel.objects.filter(refresh_token=refresh_token)
  157. if user_qs.exists():
  158. access_token = CommonService.encrypt_data(randomlength=32)
  159. refresh_token = CommonService.encrypt_data(randomlength=32)
  160. is_update = user_qs.update(access_token=access_token, refresh_token=refresh_token)
  161. print(is_update)
  162. if is_update:
  163. res_json = {
  164. "access_token": access_token,
  165. "token_type": "bearer",
  166. "expires_in": 3600,
  167. "refresh_token": refresh_token,
  168. # 'test': 'joker'
  169. }
  170. logger.info(res_json)
  171. return JsonResponse(res_json)
  172. else:
  173. logger.info({'msg': 'error'})
  174. return JsonResponse({'msg': 'error'})
  175. else:
  176. res_json = {'msg': 'code not exists'}
  177. return JsonResponse(res_json)
  178. def runSendRtspMsg_thread(UID, PWD, MSG):
  179. command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG)
  180. print('command=>{command}'.format(command=command))
  181. try:
  182. back = subprocess. \
  183. Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
  184. communicate(timeout=10)
  185. except Exception as e:
  186. return False
  187. else:
  188. print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节
  189. print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
  190. return True
  191. class oa2RtspStartView(TemplateView):
  192. def post(self, request, *args, **kwargs):
  193. request.encoding = 'utf-8'
  194. request_dict = request.POST
  195. return self.validate(request_dict)
  196. def get(self, request, *args, **kwargs):
  197. request.encoding = 'utf-8'
  198. request_dict = request.GET
  199. return self.validate(request_dict)
  200. def validate(self, request_dict):
  201. st = request_dict.get("st", 0)
  202. uid = request_dict.get("id", '')
  203. access_token = request_dict.get("access_token", '')
  204. skill_name = request_dict.get("skill_name", 'zosi smart')
  205. user_qs = UserModel.objects.filter(access_token=access_token)
  206. if not user_qs.exists():
  207. return JsonResponse({'错误': '用户数据不存在'})
  208. ur_qs = UidRtspModel.objects.filter(uid=uid).values('uid', 'nick', 'rtsp_url', 'password', 'region')
  209. if not ur_qs.exists():
  210. return JsonResponse({'错误': 'uid数据不存在'})
  211. UID = ur_qs[0]['uid']
  212. nick = ur_qs[0]['nick']
  213. PWD = ur_qs[0]['password']
  214. region = ur_qs[0]['region']
  215. stream_name = ur_qs[0]['rtsp_url']
  216. channel = '0'
  217. if '_' in UID:
  218. # 多通道设备
  219. channel = UID[-1:]
  220. UID = UID[:-2]
  221. RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
  222. MSG = '{}://{}:8554/{}'.format(RTSP_PREFIX, RESP_SERVER_DOMAIN, stream_name)
  223. logger = logging.getLogger('django')
  224. logger.info('------{} 开始向设备下发推流指令------'.format(skill_name))
  225. # 此处后续应该用异步去发送指令
  226. if int(st) == 1:
  227. send_flag = self.runSendStop(UID, PWD, MSG)
  228. logger.info('----------send_flag---st=1-----------------')
  229. if send_flag:
  230. return JsonResponse({'msg': 'stop yes', 'code': 0})
  231. else:
  232. return JsonResponse({'msg': 'stop no', 'code': 0})
  233. # 请求MQTT发布消息
  234. url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX_TEST) # 测试服务器
  235. requests_data = {'UID': UID, 'MSG': MSG+' 1'+channel} # 1: 开始推流,0: 停止推流; channel: 推流通道
  236. r = requests.post(url, requests_data)
  237. if r.status_code != 200:
  238. return JsonResponse({'错误': '请求响应异常'})
  239. res = r.json()
  240. logger.info('请求MQTT发布消息返回状态: {}'.format(res['result_code']))
  241. if res['result_code'] == 0:
  242. logger.info('请求MQTT下发指令成功')
  243. elif res['result_code'] == 10043:
  244. command = "./pushtool {UID} {PWD} {MSG} 1 {channel}".format(UID=UID, PWD=PWD, MSG=MSG, channel=channel)
  245. logger.info('------------推流指令: {}---------------'.format(command))
  246. self.runSendRtspMsg(logger, region, command)
  247. else:
  248. return JsonResponse({'错误': '请求MQTT发布消息异常'})
  249. # 拉流地址
  250. rtsp_uri = '{}://{}:443/{}'.format(RTSP_PREFIX, RESP_SERVER_DOMAIN, stream_name)
  251. stop_time = int(time.time()) + 2*60
  252. expirationTime = time.strftime('%Y-%m-%dT%H:%MZ',time.localtime(stop_time))
  253. res_json = {
  254. 'uid': UID,
  255. 'pwd': PWD,
  256. 'msg': MSG,
  257. 'uri': rtsp_uri,
  258. 'endpointId': uid,
  259. 'friendlyName': nick,
  260. 'manufacturerName': skill_name,
  261. 'expirationTime': expirationTime,
  262. 'description': 'Camera connected via {}'.format(skill_name),
  263. 'audioCodecs': 'ACC',
  264. 'videoCodecs': 'H264',
  265. 'protocols': ['RTSP'],
  266. 'idleTimeoutSeconds': 5,
  267. 'modelName': 'P1425-LE',
  268. 'authorizationTypes': ['NONE'],
  269. 'manufacturerId': 'zosi-ACCC8E5E7513',
  270. 'resolutions': {'width': 640, 'height': 360},
  271. }
  272. logger.info('------------返回控制摄像头的信息---------------: {}'.format(res_json))
  273. return JsonResponse(res_json, safe=False)
  274. def runReqRtspMsg(self, UID, PWD, MSG):
  275. request_url = 'http://localhost:5000/?UID={UID}&MSG={MSG}&CMD=1&PWD={PWD}'. \
  276. format(UID=UID, PWD=PWD, MSG=MSG)
  277. res = requests.get(url=request_url)
  278. print(res)
  279. return True
  280. # 触发此方法,让摄像头推流到MSG流地址
  281. def runSendRtspMsg(self, logger, region, command):
  282. if region == 'CN':
  283. logger.info('------------国内发送推流指令---------------')
  284. url = "http://52.83.252.41:7880/alexa/command?command={command}".format(command=command)
  285. # 请求国内服务器调用pushtool
  286. try:
  287. requests.get(url=url, timeout=2)
  288. except Exception as e:
  289. logger.info('请求国内服务器调用pushtool异常: {}'.format(repr(e)))
  290. else:
  291. logger.info('------------国外发送推流指令---------------')
  292. try:
  293. back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
  294. communicate(timeout=2)
  295. logger.info('back: {}'.format(str(back[0].decode()) + str(back[1].decode())))
  296. except Exception as e:
  297. logger.info('调用pushtool异常: {}'.format(repr(e)))
  298. def runSendStop(self, UID, PWD, MSG):
  299. command = "./pushtool {UID} {PWD} {MSG} 0".format(UID=UID, PWD=PWD, MSG=MSG)
  300. print('command=>{command}'.format(command=command))
  301. try:
  302. back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
  303. communicate(timeout=10)
  304. except Exception as e:
  305. return False
  306. else:
  307. print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节
  308. print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
  309. return True
  310. class oa2DiscoveryDevice(TemplateView):
  311. def post(self, request, *args, **kwargs):
  312. request.encoding = 'utf-8'
  313. request_dict = request.POST
  314. return self.validate(request_dict)
  315. def get(self, request, *args, **kwargs):
  316. request.encoding = 'utf-8'
  317. request_dict = request.GET
  318. return self.validate(request_dict)
  319. def validate(self, request_dict):
  320. # 增加对code和client_id的校验代码,返回access_token和refresh_token
  321. skill_name = request_dict.get("skill_name", 'zosi smart')
  322. access_token = request_dict.get("access_token", None)
  323. logger = logging.getLogger('django')
  324. logger.info('--------{} 开始搜索设备--------'.format(skill_name))
  325. user_qs = UserModel.objects.filter(access_token=access_token)
  326. if not user_qs.exists():
  327. return JsonResponse({'错误': '用户数据不存在'})
  328. response = ResObject()
  329. user = user_qs[0]
  330. userID = user.userID
  331. logger.info('userID: {}'.format(userID))
  332. #更新事件网关接口
  333. alexAuth = AlexaAuthModel.objects.filter(token=access_token).order_by('-addTime')
  334. if alexAuth.exists():
  335. auth_res = alexAuth.values()
  336. event_access_token = auth_res[0]['access_token']
  337. event_refresh_token = auth_res[0]['refresh_token']
  338. event_token = auth_res[0]['token']
  339. event_expiresTime = auth_res[0]['expiresTime']
  340. event_addTime = auth_res[0]['addTime']
  341. event_updTime = auth_res[0]['updTime']
  342. event_alexa_region = auth_res[0]['alexa_region']
  343. AlexaAuthModel.objects.filter(userID = userID).delete()
  344. alexAuth.delete()
  345. logger.info('update_event_access_token')
  346. logger.info(event_token)
  347. AlexaAuthModel.objects.create(
  348. userID = userID,
  349. access_token = event_access_token,
  350. refresh_token = event_refresh_token,
  351. token = event_token,
  352. expiresTime = event_expiresTime,
  353. addTime = event_addTime,
  354. updTime = event_updTime,
  355. alexa_region = event_alexa_region,
  356. )
  357. auth_request_url = '{}/oalexa/discoveryuid'.format(SERVER_PREFIX)
  358. requests_data = {'sid': 'admin', 'sst': 'admin', 'alexa_user_id': userID}
  359. res = requests.post(url=auth_request_url, data=requests_data)
  360. res_json = res.json()
  361. logger.info('正式服务器响应: {}'.format(res_json))
  362. test_flag = False # 用来区分测试服务器,后面删掉
  363. # 添加测试服务器测试
  364. if res_json['result_code'] != 0:
  365. auth_request_url = '{}/oalexa/discoveryuid'.format(SERVER_PREFIX_TEST)
  366. res = requests.post(url=auth_request_url, data=requests_data)
  367. res_json = res.json()
  368. test_flag = True
  369. logger.info('请求服务器url: {}'.format(auth_request_url))
  370. logger.info('服务器响应: {}'.format(res_json))
  371. if res_json['result_code'] != 0:
  372. return response.json(0, res={'msg': 'error'})
  373. uid_arr = res_json['result']['uid_arr']
  374. rtko = tkObject(rank=1)
  375. now_time = int(time.time())
  376. user.uid_rtsp.clear()
  377. res_json = []
  378. uid_rtsp_id_list = []
  379. for uid_a in uid_arr:
  380. uid = uid_a['uid']
  381. nick = uid_a['nick']
  382. rtsp_url = rtko.encrypt(data=uid)
  383. region = 'CN' if uid_a['region'] == 'CN' else 'EN'
  384. if test_flag:
  385. multi_channel = uid_a['multi_channel']
  386. if multi_channel:
  387. # 多通道设备: uid_通道号
  388. uid += '_' + str(uid_a['channel'])
  389. try:
  390. uid_rtsp_qs = UidRtspModel.objects.get(uid=uid)
  391. except UidRtspModel.DoesNotExist:
  392. uid_rtsp_qs = UidRtspModel.objects.create(uid=uid, nick=nick, region=region, password=uid_a['password'],
  393. rtsp_url=rtsp_url, addTime=now_time, updTime=now_time)
  394. else:
  395. uid_rtsp_qs.nick = nick
  396. uid_rtsp_qs.region = region
  397. uid_rtsp_qs.password = uid_a['password']
  398. uid_rtsp_qs.save()
  399. uid_rtsp_id_list.append(uid_rtsp_qs.id)
  400. RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA[region]
  401. rtsp_uri = '{}://{}:443/{}'.format(RTSP_PREFIX, RESP_SERVER_DOMAIN, rtsp_url)
  402. ur_data = {
  403. 'uri': rtsp_uri,
  404. 'endpointId': uid,
  405. 'friendlyName': nick,
  406. 'manufacturerName': skill_name,
  407. 'description': 'Camera connected via {}'.format(skill_name),
  408. 'protocols': ['RTSP'],
  409. 'audioCodecs': ['ACC'],
  410. 'videoCodecs': ['H264'],
  411. 'modelName': 'P1425-LE',
  412. 'authorizationTypes': ['NONE'],
  413. 'manufacturerId': 'zosi-ACCC8E5E7513',
  414. 'resolutions': [{'width': 1280, 'height': 720}],
  415. }
  416. res_json.append(ur_data)
  417. user.uid_rtsp.add(*uid_rtsp_id_list)
  418. logger.info('搜索设备返回值: {}'.format(res_json))
  419. return JsonResponse(res_json, safe=False)
  420. #新增
  421. def testRunSendStop(request):
  422. request.encoding = 'utf-8'
  423. if request.method == 'GET':
  424. request_dict = request.GET
  425. UID=request_dict.get('UID', None)
  426. PWD=request_dict.get('PWD', None)
  427. MSG=request_dict.get('MSG', None)
  428. command = "./pushtool {UID} {PWD} {MSG} 0".format(UID=UID, PWD=PWD, MSG=MSG)
  429. print('command=>{command}'.format(command=command))
  430. try:
  431. back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
  432. communicate(timeout=10)
  433. except Exception as e:
  434. return False
  435. else:
  436. print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节
  437. print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
  438. return JsonResponse({'msg': 'stop Stream', 'code': 0})
  439. from datetime import datetime
  440. def testRunStream(request):
  441. request.encoding = 'utf-8'
  442. if request.method == 'GET':
  443. request_dict = request.GET
  444. UID=request_dict.get('UID', None)
  445. PWD=request_dict.get('PWD', None)
  446. MSG=request_dict.get('MSG', None)
  447. time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
  448. command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG)
  449. print('command=>{command}'.format(command=command))
  450. try:
  451. back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
  452. communicate(timeout=10)
  453. time2=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
  454. # print("时间:%s"%datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
  455. except Exception as e:
  456. return repr(e)
  457. else:
  458. print("back0----", back[0].decode()) # 注意需要进行解码操作,默认输出的是字节
  459. print("back1----", back[1].decode()) # back是一个元祖,可以通过元祖取值的方式获取结果
  460. #return str(back[0].decode()) + str(back[1].decode())
  461. return JsonResponse({'msg': "star is %s"%time1+",end is %s"%time2, 'code': 0})
  462. # return JsonResponse({'msg': "run stream", 'code': 0})
  463. #测试是否正常接口
  464. def test(request):
  465. return JsonResponse({'msg': 'Server running normal', 'code': 0})
  466. #test接口
  467. def loadBalancingServer(request):
  468. try:
  469. res1 = requests.get('http://rtsp.zositech.com:10008/api/v1/players', timeout=5)
  470. except Exception as e:
  471. res1 = -1
  472. time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
  473. print("时间1:%s"%time1)
  474. # ---------压测接口demo------------
  475. redisObj = RedisObject(db=1)
  476. key1 = 'rtsp.zositech.com'
  477. key2 = '18.222.107.129'
  478. redis_data1 = redisObj.get_data(key1)
  479. redis_data2 = redisObj.get_data(key2)
  480. if redis_data1 and redis_data2:
  481. print("进缓存")
  482. mm=min(redis_data1,redis_data2)
  483. if redis_data1 == mm and redis_data1 != -1:
  484. RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
  485. elif redis_data2 == mm and redis_data2 != -1:
  486. RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN1']
  487. # ---------/压测demo------------
  488. # else:
  489. # print("第一次")
  490. # res1 = requests.get('http://rtsp.zositech.com:10008/api/v1/players', timeout=0.001)
  491. # res2 = requests.get('http://18.222.107.129:10008/api/v1/players', timeout=0.001)
  492. # res_data1 = res1.json()
  493. # res_data2 = res1.json()
  494. # total1 = res_data1['total']
  495. # total2 = res_data2['total']
  496. # print(total1)
  497. # print(total2)
  498. # redisObj8.set_data(key=key1, val=total1, expire=30)
  499. # redisObj8.set_data(key=key2, val=total2, expire=30)
  500. # mm=min(total1,total2)
  501. # print(mm)
  502. # if total1 == mm:
  503. # RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
  504. # else:
  505. # RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN1']
  506. return JsonResponse({'msg': 'The number of people online is :%s'%res1, 'code': 0})
  507. class powerController(TemplateView):
  508. def post(self, request, *args, **kwargs):
  509. request.encoding = 'utf-8'
  510. request_dict = request.POST
  511. return self.power_controller(request_dict)
  512. def get(self, request, *args, **kwargs):
  513. request.encoding = 'utf-8'
  514. request_dict = request.GET
  515. return self.power_controller(request_dict)
  516. def power_controller(self, request_dict):
  517. uid = request_dict.get('uid', '')
  518. access_token = request_dict.get('access_token', '')
  519. skill_name = request_dict.get('skill_name', 'zosi smart')
  520. power_controller = request_dict.get('power_controller', '')
  521. user_qs = UserModel.objects.filter(access_token=access_token)
  522. if not user_qs.exists():
  523. return JsonResponse({'result_code': '500' , '错误': '用户数据不存在'})
  524. ur_qs = UidRtspModel.objects.filter(uid=uid).values('uid', 'nick', 'rtsp_url', 'password', 'region')
  525. if not ur_qs.exists():
  526. return JsonResponse({'result_code': '500', '错误': 'uid数据不存在'})
  527. logger = logging.getLogger('django')
  528. logger.info('{} 唤醒设备 {}'.format(skill_name, uid))
  529. # 请求MQTT发布消息
  530. url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX_TEST) # 测试服务器
  531. requests_data = {'UID': uid, 'MSG': power_controller} # TurnOn, TurnOff
  532. r = requests.post(url, requests_data)
  533. if r.status_code != 200:
  534. return JsonResponse({'result_code': '500', '错误': '请求响应异常'})
  535. res = r.json()
  536. logger.info('请求MQTT发布消息返回状态: {}'.format(res['result_code']))
  537. if res['result_code'] != 0:
  538. logger.info('请求MQTT下发指令失败')
  539. return JsonResponse({'result_code': '500', '错误': '请求MQTT下发指令失败'})
  540. else:
  541. logger.info('请求MQTT下发指令成功')
  542. return JsonResponse({'result_code': '0'})