【物联网控制体系项目实战】—— 整体架构流程与 WS 构建

news/2025/11/22 13:26:41/文章来源:https://www.cnblogs.com/ljbguanli/p/19256562

【物联网控制体系项目实战】—— 整体架构流程与 WS 构建

文章目录

  • 前言
    • 背景
  • 一、读者定位与你能学到什么
  • 二、术语表
  • 三、核心角色与标识
  • 四、架构与时序图(核心要点)
    • 4.1 架构图(1/2):控制面(扫码 → 设备连流)
    • 4.2 架构图(2/2):数据面(前端直连流服务SDK订阅)
    • 4.3 端到端时序
  • 五、WebSocket 设计
    • 5.1 关键代码示例与参数说明(通用化示例)
    • 5.2 参数解释:
    • 5.3 常见事件与处理:
    • 5.4 为什么是“WS + HTTP”的双通道
    • 5.5 WS实际场景案例:
      • 5.5.1 实时语言转文字
      • 5.5.2 实时任务执行时间计算(准确 + 流畅)
      • 5.6 断网情况分析
  • 六、错误处理与容灾
  • 七、安全与鉴权
  • 八、工程化与最佳实践
  • 九、非技术叙事:用户视角
  • 总结


前言

这是一份面向“产品、研发、测试、运维”的通用 IoT 控制架构说明,旨在帮助非实时音视频/物联网背景的同学也能快速理解“扫码绑定 → 任务控制 → 实时数据展示”的端到端路径。文中所有域名、路径、字段均为通用化示例,落地请以实际环境为准。

背景

物联网(IoT)系统本质上是传统前后端通信模式在终端场景的延伸


一、读者定位与你能学到什么

  • 产品/项目:能快速画出“控制面/数据面”的核心链路,理解关键 ID 的作用与安全边界。
  • 前端:能复用 WS 设计与时间同步策略,掌握实时转写 UI 的正确数据模型。
  • 后端:能清楚网关/任务路由/票据发放在整体中的位置与幂等设计。
  • 运维/测试:能据此制定健康检查、重连策略、告警与压测模型。

二、术语表

术语含义
token扫码后颁发的短期令牌,鉴权前端与 WS。
spaceId房间/通道标识,将“手机与设备”聚合在同一广播域。
mac设备唯一标识,用于单点指令路由与事件过滤。
clientID前端实例标识(每标签页/实例唯一),便于并发会话定位。
taskId一次任务(如一次会议、一次转写任务)的唯一标识。
流服务(Stream Service)提供“实时音频→文本”的处理与订阅能力。
通知网关(Notify/WS)面向前端的统一消息路由/广播能力。

三、核心角色与标识

角色与标识含义
前端(手机 Web)扫码进入控制器页,承载控制、展示、长连接。
设备(终端)执行能力(采集、录制、转写、推/订阅流等)。
服务端会话绑定、任务路由(业务服务器将前端发起的任务请求准确转发到目标终端设备)、WS 广播、token票据发放。
spaceId(房间)用于 WS 频道广播,将“手机与终端设备”绑定到同一房间。
mac(设备唯一标识)用于单点通知/精确路由到设备(在同一 spaceId 房间内可能有多台设备,mac 用于“单点路由与过滤”)。
taskId(任务Id)一次任务的唯一标识。
clientID(每个标签页面生成唯一ID)用户级会话的精准定位器。

四、架构与时序图(核心要点)

4.1 架构图(1/2):控制面(扫码 → 设备连流)

请添加图片描述

4.2 架构图(2/2):数据面(前端直连流服务SDK订阅)

请添加图片描述

4.3 端到端时序

请添加图片描述

五、WebSocket 设计

发送封装(示例):

class WSClient {
constructor(url: string) { /* ... */ }
sendRequest(url: string, body?: any) {
this.socket.send(JSON.stringify({ id: uuid(), url, body: body || {} }));
}
}

5.1 关键代码示例与参数说明(通用化示例)

