把园区几百路收进值班台账:bindDevice 入账与 listDeviceDetailsByPage 翻页

📅 发布时间:2026/9/8 18:07:45
把园区几百路收进值班台账:bindDevice 入账与 listDeviceDetailsByPage 翻页 目录东门 NVR、仓库 4G、周界枪机为什么对不上账这篇只会碰到这几项能力轮询、官方 App、一上来写原生园区为什么扛不住动手从创建应用到值班台账数清台账对上之后再开远程看和回放联调会踩的坑真正省下的不是再买一台相机东门 NVR、仓库 4G、周界枪机为什么对不上账以前园区安防的做法很朴素东门一套 NVR仓库几台 4G 机挂在保安私人 App周界枪机再进另一套厂商软件。值班室三块屏早会用 Excel 对数。点位少、人盯得住的时候这套还能交差。点位涨到几百路就废了。东门通道在 NVR 里是 12仓库机还在私人号下周界掉线要第二天对表才知道。再买十台相机账还是三本。缺的不是再挂一路镜头而是用现行 OpenAPI 把设备bindDevice进同一个开发者资产再用listDeviceDetailsByPage按页拉齐摊进你自己的园区值班台账。读完按这个顺序交差在开放平台创建应用拿到appId/appSecret。签名自测通过能拿到accessToken。抽几台核绑定再bindDevicecheckDeviceBindOrNot读回isMinetrue。pageSize50翻页扫完账号下全部设备。值班台账按通道计路东门 / 仓库 / 周界能数清。抽一台拔网台账里对应点位变成offline在线数对得上。工业园区几百路分散在 NVR、4G、私人 App。本文用现行 OpenAPI 的bindDevice统一入账、listDeviceDetailsByPage翻页对账带可运行 Node.js验到本地/inventory数清路数为止。##需要用到这几项能力查询见设备查询说明添加见设备添加说明。bindDevice把设备绑到开发者账号。code按机型传底部安全码或改过的设备密码没安全码且未改密文档允许传空。checkDeviceBindOrNot先看isBind/isMine。别人账上的机绑不进来。listDeviceDetailsByPage分页拉设备详情。pageSize范围 150page从 1 起。几百路就是翻几页不是一次拉全量。返回里的deviceStatus/channelStatusonline、offline、sleep、upgrading。sleep是休眠不要按掉线叫人。catalog能区分NVR和IPC。几百路不等于几百台一台 NVR 下面有多条channelList。accessToken有效期 3 天报TK1002再刷不要每个请求都申。你负责把点位绑进开发者资产、写清东门仓库周界开放平台负责按页吐设备详情和在离线。枪机 / 4G / NVR 通道 │ ▼ bindDevice 入同一开发者账号 │ ▼ listDeviceDetailsByPage每页最多 50 │ ▼ 你的值班台账按 channelId 计路 │ ▼ 东门 / 仓库 / 周界 在线数轮询、官方 App、一上来写原生园区为什么扛不住轮询适合对台账、对在线前提是设备已经在同一个开发者账号下。三套厂商各轮各的不是统一接入只是三份定时任务。只靠官方 App红点停在保安私人手机里。交接班对不上序列号仓库机跟着人走园区后台永远是「少几路」。一上来做原生客户端更没必要。园区已经有 OA 和值班大屏缺的是 HTTP 把资产拉进自己的库不是第三个看监控的 App。动手从创建应用到值班台账数清部署只是开胃菜。真正过关的是账号下的机全部出现在/inventory路数对、区域对抽一台掉线数字会变。第一步创建应用先填园区点位表打开 乐橙开放平台 注册并创建应用。控制台「我的应用 - 应用信息」能看到appId/appSecret再往下做。没有这两样后面签名都会废。先不要写接口。用一张表把现场点位收拢序列号、区域、通道、验证码来源。NVR 只记一台设备通道另行列。设备先配网上线能在官方 App 预览再谈绑定。IMOU_APP_IDlcdxxxxxxxxx IMOU_APP_SECRET你的密钥 PORT8080 # 园区点位deviceId 或 deviceId:channelId ZONE_EAST_GATE东门NVR序列号 ZONE_WAREHOUSE仓库4G序列号 ZONE_PERIMETER周界枪机序列号成功控制台能看到应用点位表每行都有序列号和区域没有「在某某私人 App 里」。兜底还停在私人号下的机先从点位表标出来第三步再核绑定。控制台都没有应用不要往下抄代码。第二步签名壳先和文档案例对齐请求走https://openapi.lechange.cn/openapi/{method}壳子是systemparamsid。签名按开发规范time:{time},nonce:{nonce},appSecret:{appSecret}做 MD5 小写 32 位。time和服务器误差不能超过 5 分钟否则SN1002nonce5 分钟内不能重复否则SN1005。// openapi-client.jsconstcryptorequire(crypto);const{v4:uuidv4}require(uuid);constOPENAPI_BASEhttps://openapi.lechange.cn/openapi;functioncalcSign(time,nonce,appSecret){constrawtime:${time},nonce:${nonce},appSecret:${appSecret};returncrypto.createHash(md5).update(raw,utf8).digest(hex);}asyncfunctioncallOpenApi(method,appId,appSecret,params{}){consttimeMath.floor(Date.now()/1000);constnonceuuidv4();constbody{system:{ver:1.0,appId,time,nonce,sign:calcSign(time,nonce,appSecret)},id:uuidv4(),params,};constresawaitfetch(${OPENAPI_BASE}/${method},{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(body),});constjsonawaitres.json();if(!json.result||json.result.code!0){constmsgjson.result?${json.result.code}${json.result.msg}:JSON.stringify(json);thrownewError(OpenAPI${method}failed:${msg});}returnjson.result.data;}module.exports{callOpenApi,calcSign};成功calcSign(1706511734, f5a1ae2d-c09c-4d39-a744-83a5c2c653c2, test123456789test123456789)得到fd37b62889e4757c58b8f3bf05fb9976再调 accessToken 能打印 token 和expireTime。兜底对不上标准案例先别查业务接口多半是字符串拼错。TK1002再刷 token。签名算法若控制台提示不一致以现行开发规范为准不要混网上过时示例。第三步先核绑定再一台一台 bindDevice这篇入账接口是 bindDevice。先 checkDeviceBindOrNotisBindfalse再绑isMinetrue已经是你的isBindtrue且isMinefalse在别人账上先解绑或走交接不要死磕。token上一步拿到的 accessToken deviceId仓库4G序列号 code底部8位安全码或改过的设备密码未改密且标签没有 8 位安全码按文档把code传空。一批机不要写循环闷头绑先抽东门、仓库、周界各一台。应用开发写明部分新出厂或升级后的设备可能无法只靠 HTTPbindDevice完成绑定要结合客户端 SDK。联调绑失败、核绑定又显示未在本账号先走这条说明不要改签名。成功bindDevice返回code0再查一次isBindtrue且isMinetrue。兜底已经是别人的资产先让现场从原账号解绑。新机 HTTP 绑不上按应用开发说明改 SDK 路径。第四步pageSize 写成 50把账号翻完这篇对账接口是 listDeviceDetailsByPage。pageSize最大 50自有资产用sourcebind连分享进来的也要入账用默认的bindAndShare。翻页直到某一页deviceList为空或累计条数不再增加。// sync-devices.jsrequire(dotenv).config();const{callOpenApi}require(./openapi-client);asyncfunctionlistAllDevices(appId,appSecret,token){constall[];letpage1;constpageSize50;while(true){constdataawaitcallOpenApi(listDeviceDetailsByPage,appId,appSecret,{token,page,pageSize,source:bind,});constchunkdata.deviceList||[];all.push(...chunk);if(chunk.lengthpageSize)break;page1;}returnall;}functionflattenChannels(deviceList,zoneOf){constrows[];for(constdofdeviceList){constchannelsd.channelListd.channelList.length?d.channelList:[{channelId:0,channelStatus:d.deviceStatus}];for(constchofchannels){rows.push({deviceId:d.deviceId,deviceName:d.deviceName,catalog:d.catalog,deviceStatus:d.deviceStatus,channelId:ch.channelId,channelStatus:ch.channelStatus||d.deviceStatus,deviceVersion:d.deviceVersion,zone:zoneOf(d.deviceId),});}}returnrows;}module.exports{listAllDevices,flattenChannels};成功控制台打印出deviceId、catalog、deviceStatus、deviceVersion有 NVR 时同一deviceId下出现多条channelId。400 路大约 8 页几百路听起来吓人其实就是pageSize50翻几页。把每次返回的count和本页deviceList.length记下来方便对「少了一页」这种问题。兜底只打了第 1 页就停台账会永远少一大截。pageSize写成 100以现行文档为准合法值是 150。分享进来的机要用bindAndShare只写bind会漏。第五步值班台账服务按通道计路本地映射区域摊平通道露出/inventory。这是接收侧开放平台吐列表你的服务收成园区能看的一张账。还没数清之前不要去创建直播。# zones.json 填写模板对齐写字段 { 东门NVR序列号: 东门, 仓库4G序列号: 仓库, 周界枪机序列号: 周界 }// inventory-server.jsrequire(dotenv).config();constexpressrequire(express);const{callOpenApi}require(./openapi-client);const{listAllDevices,flattenChannels}require(./sync-devices);constZONESrequire(./zones.json);functionzoneOf(deviceId){returnZONES[deviceId]||未分区;}letcache{rows:[],syncedAt:0};asyncfunctionrefresh(){consttoken(awaitcallOpenApi(accessToken,process.env.IMOU_APP_ID,process.env.IMOU_APP_SECRET,{})).accessToken;constdevicesawaitlistAllDevices(process.env.IMOU_APP_ID,process.env.IMOU_APP_SECRET,token);cache{rows:flattenChannels(devices,zoneOf),syncedAt:Date.now()};}constappexpress();app.get(/health,(_req,res)res.status(200).send(ok));app.get(/inventory,async(_req,res){if(!cache.rows.length)awaitrefresh();constonlinecache.rows.filter((r)r.channelStatusonline).length;constofflinecache.rows.filter((r)r.channelStatusoffline).length;constsleepcache.rows.filter((r)r.channelStatussleep).length;res.json({totalChannels:cache.rows.length,online,offline,sleep,syncedAt:cache.syncedAt,rows:cache.rows,});});app.post(/inventory/refresh,async(_req,res){awaitrefresh();res.json({totalChannels:cache.rows.length,syncedAt:cache.syncedAt});});app.listen(process.env.PORT||8080);成功浏览器打开/health返回okGET /inventory能看到totalChannels、按区域分好的rows以及deviceVersion。值班大屏只读这个 JSON不要让前端直接拿appSecret去翻页。兜底数字对不上现场先看是不是按设备计台、没按通道计路。未分区太多回去补zones.json不要先改签名。refresh里已经申过 token同一次同步不要再打accessToken。第六步抽一台拔网台账变了才算闭环按勾不要跳步。/inventory的totalChannels对得上点位表NVR 按通道加总。东门、仓库、周界三行都能对上deviceId。抽仓库或周界一台拔网 / 断 4G调POST /inventory/refresh该行channelStatus或deviceStatus变为offlineoffline计数加一。插回网线再刷一次回到online。成功上面四条都对得上。这就是「值班台账数清了」。兜底列表有机、刷新状态不变隔一两分钟再刷4G 上的sleep不要按掉线打电话。单台复核可用 listDeviceDetailsByIds 或 deviceOnline。注意deviceOnline的onLine是0/1/3/4和列表里的英文枚举不是同一套字对账时不要混着比。台账对上之后再开远程看和回放最小闭环已经成立才加第二层。仍用同一套现行 OpenAPI不要另起一套协议。值班员要点开东门看一眼先 bindDeviceLive 创建设备源直播再 getLiveStreamInfo 取 HLS。没创建过直播后一个接口拿不到地址。直播地址对外等于公开画面只给值班内网不要进公共群。事后取证同一天时段用 queryCloudRecords 查云录像片段queryRange最大 100再用 createDeviceRecordHls 生成回放地址。beginTime/endTime格式是yyyy-MM-dd HH:mm:ss文档写明不支持跨天。recordType取cloudRecord或localRecord以该点位是否开通云存储、是否有本地卡为准。告警进工单、遮挡掉线进群是下一篇的事。这篇停在「一张账能数清抽一台掉线数字会变」。联调会踩的坑现象多半是什么先做什么台账只有几十路只拉了第 1 页pageSize50一直翻到不足一页现场 200 路台账 40 台按设备计台没按通道计路展开channelListNVR 按channelId加仓库机列表里没有还在私人 AppisMinefalsecheckDeviceBindOrNot再bindDeviceHTTP 绑失败新机 / 新固件不走纯 HTTP 绑定看应用开发的 SDK 说明把sleep当成掉线打电话4G 省电和offline分开看签名对不上标准案例原始串拼错或混了过时算法先对齐 MD5 案例再谈业务隔天一批接口全挂token 过了约 3 天收到TK1002再刷不要每个请求都申列表英文状态和单查对不上deviceOnline用的是0/1/3/4两套枚举分开映射真正省下的不是再买一台相机这篇省下的不是多一路镜头而是值班室不用三块屏、三份 Excel才能回答「园区现在在线多少路、掉的是东门还是仓库」。只做网页预览、不建资产台账的去看轻应用嵌入那条线就够了不必在这里把翻页和区域映射搭起来。家里两台相机、出事了有人盯 App 的散户也没必要上这一套。appSecret、设备密码只放环境变量。直播地址当密钥管。日志里的序列号对外部打码。接口以现行文档为准不要混已标注不再维护的栏目。想获取更多有关园区摄像头的监控开发服务信息欢迎关注乐橙云开放平台点击注册即送免费10路摄像头接入额度和1M免费带宽。