python调用海康视频汇聚平台API,获得所有摄像头设备编号、实时播放rtsp地址、回放rtsp地址

news/2024/12/2 4:29:30/

目录

      • 1. 需求
      • 2. 思路
      • 3. 实现
        • 3.1. 确保服务器上安装视频汇聚平台(iSecure Center)
        • 3.2. 查看API网关是否安装成功
        • 3.3. 分配身份认证信息AK/SK
        • 3.4. 利用认证信息,python demo开发

1. 需求

海康视频汇聚平台(综合安防管理平台(iSecure Center)V2.1.0)的openAPI的demo均为c++/java代码,官方没有python代码。

需通过汇聚平台获得所有摄像头的设备编号,利用设备编号获得摄像头IP地址和rtsp地址。

2. 思路

根据海康开放平台官方文档《资源中心>综合安防管理平台(iSecure Center)>开发前准备》,通过平台获得摄像头信息,需遵循以下步骤:

  1. 确保服务器上安装视频汇聚平台(iSecure Center);
  2. 查看API网关是否安装成功;
  3. 分配身份认证信息AK/SK;
  4. 利用认证信息,撰写python demo

3. 实现

3.1. 确保服务器上安装视频汇聚平台(iSecure Center)

对接前需要先部署海康威视综合安防管理平台 iSecure Center
V1.5.100或更高版本的产品。

产品的安装过程请参考产品的《iSecure Center
综合安防管理平台 安装部署指南》,该文档可以在产品安装光盘中获取。

3.2. 查看API网关是否安装成功

  1. 登入运管中心,如下
    在这里插入图片描述

  2. 进入“状态监控”页面,如下
    在这里插入图片描述

  3. 左侧菜单搜索API网关,如下
    在这里插入图片描述

  4. 在API网关的监控详情选项卡中查看服务的运行状态,如下
    在这里插入图片描述

  5. 运行状态显示“正在运行”表示API网关安装成功,如下
    在这里插入图片描述

3.3. 分配身份认证信息AK/SK

开发前需要先获取对接的身份认证信息,AK/SK——平台会通过AK/SK认证方式来验证请求发送者的身份。

获取接口调用权限,资源操作权限——平台会判断某个请求者是否有某个接口的调用权限,以及资源的操作权限。

在平台的OpenAPI管理中心新增合作方来生成AK/SK并分配权限。

  1. 进入运行管理中心,点击“状态监控”选项卡,搜索API网关,点击“API管理”,如下

在这里插入图片描述
2. 进入OpenAPI管理中心,点击“合作方管理”菜单,如下
在这里插入图片描述
3. 点击“创建合作方”,如下
在这里插入图片描述
4. 输入合作方名称和描述,如下
在这里插入图片描述
5. 配置合作方的参数,配置userId的值,userId的值对应平台内部的一个用户;如果使用admin的话,默认所有资源权限都有,如下
在这里插入图片描述
6. 配置合作方的参数,配置domainId的值,domainId对应对接平台所在的网域,如下
在这里插入图片描述
7. 配置合作方的参数,配置tagId的值,为保证接口兼容性,tagId的值请配为frs,如下

在这里插入图片描述
8. 配置完上述信息后,点击创建按钮,如下

在这里插入图片描述
9. 创建完新的合作方,进入合作方管理列表,选择其中一个合作方点击授权,如下
在这里插入图片描述
10. 对接口进行授权,如下
在这里插入图片描述
11. 接口授权完成后,到合作方列表,点击合作方进入详情页,如下
在这里插入图片描述
12. 在合作方详情页面获取AK/SK,合作方Key就是AK,合作方Secret就是SK,如下
在这里插入图片描述

3.4. 利用认证信息,python demo开发

  1. 获得artemis网关服务器ip端口 ,即API网关的ip地址,端口默认为443,如下
    在这里插入图片描述
  2. 获得秘钥appkey和秘钥appSecret ,如下
    在这里插入图片描述
  3. 获得设备编号的openAPI获取方式,需确定请求方式和Body内容,如下
    在这里插入图片描述
    在这里插入图片描述
请求:/api/irds/v2/deviceResource/resourcesBody示例(这里为摄像头camera):
{"pageNo": 1,"pageSize": 100,"resourceType": "camera"
}
  1. 获得指定设备编号的回放url的openAPI获取方式,需确定请求方式和Body内容,如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请求:/api/video/v2/cameras/playbackURLsBody示例:
{"cameraIndexCode": "90ad77d8057c43dab140b77361606927","recordLocation": "0","protocol": "rtsp","transmode": 0,"beginTime": "2017-06-15T00:00:00.000+08:00","endTime": "2017-06-18T00:00:00.000+08:00","uuid": "","expand": "streamform=rtp","streamform": "ps","lockType": 0
}
  1. python demo