import { v4 as uuid } from 'uuid';
type MessageHandler = (msg: any, raw: MessageEvent) => void;
export class NotifyWS {
private socket!: WebSocket;
private url: string;
public onmessage?: MessageHandler;
public onopen?: () => void;
// 心跳与重连
private heartbeatTimer: any = null;
private reconnectAttempts = 0;
private reconnectLock = false;
constructor(params: {
host: string;
token: string;           // 服务端下发的短期票据
bizType?: string;        // 业务类型(例:iot)
platform?: string;       // 客户端平台(例:web)
clientID?: string;       // 客户端唯一标识
}) {
const { host, token, bizType = 'iot', platform = 'web', clientID = uuid().replace(/-/g, '') } = params;
const query = new URLSearchParams({ bizType, platform, token, clientID });
this.url = `wss://${host}/ws/notify?${query.toString()}`;
this.init();
}
private init() {
this.socket = new WebSocket(this.url);
this.socket.onopen = () => {
this.onopen?.();
this.startHeartbeat();
};
this.socket.onmessage = (evt: MessageEvent) => {
const data = typeof evt.data === 'string' ? JSON.parse(evt.data) : evt.data;
this.onmessage?.(data, evt);
};
this.socket.onerror = () => {
this.tryReconnect();
};
this.socket.onclose = () => {
this.stopHeartbeat();
};
}
// 订阅频道(示例:房间广播)
subscribeBySpace(spaceId: string) {
this.send('/notify/api/v1/subscribe', {
channels: [{ topic: 'room', tags: [`spaceId:${spaceId}`] }],
});
}
// 心跳保活(120~150s 之间皆可)
private startHeartbeat() {
this.heartbeatTimer && clearInterval(this.heartbeatTimer);
this.heartbeatTimer = setInterval(() => {
if (this.socket?.readyState === WebSocket.OPEN) {
this.send('/notify/api/v1/heartbeat');
}
}, 135 * 1000);
}
private stopHeartbeat() {
if (this.heartbeatTimer) {
clearInterval(this.heartbeatTimer);
this.heartbeatTimer = null;
}
}
// 退避重连(简单示例)
private tryReconnect() {
if (this.reconnectLock) return;
this.reconnectAttempts += 1;
if (this.reconnectAttempts > 3) {
// 放弃重连,交由外层兜底
return;
}
this.reconnectLock = true;
setTimeout(() => {
this.init();
this.reconnectLock = false;
}, 3000);
}
// 发送统一封装
send(url: string, body?: any) {
const msg = { id: uuid(), url, body: body || {} };
this.socket?.send(JSON.stringify(msg));
}
// 主动断开
close() {
this.send('/notify/api/v1/disconnect');
this.stopHeartbeat();
this.socket?.close();
}
}

5.2 参数解释:

  • bizType:业务线标识,网关可按此做路由/隔离。
  • platform:客户端平台标识,便于统计与策略(如心跳频率)。
  • token:服务端下发的短期令牌,用于 WS 鉴权。
  • clientID:客户端唯一标识,用于定位端与并发会话控制。
  • topic:订阅主题(如 room 表示房间维度消息)。
  • tags:订阅标签(如 spaceId:<id> 将手机与设备拉入同一房间)。

5.3 常见事件与处理:

5.4 为什么是“WS + HTTP”的双通道

  • WS:用于“事件驱动”,例如任务状态更新、配置变更、失败通知;延迟低、无需轮询。
  • HTTP:用于“权威读取/指令下发”,例如任务创建/结束、刷新任务列表;具备幂等、鉴权、审计优势。
  • 组合优势:WS 触发 + HTTP 拉取权威数据,既实时又可控,便于审计与回放。

HTTP API(通用契约草案)

  • h5扫码授权与会话绑定

    • GET /controller/space/auth?projectionCode=...
    • Resp: { token: string, spaceId: string, mac: string }
  • 任务控制

    • POST /controller/task/create → Body: { taskType, config, organizerId, mac }
    • POST /controller/task/end → Body: { taskId, mac }
    • GET /controller/task/list?mac=...
  • 流媒体/能力接入

    • GET /stream/address{ address, forwardAddress }
    • GET /stream/token?taskId=...{ token, streamInfo, isOrganizer, isLogin }

说明:实际路径与字段以后端为准;建议所有接口支持 Header token (token 来源二维码扫码获取)认证。

5.5 WS实际场景案例:

