提交 15438a56 authored 作者: 蒋代伟's avatar 蒋代伟

智慧门店 摄像机视频流

上级 8582191b
...@@ -1358,16 +1358,10 @@ urlpatterns = [ ...@@ -1358,16 +1358,10 @@ urlpatterns = [
url(r'^sales/batch/batch_terminal/$',sal_views.batch_terminal), url(r'^sales/batch/batch_terminal/$',sal_views.batch_terminal),
url(r'^sales/activity/PromotionSeeds_lottery/$', sal_views.PromotionSeeds_lottery), url(r'^sales/activity/PromotionSeeds_lottery/$', sal_views.PromotionSeeds_lottery),
# 智慧门店 开通/关闭标准流预览
url(r'^smartdevice/hikvision/customization/liveVideo/(?P<channelIds>\d+)/(?P<what>\w+)/$',sd_views.act_liveVideo),
# 智慧门店 通过设备序列号查询通道列表
url(r'^smartdevice/hikvision/customization/getChannels/$',sd_views.getChannels),
# 智慧门店 开通标准流预览
#2023-12-13 智慧门店 海康威视获取视频流 #2023-12-13 智慧门店 海康威视获取视频流
url(r'^smartdevice/hikvision/liveVideoOpen/$',sd_views.liveVideoOpen), url(r'^smartdevice/hikvision/getLiveAddress/(?P<company_id>\d+)/$',sd_views.getLiveAddress),
url(r'^smartdevice/hikvision/liveVideoOpen/(?P<company_id>\d+)/$',sd_views.liveVideoOpen), url(r'^smartdevice/hikvision/getLiveAddress/(?P<company_id>\d+)/(?P<deviceSerial>\w+)/$',sd_views.getLiveAddress),
] ]
......
import json
import redis
import requests
from datacenter import settings
from smartdevice.models import Device
CILENT_ID = "7aab6665696b4027879a55332f001b8f"
CILENT_SECRET = "3a86ce7109734c7480f1d293e5dc01fe"
class HikTools():
def __init__(self):
super().__init__()
# 智慧门店 获取hik校验token
def get_hik_stoken(self):
access_token = ""
rd = redis.StrictRedis(connection_pool=settings.LABEL_CHECK_POOL)
rd.select(15)
access_token = rd.get("hik_token")
if access_token:
access_token = json.loads(access_token)
return access_token
else:
hik_url = "https://api2.hik-cloud.com/oauth/token"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data= {
"client_id":CILENT_ID,
"client_secret":CILENT_SECRET,
"grant_type":"client_credentials",
"scope":"all"
}
res = requests.post(hik_url, headers=headers,data=data)
if res.status_code == 200:
res = res.json()
rd = redis.StrictRedis(connection_pool=settings.LABEL_CHECK_POOL)
rd.select(15)
rd.setex("hik_token",res['expires_in']-100,json.dumps(res))
else:
res = ""
return res;
# 根据设备序列号查看设备通道
def getChannels(self,deviceSerial):
access_token = self.get_hik_stoken()
if access_token:
video_url = "https://api2.hik-cloud.com/v1/customization/devices/channels/actions/listByDevSerial?deviceSerial=" + deviceSerial
headers = {"Authorization":"bearer "+access_token['access_token']}
res = requests.get(video_url, headers=headers)
if res.status_code == 200:
res = res.json()
else:
res = ""
return res;
else:
return {"e":"获取token校验错误"}
# 根据通道 开启或者关闭标准视频流
def act_liveVideo(self,deviceSerial,what=None):
access_token = self.get_hik_stoken()
if access_token:
video_url=""
headers = {'Content-Type': 'application/x-www-form-urlencoded',"Authorization":"Bearer "+access_token['access_token']}
if what == 'open':
video_url = "https://api2.hik-cloud.com/v1/customization/liveVideoOpen"
elif what == 'close':
video_url = "https://api2.hik-cloud.com/v1/customization/liveVideoClose"
else:
pass
channels = self.getChannels(deviceSerial)
if channels and 'data' in channels:
channelId = channels['data'][0]['channelId']
data = {
"channelIds": channelId,
}
res = requests.post(video_url, headers=headers, data=data)
if res.status_code == 200:
return res.json()
else:
return {'code': 5200,"message": "操作失败"}
else:
return {'code': 5200,"message": "暂未获取通道"}
else:
return {'code': 5200,"message":"获取token校验错误"}
...@@ -30,13 +30,14 @@ class PlatForm(models.Model): ...@@ -30,13 +30,14 @@ class PlatForm(models.Model):
#设备 #设备
class Device(models.Model): class Device(models.Model):
category = models.ForeignKey(Category, verbose_name=_('设备类别'), on_delete=models.CASCADE) category = models.ForeignKey('Category', verbose_name=_('设备类别'), on_delete=models.CASCADE)
platform = models.ForeignKey(PlatForm, verbose_name=_('设备类别'), on_delete=models.CASCADE) platform = models.ForeignKey(PlatForm, verbose_name=_('设备类别'), on_delete=models.CASCADE)
company=models.ForeignKey('company.Company',verbose_name=_('公司名称'),on_delete=models.CASCADE) company=models.ForeignKey('company.Company',verbose_name=_('公司名称'),on_delete=models.CASCADE)
ancestor=models.ForeignKey('company.Company',verbose_name=_('公司族系'),on_delete=models.CASCADE, related_name='device_ancestor_id') ancestor=models.ForeignKey('company.Company',verbose_name=_('公司族系'),on_delete=models.CASCADE, related_name='device_ancestor_id')
user=models.ForeignKey('company.User',verbose_name=_('操作人'),on_delete=models.CASCADE) user=models.ForeignKey('company.User',verbose_name=_('操作人'),on_delete=models.CASCADE)
name = models.CharField(_('设备名称'), max_length=50, db_index=True) name = models.CharField(_('设备名称'), max_length=50, db_index=True)
status=models.SmallIntegerField(_('设备状态'),default=1,choices=((1,'正常'),(2,'休眠'),(3,'关闭')),blank=True,null=True) status=models.SmallIntegerField(_('设备状态'),default=1,choices=((1,'正常'),(2,'休眠'),(3,'关闭')),blank=True,null=True)
is_open_live_video = models.BooleanField(_('是否开通标准流预览'), default=False)
is_active = models.BooleanField(_('是否已激活'), default=True) is_active = models.BooleanField(_('是否已激活'), default=True)
is_delete = models.BooleanField(_('是否已删除'), default=False) is_delete = models.BooleanField(_('是否已删除'), default=False)
remark = models.CharField(_('备注说明'), max_length=100, null=True, blank=True) remark = models.CharField(_('备注说明'), max_length=100, null=True, blank=True)
......
import http
import json
import redis
import requests import requests
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import render from django.shortcuts import render
from smartdevice.utils import get_hik_stoken from datacenter import settings
from smartdevice.hikTools import HikTools
from .models import Device
# def get_token(request): def getLiveAddress(request,company_id,deviceSerial=None):
# hik_url = "https://api2.hik-cloud.com/oauth/token"
# headers = {'ContentType': 'application/x-www-form-urlencoded'}
# data= {
# "client_id":"a0b0f6d1f1e5467d8ca1d5aaf978f878",
# "client_secret":"b5fb5a3201e046f386eb387bc2f799eb",
# "grant_type":"client_credentials",
# "scope":"all"
# }
#
#
# res = requests.post(hik_url, headers=headers,data=data)
# print(res.json())
# return JsonResponse(res.json(), safe=False)
def getChannels(request): hikTools = HikTools()
deviceSerial = request.GET.get("deviceSerial") access_token = hikTools.get_hik_stoken()
access_token = get_hik_stoken()
if access_token: if access_token:
video_url = "https://api2.hik-cloud.com/v1/customization/devices/channels/actions/listByDevSerial?deviceSerial=" +deviceSerial # 查询当前公司设备是否存在设备并开启视频流
print(video_url) device = Device.objects.filter(company_id=company_id)
headers = {"Authorization":"bearer "+access_token['access_token']} if device is not None:
deviceSerial = device[0].sn
if device[0].is_open_live_video == False:
is_open = hikTools.act_liveVideo(deviceSerial, 'open')
if is_open['code'] == 200:
device[0].is_open_live_video = True
device[0].save()
res = requests.get(video_url, headers=headers) hik_url = "https://api2.hik-cloud.com/v1/customization/liveStudio/actions/getLiveAddress"
print(res.json()) headers = {"Content-Type": "application/json", "Authorization": "Bearer " + access_token['access_token']}
return JsonResponse(res.json(), safe=False) data = json.dumps({
else: "deviceSerial": deviceSerial,
return JsonResponse({"e":"获取token校验错误"}, safe=False) "channelNo": 1,
"protocol": 2,
def act_liveVideo(request,channelIds,what=None): "expireTime": 3600,
print(what) "type": 1,
access_token = get_hik_stoken() "quality": 2
if access_token: })
video_url="" res = requests.post(hik_url, headers=headers, data=data);
headers = {'ContentType': 'application/x-www-form-urlencoded',"Authorization":"Bearer "+access_token['access_token']} if res.status_code == 200:
if what == 'open': res = res.json()
video_url = "https://api2.hik-cloud.com/v1/customization/liveVideoOpen" return JsonResponse(res, safe=False)
elif what == 'close':
video_url = "https://api2.hik-cloud.com/v1/customization/liveVideoClose"
else: else:
pass return JsonResponse({'code': 200, "message": "获取预览播放地址失败"}, safe=False)
data = {
"channelIds":"1"
}
res = requests.post(video_url, headers=headers,data=data)
print(res.json())
return JsonResponse(res.json(), safe=False)
else: else:
return JsonResponse({"e":"获取token校验错误"}, safe=False) return JsonResponse({'code': 200,"message":"获取token校验错误"}, safe=False)
\ No newline at end of file
def liveVideoOpen(request,company_id=None):
print(company_id)
hik_url = "https://api2.hik-cloud.com/v1/customization/liveStudio/actions/getLiveAddress"
headers = {'ContentType': 'application/json'}
data = {
"deviceSerial":"DS-2CD2T26WDV3-I320231126AACHAE1254532",
"channelNo":1,
"protocol":2,
"expireTime":3600,
"type":1,
"quality":2
}
res = requests.post(hik_url, headers=headers, data=data)
print(res)
return JsonResponse( res.json())
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论