主要参考博客《海康综合安防管理平台python版sdk》和《利用Python调用海康威视综合管理平台openAPI接口》

# coding=gb2312import os
import base64
import json
import time
import uuid
import hmac  # hex-based message authentication code 哈希消息认证码
import hashlib  # 提供了很多加密的算法
import requests
import cv2 class OpenApiISC: # 调用视频汇聚平台的openAPIdef __init__(self, gatewayIp, appKey, appSecret):self.gatewayIp = gatewayIp # API网关IPself.appKey = appKey # 合作方keyself.appSecret = appSecret # 合作方秘钥self.base_url = "https://{}:443".format(self.gatewayIp) # api网关ip和端口号self.http_method = "POST"self.ARTEMIS_PATH = "/artemis"self.cameraDataDict = {} # 最后输出的摄像头数据字典def init(self, api_get_address_url): # 每次执行操作,都要初始化appKey = self.appKeyappSecret = self.appSecretx_ca_nonce = str(uuid.uuid4())x_ca_timestamp = str(int(round(time.time()) * 1000))signature = self.generateSignature( appKey, appSecret, x_ca_nonce, x_ca_timestamp, api_get_address_url)self.headers = {"Accept": "*/*","Content-Type": "application/json","x-ca-key": appKey,  # appKey,即 AK"x-ca-signature-headers": "x-ca-key,x-ca-nonce,x-ca-timestamp","x-ca-signature": signature,  # 需要计算得到的签名,此处通过后台得到"x-ca-timestamp": x_ca_timestamp,  # 时间戳"x-ca-nonce": x_ca_nonce  # UUID,结合时间戳防重复}def sign(self, key, value):temp = hmac.new(key.encode(), value.encode(), digestmod=hashlib.sha256)return base64.b64encode(temp.digest()).decode()def generateSignature(self, appKey, appSecret, x_ca_nonce, x_ca_timestamp, api_get_address_url): # 生成签名值# sign_str 的拼接很关键,不然得不到正确的签名sign_str = "POST\n*/*\napplication/json" + "\nx-ca-key:" + appKey + "\nx-ca-nonce:" + \x_ca_nonce + "\nx-ca-timestamp:" + x_ca_timestamp + "\n" + \api_get_address_urlsignature = self.sign(appSecret, sign_str)print("[INFO] 获取到的签名值为:", signature)return signaturedef getDeviceIndexCodeListOperation(self): # 获取设备列表,可获得设备编码和名称api_get_address_url = "{}{}".format(self.ARTEMIS_PATH, "/api/irds/v2/deviceResource/resources") # self.init(api_get_address_url) # 获得设备编码的操作前的初始化body = {"pageNo": 1,"pageSize": 100,"resourceType": "camera"}url = self.base_url + api_get_address_urlresults = requests.post(url, data=json.dumps(body), headers=self.headers,  verify=False)print(results.json())for i in range(len(results.json()['data']['list'])): # 遍历所有设备data = results.json()['data']['list'][i]if data['resourceType'] != 'camera': continue # 仅考虑摄像头cameradata = {} # 单个摄像头数据cameradata.setdefault('indexCode', data['indexCode']) # 摄像头的设备编码cameradata.setdefault('name', data['name']) # 摄像头的名称cameradata.setdefault('regionIndexCode', data['regionIndexCode']) # 摄像头所属区域的编码cameradata.setdefault('regionName', data['regionName']) # 摄像头所属区域的名称self.cameraDataDict.setdefault(i, cameradata)print("获取设备编码和名称:", self.cameraDataDict)def getSingleRealtimeURL(self, indexCode): # 根据设备编码indexCode,获取摄像头的实时播放urlapi_get_address_url = "{}{}".format(self.ARTEMIS_PATH, "/api/video/v2/cameras/previewURLs")self.init(api_get_address_url) # 获得设备实时播放url的操作前的初始化body = {"cameraIndexCode": indexCode,"streamType": 0,"protocol": "rtsp",}url = self.base_url + api_get_address_urlresults = requests.post(url, data=json.dumps(body), headers=self.headers,  verify=False)#print("根据设备编码{},获得实时播放url:{}".format(indexCode, results.json()['data']['url']))return results.json()['data']['url']def getSinglePlaybackURL(self, indexCode, beginTime, endTime,  name): # 根据设备编码indexCode, 获取摄像头给定时间段内的回放播放urlif 'NVR' not in name: return '' # 只有nvr设备才有回放api_get_address_url = "{}{}".format(self.ARTEMIS_PATH, "/api/video/v2/cameras/playbackURLs")self.init(api_get_address_url) # 获得设备实时播放url的操作前的初始化body = {"cameraIndexCode": indexCode,"recordLocation": "1","protocol": "rtsp","transmode": 0,"beginTime": beginTime,"endTime": endTime,"expand": "streamform=rtp"}url = self.base_url + api_get_address_urlresults = requests.post(url, data=json.dumps(body), headers=self.headers,  verify=False)print("根据设备编码{}和时间段,获得回放播放url:{}".format(indexCode, results.json()['data']))return results.json()['data']['url']def getCameraDataDictOperation(self, beginTime, endTime): # 根据设备编码,获得摄像头的实时播放urlfor key, camerainfo in self.cameraDataDict.items(): # 遍历摄像头indexCode = camerainfo['indexCode'] # 设备编码name = camerainfo['name'] # 设备名称url = self.getSingleRealtimeURL(indexCode) # 实时播放urlplayback_url = self.getSinglePlaybackURL(indexCode, beginTime, endTime, name) # 回放信息self.cameraDataDict[key].setdefault('url', url) # 添加url数据self.cameraDataDict[key].setdefault('playback', {'beginTime': beginTime, 'endTime': endTime, 'url': playback_url}) # 添加回放urlprint("根据设备编码列表,获得摄像头数据:", self.cameraDataDict)if __name__ == '__main__':     gatewayIp = '' # 请填写自己的appKey = "" # 请填写自己的appSecret = "" # 请填写自己的openAPIs = OpenApiISC(gatewayIp, appKey, appSecret)openAPIs.getDeviceIndexCodeListOperation() beginTime = "2023-05-23T13:44:04.000+08:00"endTime = "2023-05-23T15:44:04.000+08:00"openAPIs.getCameraDataDictOperation(beginTime, endTime) 