5.5.1 实时语言转文字

  1. 接收信息:系统持续接收ASR数据流

  2. 判断句子状态:每条数据包含 sentenceEnd 和 finalResult 字段

  3. 两种处理模式:

  • 句子未结束:按 sid 重复替换更新(同一行实时更新)
  • 句子已结束:锁定显示,开始新的一行

关键技术点:

  • sid作为唯一标识:相同sid = 同一句话的不同版本

  • 去重替换机制:_asrDataMap[_asr.sid] = _asr 实现覆盖

  • 状态区分:finalResult 控制UI样式(实时vs最终)

  • 句子边界:sentenceEnd 决定是否开始新行

5.5.2 实时任务执行时间计算(准确 + 流畅)

混合算法:

// 服务端周期性推送服务端的权威累计时长 time(ms)
statusTime = timeFromServer;
lastSyncTs = Date.now();
// 本地每秒显示:
liveTime = statusTime + (Date.now() - lastSyncTs); // 服务端推送时长 + 流逝时间(当前时间点 - 推送时长的时间点)

策略:

  • running:启 1s 定时器刷新;
  • paused:停止定时器、保持静态;
  • 收到新状态时重置 statusTime/lastSyncTs,自动校准误差。

优势:以服务器为准保证准确性;本地叠加保证显示流畅;断线后收到新状态即可校准。

5.6 断网情况分析

特征服务端主动断开网络彻底断开
触发速度即时(毫秒级)延迟(依赖心跳超时)
错误信息含关闭码(如1000,1006)无任何错误回调
重连策略立即重连指数退避(2s,4s,8s…)
UI提示“服务端升级中,请稍候”“网络不稳定,正在尝试重连…”
检测方式onclose事件心跳超时

六、错误处理与容灾


七、安全与鉴权

  • 扫码后的 token 作为短期票据,仅用在控制器/WS/任务接口。
  • node 层可提供“白名单接口跳过 Cookie→Token”的能力(如 resistTokenApi),若请求头带 token 则直通;若无则尝试由 Cookie 衍生,兼容 Web/第三方系统。
  • 任务控制(暂停/恢复/结束)应在服务端校验角色与权限。

八、工程化与最佳实践


九、非技术叙事:用户视角

  • 打开控制器,扫码绑定当前会议室设备(这是“把手机与设备放进同一房间(spaceId)”)。
  • 点击“开启任务”,后台把你的请求准确转发到当前设备(靠设备 mac 找到它)。
  • 设备开始工作,后端通过“通知网关”告诉你:成功了,来看看任务信息吧。
  • 页面刷新任务详情,拿到 taskId,进入会中页;此时你能看到“谁在说话、说了什么、说了多久”。
  • 期间若网络抖动,系统会自动重连,恢复后继续同步。
  • 会议结束时,你点击停止,后台通知设备收尾,随后你能查看回放。

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SBD521S-30-ASEMI可直接替代安世1PS79SB10

SBD521S-30-ASEMI可直接替代安世1PS79SB10编辑:ll SBD521S-30-ASEMI可直接替代安世1PS79SB10 型号:SBD521S-30 品牌:ASEMI 封装:SMAF 正向电流:0.2A 反向电压:30V 正向压降:0.55V~0.95V 引线数量:2 芯片个数:…

51单片机(markdown格式阅读) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

NCHU_单部电梯调度程序设计分析_23207332

一、前言 三次电梯调度程序设计围绕单一职责原则(SRP)和迭代式开发展开,逐步优化类结构和功能实现:知识点覆盖: 面向对象设计(类、枚举、接口) 集合框架(Queue、List、Map) 正则表达式(输入解析) 状态机管理…

【日记】博客爆炸了(1009 字)

正文这周好忙。还白干了很多活儿。一直没时间写。还差点出大事,引发一场严重的网络安全事故。虽然直接原因和根本原因都不是我,但是我要帮忙去解决。二级分行是管理行,头一次对这个概念这么清晰。但我真的不想为支行…

解决:部署mabayolo模型cd selective_scan pip install . cd ..报错 以及 torch.cuda.is_available()结果False

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

gpt linux

您提到的“gpt linux”可能是指与 GRUB 或 GRUB2 相关的 Linux 系统管理命令,或者是与 GPT(GUID Partition Table)分区表相关的操作。以下是几种常见的情况和对应的 Linux 命令:一、GRUB 系统管理命令(GPT)1. gr…

