ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

萤石开放平台设备接入与可编程设备开发实战指南

萤石开放平台设备接入与可编程设备开发实战指南 1. 先把这个标题拆开看设备接入产品到底在做什么第一次看到“萤石开放平台 设备接入产品 | 萤石可编程设备”这个标题的时候我第一反应是这不像一个普通用户搜的东西更像是做系统集成、做项目交付、或者打算把萤石摄像头接进自己业务系统的人会搜的关键词。先解释一下背景。萤石开放平台open.ys7.com是海康威视旗下萤石网络面向开发者提供的开放能力平台。它解决的问题一句话就能讲清楚让第三方开发者不需要自己造摄像头、不需要自己搭视频服务器、不需要自己维护流媒体分发就能把萤石生态里的摄像头、门铃、网关、传感器等设备快速接入自己的App、小程序、Web后台或者业务系统。说白了就是“设备接入能力外包”。那“可编程设备”又是什么我的理解是不是所有设备都只是“给你一路视频流”那么简单。萤石生态里有一类设备支持更深的二次开发——设备端可以被自定义指令控制比如云台转动、报警输出、自定义联动逻辑云端可以通过物模型对设备的数据进行建模、下发、接收和事件回调。这样的设备就叫“可编程设备”。你可以在上面定义自己的业务逻辑比如“红外传感器触发后摄像头转向某个预置位并开启补光灯”而不是只能看视频。这个内容适合谁看三类人做智慧园区、门店管理、养殖场监控等项目的集成商需要把萤石设备接到自己的平台做App或是小程序开发想快速实现摄像头预览、云台控制、报警推送的独立开发者以及正在选型“哪些摄像头能二次开发、哪些只能当傻瓜摄像机用”的产品经理或采购。下面我把从接入设计、工具准备、实操流程到问题排查的完整经验一条条讲清楚踩过的坑也会一并说出来。2. 接入前的核心概念普通设备和可编程设备的本质差异2.1 平台的资源模型账号、应用、设备的三层结构使用萤石开放平台第一个要理解的是它的资源模型。它跟你自己写一个物联网平台不一样萤石平台上所有能力都是挂在“应用”下面的。你在开放平台注册账号后需要先创建一个“开发者应用”创建之后系统会给你一对密钥叫appKey和appSecret。这两把钥匙决定了你后续所有API调用的身份。然后把设备添加到你账号下再把设备和某个应用关联起来。实际调用时用appKey appSecret换取accessToken后续所有接口都用这个accessToken访问。这个模型要注意一点设备和应用是“多对多”关系还是“一对多”关系我在实际使用中发现一个设备可以同时被多个应用关联只要你拿到了设备序列号和验证码就可以分别添加到不同应用下。所以做集成时建议先理清楚你的设备是客户的还是你自己的如果是客户的设备客户把设备分享或者授权给你你才能把设备加到你的应用下。这是很多刚上手的人踩坑的地方——用别人的设备调试结果一直提示“设备不存在”。2.2 设备接入方式选型直连、网关还是拉流转发萤石开放平台的“设备接入”常见的实现方式有这么几类接入方式适合场景延迟/成本我的评价设备直连EZVIZ协议萤石品牌IPC、门铃、盒子等低延迟P2P打洞优先首选稳定性和体验最好第三方设备RTMP推流非萤石品牌IP摄像头、自制设备延迟1-3秒需自建流媒体服务适合自有硬件接入GB/T 28181国标接入大型安防平台、政府类项目标准协议平台侧兼容性好适合传统安防项目但配置繁琐视频平台转发拉流不想写底层协议直接用开放平台API中等延迟按路数计费最省事适合中小团队这里面我重点说第一条。萤石设备直连走的是萤石自己的P2P协议设备上线后开放平台会维护一条长连接通道你通过API拿到的不是传统的RTMP或者HLS地址而是一个“播放令牌”加上设备的序列号、通道号。播放时SDK通过P2P或者服务器转发两种方式拿到流。实测下来P2P打通的情况下延迟基本能控制在300ms以内对云台控制、双向语音这些交互非常友好。但如果设备在复杂的NAT后面P2P打洞失败平台会自动切换为服务器转发延迟会到1秒左右也还能接受。2.3 网络环境和调试工具的准备这里顺便提一个容易忽略的问题。萤石设备登录云平台需要访问特定端口如果你所在的网络有防火墙限制或者光猫包括现在常见的XG-PON ONU开启了严格的网络隔离模式设备很可能发生“离线”或“频繁离线”的问题。实测中光猫的防火墙、路由器的UPnP配置、以及无线网络的2.4G/5G频段选择都会影响设备接入稳定性。建议把萤石设备的Wi-Fi固定到2.4G频段不要连5G频段。5G频段穿墙能力弱信号稍微波动一下设备就掉线。对于家庭宽带用户如果光猫没有改桥接模式而是让光猫和路由器都做NAT相当于双重NATP2P打洞成功率会明显下降。这时候可以试试把光猫改成桥接让路由器直接拨号或者在路由器里给萤石设备做静态IP并开启DMZ。这部分后面排查章节会细讲。3. 从零到一设备接入完整实操流程3.1 第一步注册开放平台账号、创建应用、获取密钥操作路径是登录萤石开放平台官网注册账号个人或企业均可然后在控制台里创建应用。创建时它会让你填应用名称、应用类型、回调地址等。应用创建完成后在“应用详情”里就能看到appKey和appSecret。这里有个重要的点拿accessToken时接口地址是POST /api/lapp/token/get参数是appKey、appSecret返回的是一个有效期默认7天的accessToken。7天之后token过期你必须重新获取。很多人第一次做的时候以为token是永久有效的结果用了两天突然接口全部报错排查了半天才发现是token过期了。另外appSecret只能查看一次如果你忘记了只能重置。重置后之前拿到的所有accessToken立即失效。所以建议直接把appSecret放到你们自己的配置中心别写在代码里更别提交到Git仓库。这玩意泄露了别人可以拿着它调用你的应用权限重置设备、删除设备后果比较严重。下面是一个获取accessToken的示例我用的是Python你可以改成任何语言import requests url https://open.ys7.com/api/lapp/token/get data { appKey: 你的appKey, appSecret: 你的appSecret } resp requests.post(url, datadata) print(resp.json()) # 正常返回示例 # {code:200,msg:操作成功,data:{accessToken:at.xxxxx,expireTime:1699999999}}注意请求头不需要加Content-Type直接form表单提交就行。这是好多教程没提的小细节有的SDK会自动设置请求头有的不会导致返回400我当时被坑了半小时。3.2 第二步添加设备到账号拿到设备序列号和验证码添加设备有两种方式设备在萤石云App里已经绑定你在开放平台控制台直接输入设备序列号添加通过API添加接口是POST /api/lapp/device/add参数需要deviceSerial序列号和validateCode验证码。设备序列号一般在设备机身贴纸上格式通常是E开头的一串数字字母组合比如E12345678。验证码是设备初始化的六位验证码也在贴纸上。注意这个验证码不是Wi-Fi密码是设备接入云平台的初始认证信息。如果贴纸丢了只能在设备上恢复出厂设置重新获取验证码。我当时做门店项目时需要一次性接入32台设备不可能一台台在App里输验证码所以直接用API循环添加脚本如下import requests token at.xxxxx devices [ {serial: E12345678, code: ABC123}, {serial: E12345679, code: ABC124}, # ... ] url https://open.ys7.com/api/lapp/device/add for item in devices: data { accessToken: token, deviceSerial: item[serial], validateCode: item[code] } resp requests.post(url, datadata).json() if resp[code] 200: print(f{item[serial]} 添加成功) else: print(f{item[serial]} 添加失败{resp[msg]})批量添加时建议加一个延迟比如每100ms一个。不是平台接口必须这么做而是避免你自己代码写太快触发本地的连接数限制到时候报错不好查。3.3 第三步可编程设备的核心操作——物模型与自定义逻辑如果你接入的是“可编程设备”那么重点就来了。这类设备除了视频能力之外还暴露了“物模型”Thing Model。物模型是物联网领域的一个标准化概念简单理解设备的能力被抽象成属性、事件、服务三类。属性Property设备的状态数据比如温度、湿度、开关状态、云台角度。你可以读也可以写。事件Event设备主动上行的讯息比如移动侦测报警、红外触发、设备启动。服务Service设备可以执行的动作比如抓图、转动云台、布防/撤防。萤石开放平台的物模型提供了一整套API比如获取设备属性、设置设备属性、调用设备服务。这里我用一个实际例子门店的门磁传感器一个可编程设备接入后我定义了一个“开门计数”的属性每次门磁状态变化就累计加1。这个逻辑可以在云端通过事件回调实现也可以在设备端用规则引擎实现。以调用设备服务为例接口是POST /api/lapp/thing/service/invoke需要参数deviceSerial、serviceId、inputDataJSON格式的输入参数import requests, json url https://open.ys7.com/api/lapp/thing/service/invoke data { accessToken: token, deviceSerial: E12345678, serviceId: ptzControl, inputData: json.dumps({action: 1, speed: 50}) # 操作: 1上, 2下, 3左, 4右 } resp requests.post(url, datadata).json() print(resp)这个接口返回的outputData在不同设备上格式差异很大调试的时候最好先调获取物模型详情接口把设备的服务定义拉下来看看字段要求。不然你以为的action1也许在设备端代表的是“下”而不是“上”。3.4 第四步实时视频预览的两种API姿势接入设备之后最直接的需求就是“看视频”。开放平台的实时预览有两种拿流方式取播放地址调用POST /api/lapp/live/video/list传入deviceSerial、channelNo默认1返回一个liveVideo列表里面包含hls、rtmp、hdlHTTP-FLV三个协议的播放地址。这种地址一般有效期很短大概几十秒到几分钟过期了需要重新获取。用播放SDK直接播放在Android/iOS/Web端集成萤石提供的播放控件传入accessToken、deviceSerial、channelNoSDK内部自动处理拉流和播放。这种方式体验最好也支持云台控制、双向语音、本地录像等能力。我个人的建议是如果是自己写的App优先用SDK如果是后台系统只需要看到画面、做截图、做录像回放直接用API取HLS地址丢给网页播放器就行。取流地址时有一个暗坑channelNo。很多人以为所有设备都是通道1但有些多目相机比如“全景细节”双镜头会有通道1和通道2。如果你只传1拿到的可能是全景画面而不是你想看的特写画面。所以在适配设备前最好先调用POST /api/lapp/device/info看一下设备详情里的通道数量。4. 可编程设备的典型应用场景与二次开发思路4.1 场景一云台联动——红外触发后自动转向预置位我在做一个养殖场项目时甲方要求当围栏区域的红外对射报警时附近的球机要自动转向报警点并开始录像。用可编程设备的思路来做就是三件事报警探测器可以是萤石生态里的传感器也可以用第三方设备接入触发后通过事件回调通知云端业务云端调用球机的云台控制服务把云台转到预置位调用设备的布防/录像服务开启持续录像。这里面最难的不是调API而是判断“报警点对应的预置位是哪个”。我当时的做法是在设备安装调试阶段让施工人员实际走到每个报警点手动调整云台使画面中心对准报警点然后把此时云台的presetId预置位编号记录到后台数据库。一个预置位对应一个报警点的坐标。这样报警事件到的时候查表拿到presetId直接一条指令转过去整个过程大概1.2秒内能完成很稳。4.2 场景二事件驱动的边缘过滤与告警推送可编程设备最值钱的一点就是事件不再是一个黑盒你可以在自己的业务系统里对事件做“二次加工”。比如萤石摄像头的移动侦测事件默认只有一张设备和一系列默认参数。但我接入后可以在物模型层做一件事把“移动侦测”的原始布尔值提升为“布防状态下的移动侦测”和“撤防状态下的移动侦测”两个不同事件。再结合时间表白天营业时间检测到人就不推送凌晨3点检测到人立刻推送并录像。实现方式有两种云端实现订阅事件回调业务系统判断触发推送。优点是不依赖设备算力缺点是事件会全量上行流量上有消耗。设备端实现如果设备支持端侧规则在设备上配置联动规则比如“时间在00:00-06:00且移动侦测触发时输出报警”。优点是不浪费上行流量、断网也能联动缺点是可编程逻辑有限复杂的业务判断做不了。我的选择是凡是需要“跨设备联动”的逻辑放云端凡是单纯“本机判断开关”的逻辑放设备端这样既平衡了延时又控制了成本。4.3 场景三定时任务与录像策略的自定义实现再说一个很多人会忽略的点通过开放平台可以动态修改设备的录像计划。传统做法是在萤石云App里手工设置录像时间段。但可编程设备的玩法是你的业务系统每天从第三方收银系统拉取营业结束时间再通过API把“动检录像”和“全天录像”的计划动态下发到设备。节假日调休、临时闭店这些异常情况都能自动处理。开放平台的录像计划相关接口主要在“设备管理”和“云存储”分组下核心逻辑是先获取当前录像计划再通过设置接口构建每周7天、每天24小时的时间段数据。这里的时间是UTC8北京时间要注意接口内部使用的是“星期时区偏移”的方式不要用本地Date对象直接序列化容易差8个小时。我当时在这里踩了一次坑下发的录像计划总是提前8小时查了两天才发现是时区换算问题。5. 常见问题与排查技巧实录5.1 设备离线与频繁掉线的排查顺序设备离线是接入时最头疼的问题这里的排查顺序我建议按下面从易到难来确认设备供电正常、指示灯状态正常。萤石设备离线时通常指示灯会出现异常比如红色慢闪。如果灯完全不亮检查电源适配器实测中有30%的“离线”其实是电源松了。确认Wi-Fi信号正常。在萤石云App里查看设备Wi-Fi信号质量如果只有一格离线就不奇怪。遇到这种情况建议调整路由器位置或者在设备旁边加一个Wi-Fi中继器但要注意IP一致性和NAT问题。确认网络类型。如果设备接在5G Wi-Fi下建议改成2.4G。5G频段覆盖范围小、穿透差很多设备离线都是因为5G信号弱导致的。检查光猫和路由器组网。最近不少家庭宽带换了XG-PON ONU光猫这类光猫本身带路由功能如果你又在后面接了一个无线路由器就会形成两层NAT。P2P通道在这种组网下很难建立设备即使显示在线预览也经常“连接超时”。解决办法光猫改桥接或开启UPnP让内网设备能正常建立P2P连接。确认设备固件版本。有时平台升级了接入协议旧固件的设备会出现频繁掉线。这时在萤石云App里检查固件升级升级到最新版再观察。注意不要在设备断网时反复断电重启频繁重启会加大flash损坏的风险急不来。5.2 token过期与鉴权失败上面说过accessToken有效期是7天并且appSecret一旦重置所有token都会失效。排查此类问题的技巧是先把接口返回的code打出来。10001是token无效10002是token过期。这两个错误码虽然看起来像同一个意思实际上处理逻辑不同——一个是token格式不对一个是token过期需要重新获取。我当时在做一个定时任务时用了一个变量缓存token结果没加token过期自动刷新逻辑。跑了3天后任务突然全部失败日志里全是10002。后来加了一小段自动判断逻辑发现code 10002就重新获取token并重试一次请求问题就解决了。另外开放平台的接口有访问频率限制。批量操作设备时建议加一个重试机制遇到限流错误一般是40005或类似限流code就退避重试间隔递增比如第一次1秒、第二次3秒、第三次10秒不要猛冲。5.3 拉流卡顿与P2P连接失败实时预览卡顿的排查要从链路上拆设备端上行带宽、服务器转发带宽、客户端下行带宽。如果只有某个网络里的客户端卡先怀疑客户端本身网络如果多个网络都卡再看设备端上行带宽。萤石设备默认的清晰度如果是超清码率大约在2-4Mbps上行带宽不够就会卡如果显示“连接失败”而不是“加载中”大概率是P2P没打通走了服务器转发但转发通道也异常。排查P2P是否成功萤石开放平台API里有一个拉流时的返回值hlsAddr和rtmpAddr你可以在返回数据里看到natTraversal之类的字段不同类型的接口字段名略有差异。如果显示P2P失败可以尝试在主路由器里为设备设置固定IP并开启DMZ这是一个能显著提升P2P成功率的土办法。实测在普通家庭B类宽带环境下开启DMZ后P2P成功率从70%提升到接近95%。6. 一些我实际用到后才深有体会的建议做设备接入类项目时间往往不是花在看文档上而是花在“你以为你懂了这个设备的全部行为实际上设备还有隐藏默认规则”上。我建议你在正式开发前先花半天时间做一件小事把你手上要接入的每一种型号都拿一台来在空地上把电源、网络、App初始化全部跑通然后逐个调用平台API把设备能力清单拉出来看一遍。我自己的习惯是写一个“探测脚本”一次性把设备信息、通道列表、物模型定义、支持的服务列表全部打印出来存档。后续开发时这些数据就在手边不用每次靠猜。另外关于“可编程设备”和普通设备的选型我想多说一句不要因为“可编程”听起来高级就一律选可编程设备。如果只是做视频预览和回放普通设备接入更简单、成本更低。可编程设备的优势在于“状态可读、行为可控、逻辑可改”这些特性需要你有一条全新的数据链路来支撑如果你只是需要一路视频流那用普通设备就够了。平台侧的接入能力是够用的但设备端的能力参差不齐。比如有些支持云台的设备旋转速度并不像官方文档说的那样完全线性有些设备的红外补光开关和“日夜模式切换”存在绑定关系你在物模型里只是关掉了补光结果设备自动跳转成了彩色模式。这些信息平台不在文档里写只能靠你实际测试去摸清。最后分享一个小技巧在萤石开放平台调试API时官方控制台自带的“API调试工具”很方便但它的默认参数有时候是旧版本的。如果你发现用调试工具成功了、用自己代码请求却失败优先检查请求头。开放平台的大多数接口是application/x-www-form-urlencoded格式你用JSON格式提交的时候签名校验就可能过不了。我就是在这类问题上耗过不少时间所以现在不管做哪个平台的对接第一步都是先用Postman或者curl把最基础的token请求跑通确认接口风格没问题再上代码。这个消息虽然小但能帮你省大把时间。
返回列表