项目里已经有两批摄像机。一批在园区周界,一批在楼内。两批不在同一个手机账号里,甲方问能不能放进同一个后台看。口头方案经常是「走国标」或「上一个融合平台」。这两句话都对了一半。能统一的是注册之后的设备和播放入口。不能统一的是每台设备的云台、对讲和智能检测。
统一管理要先定义清楚。后台能看到这两批设备的在线状态,并能按通道打开画面,这叫管理到了播放。页面上每台都能转云台、都能做离岗,那是另一件事,必须以每台设备的能力集和已开通服务为准。
国标解决的是注册,不是把能力抹平
GB/T 28181 让设备向平台注册。文档《国标接入》说明,该页范围内的国标 IPC 和 NVR,可以按 2011 或 2016 版本接入,通信建议优先 TCP。接入之后,设备出现在同一个国标项目里,再用云直播或轻应用把画面交回你的系统。
这和乐橙协议设备的 bindDevice 不是一条路径。国标设备的预览、对讲和录像路径也不同,文档《国标设备》写了这一点。所以「能放进同一个后台」不等于「调用细节完全一样」。
注册参数是一套:SIP 服务 ID、SIP 服务域、注册地址、端口、设备国标 ID、设备密码。服务域是服务 ID 的前十位。注册域名文档写的是 gbaccess-online-hz.imou.com,设备不能填域名时使用 8.154.21.254。NVR 的通道顺序必须和控制台一致,否则统一列表里的名字会对错画面。
对讲、云台、客流、离岗不会因为两批设备都注册成功就同时具备。国标页把部分能力的设备范围写在产品说明里,真正到某一台,还要调用 device.capability.list。
怎样才算这两批设备已经统一
先看它们是不是都在同一个国标项目里,并且控制台显示在线。有一台还只存在于安装人员的手机里,它就还没进入这份清单。
再看你的业务系统是不是用同一套服务端去要画面。在线之后创建 HLS,或按轻应用签发播放凭证。不要一批设备用手机投屏,另一批设备用接口。
最后看授权。园区和楼内如果交给不同岗位,用子账号把 Real 权限拆开。统一管理不是所有人都能看所有通道。
企业认证和国标项目没完成时,设备网页里无处可注册。这一步在控制台,不在业务代码里。
在线之后,两批设备走同一条取流代码
两批设备都注册到乐橙云开放平台并显示在线后,取 HLS 可以用同一段服务端代码。差别只在 deviceId 和 channelId。签名标准案例的结果必须是 xjhCQBoJ9hRDsCjyDcHjtDNzRZ3ZJezcawsfWeiaoxU=。
const crypto = require("crypto");
function buildSign(time, nonce, appSecret) {
const raw = `time:${time},nonce:${nonce},appSecret:${appSecret}`;
const password = crypto.createHash("sha256").update(appSecret, "utf8").digest("hex").toLowerCase();
return crypto.createHmac("sha256", password).update(raw, "utf8").digest("base64");
}
async function callOpenApi(methodPath, params, appId, appSecret) {
const time = Math.floor(Date.now() / 1000);
const nonce = crypto.randomUUID();
const body = {
system: { ver: "1.0", appId, sign: buildSign(time, nonce, appSecret), time, nonce },
id: crypto.randomUUID(),
params,
};
const response = await fetch(`https://openapi.lechange.cn/openapi/${methodPath}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const json = await response.json();
if (!json.result || json.result.code !== "0") {
throw new Error(`${methodPath} 失败:${json.result && json.result.code}`);
}
return json.result.data;
}
async function createHls(token, deviceId, channelId, appId, appSecret) {
const data = await callOpenApi(
"bindDeviceLive",
{ token, deviceId, channelId, streamId: 1 },
appId,
appSecret
);
return (data.streams || []).map((item) => item.hls);
}
callOpenApi 把签名放进 system.sign,把 token 和设备字段放进 params。streamId 为 1 时取标清辅码流,为 0 时取高清主码流。返回地址按秘密保管。设备未在线时不要调用。
需要确认某台有没有云台时,另调 v2/device.capability.list。清单里没有 ptz.aim.relative,统一界面上就不要给这台设备放云台按钮。
统一管理要核对的文档
| 问题 | 文档或方法名 |
|---|---|
| 哪些国标设备在产品范围内 | 《国标接入》 |
| 注册顺序和 SIP 参数 | 《接入国标 GB28181 设备》《总体流程》 |
| 不同设备网页怎么填 | 《国标设备厂商配置》 |
| 注册之后能力是否相同 | 《国标设备》,方法 device.capability.list |
| 在线后创建播放地址 | bindDeviceLive(创建设备源直播地址) |
| 嵌进网页 | 轻应用开发指南 |
| 按岗位拆开两批设备 | 《子账号功能说明》,addPolicy、subAccountToken |
| 签名和失败码 | 《签名》《错误码》 |
进了同一个后台,画面或按钮仍不一致
一台在线、一台一直离线,分别核对各自的 SIP 参数和传输协议。不要因为另一台已经成功,就认为这一台的密码也是对的。
通道名和画面不符,重对 NVR 通道顺序。统一列表放大了这个问题,因为用户会在相邻两路之间比较。
对讲只有一批设备可用,先看《国标接入》里的对讲范围,再查这台设备的能力集。不要为了界面一致,给没有对讲的设备循环调用接口。
DV1007 是离线或超时。创建直播地址返回成功但控制台播不了,先在直播服务里打开同一条 HLS。页面问题和服务端地址问题要分开。
客流或离岗没有数据,不是统一管理失败。这些检测以能力集和开通服务为准。两批设备可以在同一个后台看画面,同时只有其中一批具备检测。