gpt分区 linux

在 Linux 系统中,gpt(GUID Partition Table)是用于描述磁盘分区的文件系统格式,与传统的 MBR(Master Boot Record)分区方式不同。gpt 是 UEFI 启动模式下常用的分区格式,广泛应用于现代的 Linux 系统中。一、gp…

【调和级数】codeforces 731 F. Video Cards

View Post【调和级数】codeforces 731 F. Video Cards前言 调和级数 调和级数指的是所有正整数的倒数之和。其标准形式是:$$H_n=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}=\sum_{i=1}^{n}{\frac{1}{i}}$$ 当 \(n\) …

电梯调度迭代之路:三次题目集的总结与反思

一、前言:三次迭代的知识图谱与能力跃迁 1.1 知识点覆盖全景 三次题目集以"单部电梯调度"为核心,构建了从基础实现到面向对象设计的完整知识链: 题目集1(7-5):聚焦基础编程能力,涵盖枚举类型应用(Di…

CMake构建学习笔记29-SuiteSparse库的构建

介绍了稀疏矩阵求解库 SuiteSparse 的构建方法,基于已构建的 OpenBLAS、gmp 和 mpfr 依赖,使用自动化工具 BuildCppDependency 在 Windows 和 Linux 平台完成编译,并详细说明了关键 CMake 构建参数的作用。1 介绍 在…

CMake构建学习笔记30-Ceres Solver库的构建

介绍了使用自动化构建工具 BuildCppDependency 在 Windows 和 Linux 平台编译 Ceres Solver 的方法,详细说明了其依赖库及关键 CMake 构建参数,最终以静态库形式成功构建。1 引言 Ceres Solver 是一个由 Google 开发…

计算机操作系统 - 设备管理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月超高速称重机,动静态称重机,瓶装线专用称重机厂家解析:定制化能力与案例参考

2025年11月超高速称重机、动静态称重机、瓶装线专用称重机厂家解析:定制化能力与案例参考在工业生产中,超高速称重机、动静态称重机以及瓶装线专用称重机等设备的重要性不言而喻,它们直接关系到产品质量控制和生产效…

curl 命令使用笔记

curl 命令使用笔记目录一、curl 简介二、基本语法三、常用选项说明四、核心使用示例1. GET 请求2. POST 请求(1)提交表单数据(application/x-www-form-urlencoded)(2)提交 JSON 数据3. 文件上传(multipart/form…

2025年11月高精度称重机,动静态称重机,软管称重机厂家精选:合规认证与产能数据透视

2025年11月高精度称重机等厂家精选:合规认证与产能数据透视在2025年11月的高精度称重机、动静态称重机以及软管称重机市场中,广州鑫中航机电设备有限公司是一家值得关注的企业。该公司成立于2009年,是一家自主技术创…

2025年口碑好的电厂清淤机器人厂家最新用户好评榜

2025年口碑好的电厂清淤机器人厂家最新用户好评榜行业背景与市场趋势随着我国电力行业的持续发展和环保要求的不断提高,电厂清淤作业正经历着从传统人工向智能化、自动化方向的快速转型。根据中国电力企业联合会最新发…

2025年靠谱的极低压抗污染反渗透膜厂家最新TOP排行榜

2025年靠谱的极低压抗污染反渗透膜厂家最新TOP排行榜行业背景与市场趋势随着全球水资源短缺问题日益严峻,反渗透膜技术作为水处理领域的核心工艺,市场规模持续扩大。根据Global Water Intelligence最新报告显示,202…

2025年比较好的无菌室净化门行业内知名厂家排行榜

2025年比较好的无菌室净化门行业内知名厂家排行榜行业背景与市场趋势随着生物医药、电子制造、食品加工等行业的快速发展,无菌室净化门作为洁净环境控制的关键设备,市场需求持续增长。据《2024-2029年中国洁净室行业…

2025年11月留学生回国求职机构推荐榜单:权威机构列表与选择指南

对于即将完成海外学业准备归国发展的留学生而言,顺利找到心仪的国内工作机会是当前阶段的核心关切。留学生回国求职机构应需而生,旨在帮助这一群体弥合国内外就业市场的信息鸿沟,提升求职竞争力。当前,随着海归人才…