php获取海康平台的监控流地址
先获取所有监控点(/artemis/api/resource/v1/cameras)在根据监控点的cameraIndexCode请求/artemis/api/video/v1/cameras/previewURLs接口获取监控的视频流,
备注:h5播放的话获取视频流时取流协议protocol 要选择 hls,播放时要引入video.js
<?php
namespace app\controller;
use app\BaseController;
class Haikang extends BaseController
{
public $pre_url = "https://**.***.***";
protected $app_key = "***";
protected $app_secret = "****";
public $time; //时间戳
public $content_type = "application/json"; //json类型
public $accept = "*/*";
public $method = array(
"POST" => "POST"
);
public $list_url = array(
'resource/v1/cameras' => "/artemis/api/resource/v1/cameras",
'online/camera/get' => "/artemis/api/nms/v1/online/camera/get",
'vqd/list' => "/artemis/api/nms/v1/vqd/list",
'record/list' => "/artemis/api/nms/v1/record/list",
'region/nodesByParams' => "/artemis/api/irds/v2/region/nodesByParams",
'regions/regionIndexCode/cameras' => "/artemis/api/resource/v1/regions/regionIndexCode/cameras",
'cameras/previewURLs' => "/artemis/api/video/v1/cameras/previewURLs",
'regions/camera/search' =>'/artemis//api/resource/v2/camera/search'
);
public $date = null;
public function __construct($app_key = '', $app_secret = '')
{
session_start();
if ($app_key != '') $this->app_key = $app_key;
if ($app_secret != '') $this->app_secret = $app_secret;
$this->charset = 'utf-8';
list($msec, $sec) = explode(' ', microtime());
$this->time = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}
// 分页获取监控点资源
public function get_camera()
{
//请求参数
$postData = [
"pageNo" => "1",
"pageSize" => "500",
];
$sign = $this->get_sign($postData, $this->list_url['resource/v1/cameras']);
$options = array(
CURLOPT_HTTPHEADER => array(
"HTTP METHOD:" . $this->method['POST'],
"Accept:" . $this->accept,
"Content-Type:" . $this->content_type,
"Date:" . $this->get_date(),
"x-Ca-Key:" . $this->app_key,
"X-Ca-Signature:" . $sign,
"X-Ca-Signature-Headers: x-ca-key",
)
);
$result1 = $this->curlPost($this->pre_url . $this->list_url['resource/v1/cameras'], json_encode($postData), $options);
// dump($result1);die;
// return $result1;
return json_decode($result1, true);
}
// 获取监控点在线状态
public function get_online_camera($includeSubNode = null)
{
//请求参数
if ($includeSubNode) {
$postData = [
"pageNo" => 1,
"pageSize" => 300,
"includeSubNode" => $includeSubNode,
];
} else {
$postData = [
"pageNo" => 1,
"pageSize" => 500,
];
}
$sign = $this->get_sign($postData, $this->list_url['online/camera/get']);
$options = array(
CURLOPT_HTTPHEADER => array(
"HTTP METHOD:" . $this->method['POST'],
"Accept:" . $this->accept,
"Content-Type:" . $this->content_type,
"Date:" . $this->get_date(),
"x-Ca-Key:" . $this->app_key,
"X-Ca-Signature:" . $sign,
"X-Ca-Signature-Headers: x-ca-key",
)
);
$result1 = $this->curlPost($this->pre_url . $this->list_url['online/camera/get'], json_encode($postData), $options);
return json_decode($result1, true);
}
// 获取监控点预览取流URLv2
public function get_previewURLs()
{
$cameraIndexCode = input('cameraIndexCode');
if(!$cameraIndexCode)
{
return "cameraIndexCode不能为空";
}
//请求参数 eef72184562f42cd9df5d9030adca01d cf5ddb99469844bf8e43c0a62ecb8708 6f037f787a2e47c188cbb6e6d42d2b83
$postData = [
"cameraIndexCode" => $cameraIndexCode,
"streamType"=> 1,
"protocol"=> "hls",
"transmode"=> 1
];
$sign = $this->get_sign($postData, $this->list_url['cameras/previewURLs']);
$options = array(
CURLOPT_HTTPHEADER => array(
"HTTP METHOD:" . $this->method['POST'],
"Accept:" . $this->accept,
"Content-Type:" . $this->content_type,
"Date:" . $this->get_date(),
"x-Ca-Key:" . $this->app_key,
"X-Ca-Signature:" . $sign,
"X-Ca-Signature-Headers: x-ca-key",
)
);
$result1 = $this->curlPost($this->pre_url . $this->list_url['cameras/previewURLs'], json_encode($postData), $options);
// var_dump($result1);exit;
return $result1;
}
function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* 转换字符集编码
* @param $data
* @param $targetCharset
* @return string
*/
function characet($data, $targetCharset)
{
if (!empty($data)) {
$fileType = $this->charset;
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
}
}
return $data;
}
/**
* 以appSecret为密钥,使用HmacSHA256算法对签名字符串生成消息摘要,对消息摘要使用BASE64算法生成签名(签名过程中的编码方式全为UTF-8)
*/
function get_sign($postData, $url)
{
$sign_str = $this->get_sign_str($postData, $url); //签名字符串
$app_secret = $this->app_secret;
$sign = hash_hmac('sha256', $sign_str, $app_secret, true); //生成消息摘要
$result = base64_encode($sign);
return $result;
}
function get_sign_str($postData, $url)
{
$next = "\n";
$str = "POST" . $next . $this->accept . $next . $this->content_type . $next . $this->get_date() . $next; //httpHeaders
$str .= "x-ca-key:" . $this->app_key . $next; //customHeaders
$str .= $url;
return $str;
}
function get_date()
{
if (!$this->date)
$this->date = date("Y-m-d H:i:s");
return $this->date;
}
}
文章浏览阅读2.1k次。FX3 JLINK调试是一个有些麻烦的事情,经常有些莫名其妙的问题。 设置参见 c:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\doc\firmware 下的 EzUsbSuite_UG.pdf 文档。 常见问题: 1.装了多个版本的jlink,使用了未注册或不适当的版本 选择一个正确的版本。JLinkARM_V408l,JLinkA_ezusbsuite_qsg.pdf
文章浏览阅读2.6k次。** 本文仅通过用openGL+QT简单实现二进制stl文件读取显示并通过鼠标旋转缩放, 是比较入门的级别,由于个人能力有限,新手级别,所以未能施加光影灯光等操作, 未能让显示的stl文件更加真实。****效果图:**1. main.cpp```cpp#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); _qopengl如何鼠标控制旋转
文章浏览阅读943次,点赞22次,收藏19次。以大规模预训练语言模型为基础的chatgpt成功出圈,在近几日已经给人工智能板块带来了多次涨停,这足够说明这一风口的到来。而作为曾经的风口“知识图谱”而言,如何找到其与chatgpt之间的区别,找好自身的定位显得尤为重要。形式化知识和参数化知识在表现形式上一直都是大家考虑的问题,两种技术都应该有自己的定位与价值所在。知识图谱构建往往是抽取式的,而且往往包含一系列知识冲突检测、消解过程,整个过程都能溯源。以这样的知识作为输入,能在相当程度上解决当前ChatGPT的事实谬误问题,并具有可解释性。
文章浏览阅读1.3k次。最重要的一点,一定是degbug的方式启动,不然热部署不会生效,注意,注意!_tomcat热部署
文章浏览阅读10w+次,点赞56次,收藏482次。html5 ,用css去修饰自己的个人主页代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xh..._个人主页源码
文章浏览阅读201次。开发者(KaiFaX)面向全栈工程师的开发者专注于前端、Java/Python/Go/PHP的技术社区来源:开源最前线链接:https://github.com/svenstaro/gen..._程序员怎么上班摸鱼
文章浏览阅读1.3k次。改变Block UI界面的尺寸_ug二次开发 调整 对话框大小
文章浏览阅读1.3w次,点赞18次,收藏291次。基于深度学习的股票预测数据获取数据转换LSTM模型搭建训练模型预测结果数据获取采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , 助力智能投资与创新型投资。)python可以直接使用pip安装tushare!pip install tushareCollecting tushare Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e74_基于深度学习的股票操纵识别研究python代码
文章浏览阅读2k次。【IT168 厂商动态】 近日,北京中科网威(NETPOWER)工业级防火墙通过了中国电力工业电力设备及仪表质量检验测试中心(厂站自动化及远动)测试,并成为中国首家通过电力协议访问控制专业测评的工业级防火墙生产厂商。 北京中科网威(NETPOWER)工业级防火墙专为工业及恶劣环境下的网络安全需求而设计,它采用了非X86的高可靠嵌入式处理器并采用无风扇设计,整机功耗不到22W,具备极_电力行业防火墙有哪些
文章浏览阅读206次。/*烟台大学计算机学院 作者:董玉祥 完成日期: 2017 12 3 问题描述:二叉树排序树中查找的路径 */#include #include #define MaxSize 100typedef int KeyType; //定义关键字类型typedef char InfoType;typedef struct node
文章浏览阅读775次。当时老师一定会告诉你,这个一个"warning"的报警,可以不用管它,也确实如此。不过,这条报警信息我们至少可以知道一点,就是scanf函数调用完之后是有一个返回值的,下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。_c语言ignoring return value
文章浏览阅读9.6k次。十四五规划下,数据安全成为国家、社会发展面临的重要议题,《数据安全法》《个人信息保护法》《关键信息基础设施安全保护条例》已陆续施行。如何做好“数据安全建设”是数字时代的必答题。_数字医疗服务保障方案