http://www.ppmy.cn/news/79540.html

相关文章

Tensorboard使用教程

Tensorboard是TensorFlow官方提供的一个可视化工具,用于帮助开发者更好地理解和调试自己的模型。以下是使用Tensorboard的一些基本步骤: 在代码中引入Tensorboard库: from torch.utils.tensorboard import SummaryWriter在代码中实例化Summar…

软件测试分类: 你需要知道的不同类型测试

文章目录 一. 按测试对象进行划分1. 界面测试2. 可靠性测试3. 容错性4. 文档测试5. 兼容性测试6. 易用性测试7. 安装卸载的测试8. 安全测试9. 性能测试10. 内存泄漏测试 二. 按是否查看代码划分1. 黑盒测试(Black-box Testing)2. 白盒测试(White-box Testing)冒泡排序测试用例进…

6.4.6拓扑排序

用DAG&#xff08;有向无环图&#xff09;表示一个工程。顶点表示活动&#xff0c;有向边<Vi&#xff0c;Vj>表示活动Vi活动必须先与Vj活动进行。 所谓的拓扑排序&#xff1a;找到做事的先后顺序 以上根据拓扑排序的实现&#xff1a; 加入对有回路的图进行拓扑排序&#…

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的WOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的QOWOA优化LSTM时间序列预测模型&#xff0c;优势明显&#xff0c;注释详细&#xff0c;绘图丰富 一、代码优势 1.使用优化后的QOWOA算法优化LSTM超参数&#xff08;学习率&#xff0c;隐藏层节点&#xff0c;…

小学妹刚毕业没地方住想来借宿,于是我连夜用Python给她找了个好房子,我真是太机智了

事情是这样的&#xff0c;小学妹刚毕业参加工作&#xff0c;人生地不熟的&#xff0c;因为就在我附近上班&#xff0c;所以想找我借宿。。。 想什么呢&#xff0c;都不给住宿费&#xff0c;想免费住&#xff1f;于是我用Python连夜给她找了个单间&#xff0c;自己去住吧&#…

我3年前写的博客,又被别人抄去发论文了,该论文整个正文部分几乎直接照抄我的博客

我想说每一篇原创博客都是作者的心血&#xff0c;有时候写一篇博客也许会花一天&#xff0c;甚至好几天的时间&#xff0c;尊重原创&#xff0c;营造好的环境&#xff0c;才有可能出现更多优质的博文&#xff0c;而不是到处都是抄来抄去的低质量水文。 前几天接到来自粉丝的私信…

pdf怎么拆分成一页一页的?办公常备工具说明

PDF&#xff08;Portable Document Format&#xff09;是一种用于创建和共享文档的文件格式。它由Adobe Systems开发&#xff0c;并已成为电子文档的通用格式。PDF文件可以包含文本、图像、表格、超链接和其他多媒体内容&#xff0c;使其成为一种非常方便的文件格式。 然而&…

Vulkan Tutorial 4

目录 11 framebuffer 12 命令缓冲区 13 Rendering and presentation 信号量 栅栏 创建同步对象 等待上一帧 从交换链获取图像 提交命令缓冲区 子通道依赖 Presentation 14 Frames in flight 15 Swap chain recreation 重新创建交换链 11 framebuffer 我们已经将…