IoT 物模型 + 客户端 SDK:乐橙摄像头、门锁、传感器统一上云管控

📅 2026/7/7 16:15:28
IoT 物模型 + 客户端 SDK:乐橙摄像头、门锁、传感器统一上云管控
IoT 物模型 客户端 SDK乐橙摄像头、门锁、传感器统一上云管控去年给硬件商做全屋 IoT 管控平台乐橙摄像机、指纹锁、门窗传感器合同写「统一 App、统一云端」。交付时却是摄像机走bindDeviceLive拉 HLS门锁同事另写 MQTT传感器还在轮询私有 HTTP。三个品类、三套 Cron——运维每周十几条「App 离线、乐橙 App 正常」。复盘后收成一条台账 两条能力轨listDeviceDetailsByPage看productId分 IoT 物模型与视频 OpenAPIOpenSDK统一配网添加入口。乐橙全屋场景两类云协议一套 App乐橙开放平台 智能家居方案覆盖智能摄像机、指纹锁、报警传感器案例鸿雁智。对接时别按品类写三套后台——云侧实际是两种协议品类云侧路径列表线索乐橙 IPC视频 OpenAPI OpenSDK Media常无 productIddeviceAbility含AlarmMD、AudioTalk锁 / 传感器IoT 物模型productId有值文档约定productId有值 IoT 设备可调接口用途getProductModel拉 Property / Service / Event 模板getIotDeviceProperties读电量、门状态等setIotDeviceProperties写属性iotDeviceControl远程开锁等 Service摄像机动检仍走setMessageCallback与物模型并行。乐橙云 openapi.lechange.cn你的 BFF自有品牌 App · OpenSDK DeviceAdd统一设备列表sync-devicesproductId 分轨video 轨iot 轨listDeviceDetailsByPagegetProductModel边界物模型不能替代 IPC 的 HLS / 对讲OpenSDK 配网物模型读写只在 BFF勿用停维护的deviceList方法。Step 0 · 调用壳国内网关// lib/platform-call.jsimportcryptofromnode:crypto;import{randomUUID}fromnode:crypto;functioncalcSign(time,nonce,secret){constrawtime:${time},nonce:${nonce},appSecret:${secret};returncrypto.createHash(md5).update(raw,utf8).digest(hex);}exportasyncfunctionplatformCall(method,params{}){consttimeMath.floor(Date.now()/1000);constnoncerandomUUID();constbody{system:{ver:1.0,appId:process.env.APP_ID,sign:calcSign(time,nonce,process.env.APP_SECRET),time,nonce,},id:randomUUID(),params,};constresawaitfetch(${process.env.OPENAPI_BASE}/${method},{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(body),});constjsonawaitres.json();if(json.result?.code!0)thrownewError([${json.result.code}]${json.result.msg});returnjson.result.data;}exportasyncfunctionadminToken(){const{accessToken}awaitplatformCall(accessToken,{});returnaccessToken;}APP_IDlcdxxxxxxxxxxxxAPP_SECRETyour_secretOPENAPI_BASEhttps://openapi.lechange.cn/openapi签名开发规范 · 先在 open.imou.com 创建应用。Step 1 · 统一台账 productId 分轨// jobs/sync-devices.jsimportdotenv/config;import{platformCall,adminToken}from../lib/platform-call.js;functionclassify(dev){constisIotBoolean(dev.productId);constabilitydev.channelList?.[0]?.channelAbility??dev.deviceAbility??;letcategoryunknown;if(isIot){category/lock|锁/i.test(dev.deviceModel??)?lock:sensor;}elseif(/AlarmMD|AudioTalk|PTZ/.test(ability)){categorycamera;}return{deviceId:dev.deviceId,deviceName:dev.deviceName,productId:dev.productId??null,category,track:isIot?iot:video,online:dev.deviceStatusonline,ability,};}consttokenawaitadminToken();constpageawaitplatformCall(listDeviceDetailsByPage,{token,pageSize:50,page:1,source:bindAndShare,});console.log(JSON.stringify((page.deviceList??[]).map(classify),null,2));踩坑 1全是摄像机、无 productId ——正常别调getProductModel。踩坑 2锁与传感器productId 不同getProductModel按 productId 分别缓存。踩坑 3乐橙 App 能看、列表 0 → 设备未绑 开发者主账号。Step 2 · IoT 轨模板 读属性// services/iot-thing.jsconstmodelCachenewMap();exportasyncfunctionloadProductModel(productId){if(modelCache.has(productId))returnmodelCache.get(productId);constmodelawaitplatformCall(getProductModel,{token:awaitadminToken(),productId,});modelCache.set(productId,model);returnmodel;}exportasyncfunctionreadProperties(deviceId,productId,propertyRefs){returnplatformCall(getIotDeviceProperties,{token:awaitadminToken(),deviceId,productId,properties:propertyRefs,});}constmodelawaitloadProductModel(Z8vW2yWE);constbatteryRefmodel.properties?.find(pp.name?.includes(电量))?.ref??3301;conststateawaitreadProperties(LOCK_SN_001,Z8vW2yWE,[batteryRef]);console.log(state.properties,state.status);踩坑 4properties传ref 数字字符串如3301不是 identifier 英文名——必须先拉模板。物模型三维见 概述Property — 读/写状态电量、开关 Service — 方法远程开锁 Event — 上报可经 setMessageCallback 进告警中心Step 3 · IoT 轨远程开锁 ServiceawaitplatformCall(iotDeviceControl,{token:awaitadminToken(),deviceId:LOCK_SN_001,productId:Z8vW2yWE,ref:3010,content:{},});ref/content以getProductModel返回的 services[]为准无入参时content: {}。踩坑 5方案写「一键开锁」→ BFF 必须二次确认 审计日志物模型只提供能力。Step 4 · 视频轨乐橙 IPCconstliveawaitplatformCall(bindDeviceLive,{token:awaitadminToken(),deviceId:CAM_SN_001,channelId:0,streamId:1,liveMode:proxy,});awaitplatformCall(setMessageCallback,{token:awaitadminToken(),status:on,callbackUrl:process.env.CALLBACK_URL,callbackFlag:alarm,deviceStatus,basePush:2,});告警统一入库functionnormalizeAlarm(raw,row){if(row.trackvideo){return{source:video,type:raw.msgType,deviceId:raw.did,ts:raw.time};}return{source:iot,deviceId:raw.did,payload:raw};}Step 5 · OpenSDK统一添加入口GET /api/v1/rooms/{id}/devices → BFF 统一 REST camera → { preview, talk } # OpenSDK MediaModule lock → { unlock, readState } # iotDeviceControl getIotDeviceProperties sensor → { readProperties }Stringhostopenapi.lechange.cn:443;LCOpenSDK_Api.initOpenApi(newInitParams(context,host,bff.fetchAccessToken()));// DeviceAddModule — 摄像机/锁/传感器统一添加入口详见 Android 标准化 Demo · 资源下载。Checklist□ listDeviceDetailsByPage 全量classify 打印 track □ 摄像机bindDeviceLive setMessageCallback □ 锁/传感器getProductModel getIotDeviceProperties □ 开锁iotDeviceControl 鉴权 □ OpenSDK DeviceAdd 统一入口物模型缓存与多租户getProductModel按 productId Redis 缓存固件升级清缓存。前端用ref→中文名映射勿硬编码3301。多租户按 deviceId 鉴权共用 productId 模板。选型速查需求乐橙路径门口直播 对讲OpenSDK bindDeviceLive锁电量 / 门磁IoT Property远程开锁iotDeviceControl摄像机动检setMessageCallback7 天 H5 PoC轻应用排错现象处理getProductModel 失败无 productId误分类properties 空ref 错 / offline三类三个 Cron合并 sync-devicesIPC 走 iot 轨无 productId → video安全appSecret仅 BFF开锁 Service 强鉴权。回调 HTTPS 200我的资源 关注配额。小结乐橙摄像头、门锁、传感器不必三套后台OpenSDK DeviceAdd 统一配网 → listDeviceDetailsByPage 台账productId 分轨 → iot 轨getProductModel / Property / Service → video 轨bindDeviceLive / setMessageCallback → BFF 一套 REST 给 App客户验收一个 App、三个房间 Tab、锁能开、摄像机能看、传感器刷新——底层两条轨用户无感。延伸阅读IoT 物模型概述分页查询设备详情OpenSDK 组件同系列白牌 App 配网/预览/对讲 · 告警 3 分钟验收开始接入在乐橙开放平台 open.imou.com注册并创建应用。平台以视频技术与安全为核心提供OpenAPI、IoT 物模型、OpenSDK、轻应用帮助集成商一站式落地摄像机 锁 传感器混合全屋方案。建议先跑sync-devices打印 classify看清哪些设备有productId再写 UI——比先画原型后补协议省一半返工。你的项目里是锁先接入还是 IPC 先接入评论区说说。