- 博客(238)
- 资源 (604)
- 收藏
- 关注
原创 外部系统不连设备,只订阅 /message 开头的十四个主题
十四个主题、一个信封、一个写出口,构成了 SagooIoT 的北向事件面;那十个 controller 构成了按需拉取的一面。两者加起来,第三方系统接入时只需要做三件事:订阅/message/#、按messageId去重、需要写操作时用 AK/SK 签名调 HTTP。设备侧那些协议细节——Modbus 的字节序、网关的批量帧、属性值的类型转换——全部留在平台内部。对接方理解成本越低,平台被替换的成本就越高。
2026-11-05 07:34:18
228
原创 网关下面挂了三十台设备,平台只看到一条连接
回头看开头那两个数字:Broker 的 1 和平台的 31。差的 30 不是"没连上的设备",而是"不需要自己连的设备"。把"谁在传"和"这是谁的数据"彻底分开。传的一方是网关——一条连接、一个 clientId、一套 TLS;数据的一方是子设备——各自的物模型、各自的子表、各自的影子、各自的在线键。中间那层identity就是两者之间的翻译。它让一台网关可以体面地替三十台设备说话,也让平台在面对三十份数据时,不必知道它们是从哪条连接来的。---
2026-11-04 07:33:37
206
原创 SagooIoT 的数据接入层只有四张表,却能接住三种外部数据
四张元数据表,三个来源类型,两个合并策略,一个GET接口。从代码量上看,datahub在专业版里不算大,四千四百多行,比设备管理、告警、规则引擎都小。让"第三方数据"和"设备数据"在同一个模型里对话,而不需要为每个项目写一套一次性脚本。下次再有人问"你们平台能不能对接我们现有的 ERP 数据",答案不是"可以定制开发",而是"新建一个数据源,把字段拉一下,点发布"。
2026-11-03 07:35:03
157
原创 固件推下去了,SagooIoT 怎么确认设备真的装上了?
回头看,SagooIoT 的 OTA 做的事情可以概括成四句话。用模块、包、批次、明细四层把"发什么"和"发给谁"彻底拆开,包可复用、批次可停启、明细可逐台追。签名在服务端对落盘字节重算,不采信任何外部传入的值;url 与 ossurl 分开,签名和下载各走各的。下发有推、补、拉三条路:在线立刻推,离线等上线补,设备自己问就登记并给地址。三条路彼此不重复。状态由设备回执驱动,收口由平台自动完成。人只发起,剩下的交给 step 和那一次上线检查。
2026-11-02 07:37:11
220
原创 单机、哨兵、集群:SagooIoT 把三种 Redis 部署收进一个字段
回头看开头那三件事:换哨兵、换集群、换多地址,它们在这套代码里被收敛成「改mode和address两行」。支撑这个结论的不是 switch 本身,而是 switch 三段的参数完全对齐、地址统一按列表解析、对外只暴露这一层抽象。真正让部署形态可以随时切换的,是「连接的行为特征不随部署形态改变」这件事。另一半在连接管理上:两种用连接的路径各司其职,Pipeline 固定落一条连接,连接错误与业务错误分开处理,池子按操作类型分组并带上下限,健康检查每 30 秒把「够不够用、回没回来」写成一行日志。
2026-11-01 07:34:13
184
原创 跟着一条属性报文走一遍 SagooIoT 的接入链路
它进站时只是一段 96 字节的字节流,出站时已经变成了四种形态:时序库里的历史、缓存里的当前值、规则引擎的输入、业务系统的消息。从我被 Broker 收到,到我变成时序库里的一行、缓存里的一份影子、告警规则里的一个输入、业务系统收到的一条北向消息,中间隔着十几步。十二步里,只有第 6、7、8 三步是"必须当场算完"的,其余都可以异步、可以批、可以延后。状态更新只是"记一笔这设备刚说过话",和报文处理没有依赖关系,让它独立跑,业务侧就不会被它拖慢,它也不会因为业务侧排队而延迟。前面走的都是 MQTT。
2026-10-31 07:34:34
166
原创 SagooIoT 用一份物模型同时决定表结构与取值
物联网平台里最容易出问题的地方,往往不是协议对接,而是「同一个物理量在不同环节有不同解释」:设备说 235(0.1℃ 为单位),平台说 23.5℃,数据库存 23(INT),大屏显示 24。每一层都做了自己的四舍五入,最后一圈下来谁也对不上。SagooIoT 的处理方式是把解释权收归一处——物模型说它是 float、两位小数、量程 -40~85,那么解析、告警、影子、时序库、北向全按这个口径来。表结构是它算出来的,值是它裁剪过的,时间是它补齐的。一份配置,管住了从报文到曲线的整条路。---
2026-10-30 07:36:18
346
原创 把规则链存成文件之后,上线一条规则只需改一个字段
规则链是配置,配置就该是文件。因为配置是文件,所以一条链是一个 JSON,cp就是复制,git就是版本管理。因为配置是文件,所以状态只需要一个disabled布尔位——文件在不在是"有没有",disabled是"跑不跑",不需要第三第四个状态。因为配置是文件,所以加载失败可以直接把错误写回文件,让失败原因跟着规则走。因为配置是文件,所以热更新只需重新读文件、原地ReloadSelf,不用重启进程。而"看得见"这件事,是这套设计能落地的另一半。
2026-10-29 07:34:19
206
原创 SagooIoT 每秒刷新的大屏,靠一条不会结束的 HTTP 响应
SagooIoT 里已经有一套 WebSocket 了——设备接入隧道用一条,前端实时推送用另一条。既然有 WebSocket,为什么监控面板还要单独做一套 SSE?维度SSEWebSocket方向服务端 → 客户端单向双向协议普通 HTTP,文本独立握手,文本/二进制帧自动重连内置,带要自己写代理/网关与普通 HTTP 请求一致部分老代理会拦 Upgrade断线语义一次请求结束 = 该重连要维护连接状态机服务端实现一个 handler +Flusher。
2026-10-28 07:36:05
174
原创 影子不是缓存:SagooIoT 为什么要为每台设备维护两份状态
回到开头那张对不上的表。两份状态、四个元数据字段、一条只增不减的版本线、十个写协程和一个每分钟的检查器——pkg/shadow这一千四百多行其实只在做一件事:把"设备现在是什么"和"我们希望它是什么"这两个问题分开存、分开答,并且在两者之间留一条能查、能等、能超时的路。物联网系统里最难处理的状态,从来不是某一时刻的值,而是"值在变化中"的这段时间。设备离线、指令在途、固件重启、网络抖动,这些情况占掉了大部分运维精力。
2026-10-27 07:33:07
204
原创 SagooIoT 把协议解析和消息通知都放进了独立进程
回头看这九个二十多兆的文件,能让它们各就各位的其实就四件事:一是边界窄。跨进程只传DataReq和JsonRes,一个字节片进、一棵 JSON 树出,插件内部怎么实现,宿主不管。二是契约小。协议插件三个方法,通知插件两个方法,Info()自描述,EncodeDecode对称,Send一个参数。三是身份清楚。MagicCookie 对暗号,文件名定 ID,info.json描述元信息,表决定启不启用。四是生命周期有人管。懒启动省内存,人工启用可预热,五秒心跳防孤儿,并发 Kill 保退出干净。
2026-10-26 07:33:50
178
原创 SagooIoT 的观测入口只有一个,出口有三个
可观测性这件事,难点很少在"要不要做",而在"接在哪里"。接在每个进程的main里,十个进程就是十份重复代码;接在一个统一入口上,加进程只需要复制一段main。里一行InitTrace,配置里一个,日志靠 gf 的全局配置,剖面靠。三个开关、一个入口,剩下的都是适配器的事——把标准库的、slog的、Broker 的日志,统统导进同一份文件。代码量不大,一百多行、一百来行,但把"起不来时也能看见"、"退出前把队列刷干净"、"两种地址写法都能接"、"两个地方都能关日志"这些容易漏的边角都照顾到了。
2026-10-25 07:33:54
226
原创 设备报文怎么变,SagooIoT 只约定三个函数名
设备接入这件事,难的部分从来不是"支持多少种协议",而是"这一台和上一台差在哪"。差在字段名,就不该动代码;差在字节序,才该动插件。SagooIoT 用一个字段和三个函数名(parsesendreply),把前者从编译期挪到了运行期。它不是什么新概念,但确实把现场那句"这个要排期"变成了"这个我自己改一下"。
2026-10-24 07:33:32
138
原创 SagooIoT 的上下线事件全部来自 Broker 的 $SYS 主题
上线是SetExif err!= nil {g.Log().Debug(ctx, "更新设备交线状态失败", err)return为什么不是Del?因为平台里"设备离线"不止一个来源:MQTT 的断开事件、TCP 通道的心跳超时、数据上报里超过的静默。如果每个来源都自己去写离线态,就会有三份实现、三种边界、三个地方的隐患。把状态键的寿命改短。真正执行离线处理的是键过期事件。的init()于是无论离线是"Broker 说断了"、"心跳超时了"还是"很久没数据了",最后都走同一条内存路径。
2026-10-23 07:34:35
290
原创 SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
把这套缓存拆完,会发现它的技术含量不在某个巧妙的算法上,而在几个"边界划得干净"的决定:配置是三选一,装配只有一处,业务侧只有一个入口;文件后端用 sha256 把任意键折成合法文件名,用绝对时间戳记到期,用读路径做惰性过期;键名统一带前缀,让"摘一条"成为默认操作而不是最后手段;常驻的配置类数据和带 TTL 的状态类数据分开对待,各用各的失效方式。这些东西单看每一条都很朴素。但物联网平台的缓存层最容易出的问题,恰恰不是性能不够,而是"不知道哪份数据是旧的"。
2026-10-22 07:35:14
350
原创 我们怎么把多种时序库接到同一套业务上
pkg/tsd是个挺可惜的包。它的骨架是对的:接口在tsd、数据结构在comm、实现在internal、工厂在最外层,依赖方向干净;tdengine那一套 SQL 拼装虽然朴素,但建超级表、建子表、加标签、加字段全都真做了,column()里物模型类型到 TDengine 类型的映射也是完整的一比一。问题出在"第二个实现"上。能空的空着,能恒真的恒真,能删的删数据。36 个方法里有 12 个到了这个状态,而接口上没有任何一处提示。这件事的教训不在"代码写得糙",而在抽象的顺序。
2026-10-21 11:08:37
229
原创 专业版守核心,企业版做增量:SagooIoT 的跨模块能力出口
SagooIoT采用专业版与企业版双module分层架构,通过Go的internal机制隔离核心实现,以pkg/proxy为唯一跨模块调用出口,确保专业版独立演进、企业版灵活增量。该设计实现核心能力纯净、业务复用统一、交付组合灵活,避免代码污染与耦合,提升可维护性与扩展性,是物联网平台分层演进的工程化实践。
2026-10-20 07:34:21
199
原创 SagooIoT 设备日志攒批进 Redis,卡在一把锁和一个提前返回上
一个批处理器的正确性,很少取决于它"攒了多少条",而取决于它在三种异常下的行为:Redis 慢了、写失败了、进程要关了。SagooIoT 这一层在前两种上还算有交代(超时、失败保留重试),在第三种上则是空的——注释承诺了刷盘,代码在刷盘前就把自己关掉了。更值得注意的是一种模式:这套代码里几乎所有问题都不是"写错了",而是"写对了但没接上"。构造函数默认 20、配置默认 50、yaml 里写着 20,三个数字各自成立,凑在一起就是没人说得清实际值;Stop和FlushAll。
2026-10-19 07:33:42
165
原创 接了 8 种工业协议我才明白,「支持多少种协议」是个伪指标
某20年老厂改造中,面对9类设备、8种工业协议,甲方要求不换设备、不停产、3个月上线。作者仅用11天完成接入,核心在于突破“协议支持数量”伪指标,聚焦语义层非标问题:如DL/T645密码为BCD编码、CJ/T188字节序矛盾、S7读写Length语义不同等。通过抓包验证、逐点通读、差分计量、时间同步等实战方法,实现高效对接。关键启示:手册不可靠,真实报文才是标准;统一出口与隔离故障,比协议数量更重要。
2026-10-18 10:36:16
324
原创 SagooIoT 的 MQTT 客户端把订阅记在一张表里,但有人绕过了那张表
MQTT 的订阅是一份服务端状态,而让它变成了一份易失状态。任何在客户端缓存这份状态的封装,本质上都在做一件危险的事:替服务端记账。要记对,前提是所有写入都必须经过同一个账本。SagooIoT 这张表记对了核心侧,漏掉了规则引擎侧。漏掉的原因不是疏忽,而是封装只提供了「更好走的路」,没有堵住「另一条路」。这种设计在功能验证阶段毫无问题——订阅确实成功了,数据确实在流;只有在断线重连这个低频路径上,两条路的差异才会显现成一次没有日志的数据中断。绕过它会不会立刻出问题。
2026-10-18 07:33:39
232
原创 MQTT 不回话,SagooIoT 给下行指令补了一个应答信箱
用 Redis 的两个命令,给不开 request/response 的 MQTT 装了一层 request/response。是登记,TTL 和超时对齐,过期即作废;是交付,配对成功才发;是等待,一次只认第一条;两个池(channel 池、协程池)负责把等待的成本压住。发指令,sagoo-core收设备回话。这个前提一旦成立,那么"信封放哪、回执发哪、超时谁管"这三个问题就没有太多别的答案了。只做一次配对,不重试、不持久化、不追溯。回执超时就是失败,前端重试由用户决定。
2026-10-17 07:33:52
197
原创 SagooIoT 的定时任务躺在 Redis 里,靠一把 15 秒的锁推进
pkg/worker队列用现成的,调度自己写。asynq 负责一次性任务的延迟、重试、归档和批量聚合;周期任务被压进一个 Redis hash,由每 3 秒一次的扫描推着走,实例之间用一把 15 秒的锁排他,抢不到锁的实例会自己把扫描间隔从 3 秒慢慢退到 10 秒。白名单 +分隔的参数 +CallMethod反射,把「写一个方法」变成了「在后台配一条记录」。代价是这层胶水没有编译期保护,错误只会在运行期以 Debug 日志的形式出现。
2026-10-16 07:34:45
189
原创 连上来的是设备还是浏览器?SagooIoT 两条 WebSocket 通道的分工
它没有追求「一套 WebSocket 框架打天下」,而是按对接方的性质分别实现。设备侧面对的是「连接数可控、报文是字节流、必须记住隧道状态」,所以走独立端口、URL 定身份、二进制帧、隧道入库、上线/下线有明确动作。前端侧面对的是「连接数多、消息是文本、可以不关心连接状态」,所以走主服务、纳秒 ID、文本帧、无缓冲队列、心跳靠 TCP。两种做法都不复杂,难的是别把它们搅在一起——这正是我在读这套代码时觉得最值得记下的一点。
2026-10-15 07:34:07
263
原创 令牌有效,会话已死:SagooIoT 双层令牌的时间窗、续期与吊销
回到开头那张截图。那个exp还有两天的 JWT,确实还有效——只是它已经不在缓存里了。可能用户点了退出,可能管理员把账号禁用了,也可能只是那把EncryptKey换了。无论哪种,平台给出的答案都一样:会话不存在,令牌就是废纸。识别交给 AES 外壳,信息交给 JWT,存在性交给一条带 TTL 的缓存记录。三者各管一段,于是吊销变简单了(删 key),续期变无感了(进窗口重签),claims 也不用下发了(JWT 留在服务端)。代价也很清楚:它不再是"无状态"的。每请求一次要查一次缓存。
2026-10-14 07:34:34
110
原创 线拔了,状态还亮着:SagooIoT 设备在线判定的过期键、两级缓存与上下线链路
回到开头那台被拔了网线的网关。它之所以还亮着,是因为平台对它的最后一次确认发生在 120 秒之前,而这段时间里没有任何信号告诉平台"它走了"。这不是疏忽,是这套机制的显式代价:用"等 TTL 自己到期"换来的是 O(1) 的写入、O(1) 的判定,以及在几万台设备规模下都不需要聚合查询的状态列表。一条带 TTL 的键,把"最后活跃时间"压缩成"是否还在";一个 10 秒的本地副本,把最热的读挡在进程内;一次expired订阅,把被动轮询变成主动通知;三套订阅自检,让这条链路能活过一夜;
2026-10-13 07:33:57
226
原创 一套能真正交付的物联网开源平台 — SagooIoT
SagooIoT 是一个面向交付的开源物联网平台,解决设备接入后“规则、组态、大屏”难整合的痛点。基于 Go + Vue 3 构建,集成物模型管理、可视化规则引擎、组态工具、视频监控、数据大屏等六大核心组件,支持工业协议(Modbus、OPC UA、IEC 104 等)与边缘离线运行,具备告警治理、场景联动、远程升级等运维能力。提供免费试用与透明授权,5 分钟即可部署,适合工业、园区、系统集成等需完整交付的项目,真正实现“接得进、跑得动、交得出”。
2026-10-13 06:25:56
159
原创 一条消息一个 go,程序先把自己拖垮:SagooIoT 协程池 gpool 的并发闸门、排队与扩缩容
回到最开始那行。它最大的问题不是慢,而是没有边界。设备规模一上来,程序不会温和地变慢,它会先在某一次流量尖峰里崩掉——而且往往不是在收报文的地方崩,是在内存里崩。gpoolsem决定同时多少人干活,taskQueue决定等多久,决定涨到哪,10 秒超时决定一个人最多占位多久。它不追求炫技,用的都是channelsync.Poolatomic这些最朴素的零件,但每一处取舍都指向同一个目标——让并发有上界,让任务不丢。如果你也在写"一收数据就go我的闸门开多大,队列留多长,超时给几秒。
2026-10-12 07:33:49
63
原创 读数是 1008,用电量是 8:SagooIoT 计算服务的增量口径与七种计算策略
回到最开始那块电表。它到今天还是只会报一个绝对读数,不回答"今天用了多少"。中间的差值,得由平台替它算——而且得算得可复现、可解释、能被翻出来对账。SagooIoT 计算服务做的事,就是把这类"算"收进一个统一的入口:七种策略,一个Compute接口,参数不合适就挡在Validate,跑太久就收敛成ErrTimeout。它不追求大而全,而是把"读数→增量→累计"这条最常走的路走得干净,把窗口、聚合、触发拆成正交的参数,让一条业务规则能靠组合拼出来,而不是靠新加一个策略。
2026-10-11 07:35:54
314
原创 同一个值,四个名字,四套口径:SagooIoT 属性上报链路的 Canonical 收敛
给属性上报链路做基线是一件很枯燥的事:固定 10k 设备在线、10k msg/s、每条报文 500 字节上下、平均一条报文带 5 个属性,然后让 benchmark 跑三轮。跑完拿到的第一个数字有点刺眼——一次属性上报,在热路径上要做。67 次里面真正属于业务的没几次。剩下的大部分花在同一个值被反复改名、反复转换上:进来时叫报文字节,解完叫 params,归一后叫 ReportPropertyData,发给下游时又要变成各自投影过的形状。
2026-10-10 16:51:42
212
原创 告警响了一整夜,通知只发出去三条:SagooIoT 告警治理的合并窗口、抑制频率与级别升降
告警治理的难点不在算法,在取舍,而且取舍的结果往往体现在几个不起眼的地方:一条正式告警的键只有来源和类型,所以"什么算同一件事"这件事,其实是由生产方填标签时决定的;合并取最严重的一条、描述只留 5 条,所以Count比更接近真相;升级看CreatedAt、降级看UpdatedAt,两个时间基准不一样,级别会自己往上浮;而频率阈值和通知间隔这两个配置项,因为读写两侧的键名没对齐,目前在默认实现下是空转的。平台做的事,是把这一堆取舍收进一个后台模块里:对外只有一个,进去是原始告警,出来是"该不该惊动人"
2026-10-10 07:47:09
316
原创 标签找得到,值接不上:SagooIoT 接入 EtherNet/IP 的会话、路径与类型
EtherNet/IP 接入的难点不在协议本身,而在四个"看不见"的地方:标签名要变成 EPath 才发得出去;"TCP 通了"之后还有注册会话与开连接两次交互;值的类型是控制器说了算、平台只能接住或接不住;而失败又常常被逐点采集的容错策略吃掉一半。平台做的事,是把这些差异收进一个插件进程里,让上面看到的还是同一套东西——一个点位、一个属性、一条采集周期。标签路径、CIP 路径、类型映射这些协议自己的语言,止步在插件边界。主仓库:https://github.com/sagoo-cloud。
2026-10-09 11:39:07
166
原创 KNX 现场没有寄存器表:SagooIoT 楼宇驱动插件的组地址、DPT 与隧道
在 Modbus、Siemens S7、HART-IP 这些协议里,"读一个值"有明确的因果:平台发一个请求,设备回一个响应,一问一答,谁问、谁答、答的是哪一条,全都是确定的。KNX 不是这样。它的总线是事件型的——温度传感器自己决定什么时候广播一次测量值,开关面板自己决定什么时候广播一次按下动作,没有谁在等谁。平台想拿一个当前值,能做的只是"问一声",然后等总线上有没有人愿意接这句话。有的点会接,有的点永远不接:它只在自己状态变化的时候广播一次,从来不理别人的询问。
2026-10-08 09:15:55
248
原创 4-20 mA 走上网线之后:SagooIoT 接入 HART-IP 的会话、命令与字段
在 SagooIoT 里换一个采集协议,最先要改的往往不是代码,是"点位"这个词的含义。Modbus 的点位是一个寄存器地址,EtherNet/IP 的点位是一个标签名,而 HART-IP 的点位是一对(命令号,响应字段)。这个差别不是命名习惯,它来自协议本身的出身:HART 是长在 4-20 mA 模拟回路上的一套数字协议,一条回路上本来只有一个"当前值",没有地址空间可以编,读什么值靠的是"发哪条命令"。
2026-10-07 09:08:54
209
原创 先应答,再入库:SagooIoT 接入 GB/T 32960 的四层宿主改造
这次改造真正有意思的地方,不是协议本身——GB/T 32960 的编解码在国标文档里写得足够清楚,一个熟练的 Go 工程师照着抄一遍大概两三天。有意思的是平台为了承接它必须改什么。"只写一个协议插件就够了"这个假设,在遇到第一个会话型二进制协议时就破了。帧从哪切、连接属于谁、回应写到哪。这三件事必须由宿主提供,插件才有条件把自己的协议逻辑写好。反过来说,宿主提供的这三样能力必须是可选的、默认关闭的。
2026-10-06 09:16:05
289
原创 同一个寄存器,四种读法:SagooIoT Modbus 驱动的字节序、宽度与功能码
把 1.5 这个数写进两个连续的保持寄存器,再读回来,你可能拿到 1.5,也可能拿到 1078984704;把 25.6 写进一个输入寄存器再读回来,可能还是 25.6,也可能变成 2560。这不是设备坏了,是同一个寄存器在不同的配置下有四种读法。Modbus 从 1979 年活到今天,靠的是极简——一张功能码表、四块存储区、一个大端字节序。而恰恰是这份极简,把「读几个」「按什么顺序拼」「拼出来怎么解释」这三件事全推给了上位机。现场九成的「采到的数不对」,最后都落在本文要讲的这几处。
2026-10-05 09:08:52
276
原创 一个点位,十八种说法:SagooIoT 工业协议驱动插件的共同骨架
驱动插件是主动去问设备的。同一台 PLC 上挂十几个属性、轮询周期又短的时候,平台必须保证同一时刻只有一个请求在飞——Modbus TCP 的一个连接上并发发两条读命令,响应会串在一起。平台的解法是按"连接"加锁。// DriverCapabilities 驱动运行时能力声明。// WriteMode 属性写入模式:smart_key(默认,仅接受 {key,value})// CollectionMode 采集模式:poll / push / subscribe。
2026-10-04 09:12:48
195
原创 插件是个独立进程,不是一份配置:SagooIoT 协议插件开发实操
把一种私有协议接进 SagooIoT,最后交出去的是两样东西:一个编译好的可执行文件,和一个几十行的info.json。压成 zip,从后台上传,插件列表里点一下启用,这条路就通了。平台不用重启,也不用改一行平台自身的代码。代价是得先接受一个设定:你的解析代码不会跑在平台进程里,它会跑在另一个进程里。这个设定决定了后面几乎所有细节——接口签名为什么长这样、传参为什么是[]byte、日志为什么会出现在平台的日志里、插件崩了平台为什么还活着。
2026-10-03 09:06:38
245
原创 权限改了,接口立刻生效,菜单要等重新登录:SagooIoT 权限体系的四道闸门
给一个角色勾完权限,点保存,接口返回 200。让那个用户刷新页面——菜单还是旧的。这不是 bug。在 SagooIoT 的权限体系里,"这个接口你能不能调"和"这个菜单按钮显不显示"走的是两条路:一条每次请求都去数据库问一遍,另一条的结果被缓存到用户下次登录为止。两边的生效时间自然对不上。要把这件事讲透,得先认全它背后的六张表,再跟着一次请求把四道闸门走一遍。
2026-10-02 09:17:02
128
原创 换票的事,平台替你做了几次:SagooIoT HTTP API 数据源的鉴权与 Token 缓存
面向的是"响应不是标准格式"的登录/换票接口,比如 token 藏在或里。字段默认必填说明鉴权请求方法POST否GET / POST鉴权请求地址是登录或换票 URLToken 字段路径建议gjson 点路径,如data.token有效秒数建议响应无expires_in时的兜底(界面常填 7200)注入参数名否写入业务请求的参数名注入模板否用{{token}}占位注入位置header否headerquery鉴权请求 Body{}视接口JSON 对象,
2026-10-01 09:12:43
161
原创 消息是怎么在链子上消失的:SagooIoT 规则引擎执行侧的路由、脚本与副作用
规则引擎的难点从来不在画图上。这条消息现在在哪,下一步为什么没动。而要回答这个问题,就得知道每根线的语义、每个脚本拿到的是什么类型、每个默认值意味着什么。上面十一节里的每一条,都是这个问题的一个侧面。开源组织:https://github.com/sagoo-cloud在线文档:https://iotdoc.sagoo.cn规则引擎的节点文档在文档站的「IoT 平台 → 规则引擎」下,共 45 份,本文只覆盖了执行侧那 32 份里被问得最多的部分。
2026-09-30 09:21:03
58
基于P2P方式的即时通讯源码
2005-12-23
Delphi最新三层源码 1.0
2005-12-23
java实用工具包(新手型)
2005-12-15
Netbit Browser嵌入式浏览器(论文+源码)
2005-12-28
Bea WorkShop Studio (NitroX M7) 系列注册机
2005-12-15
一个基于Struts+Hibernate+MsSql2000的实例
2005-12-15
java实用工具包(大众型)--XML处理
2005-12-15
飞鸽传书Ver2.06源码
2005-12-14
软件成熟度模型CMM入门(PDF格式)
2005-12-23
图像融合算法演示源码
2005-12-31
MyEclipse4.1.0破解文件
2005-12-30
计算机软件需求说明编制指南(DOC格式)
2005-12-23
飞鸽传书Ver2.06
2005-12-14
一个书库的小偷程序
2005-12-20
计算机投标书格式(范本)
2005-12-23
多级联动下拉选择框,动态获取下一级
2006-01-05
PHP设计模式(chm版)
2006-05-22
web下的listview控件
2006-01-05
AJAX开发简略(附源代码)
2006-01-04
WAPM综合网络服务器系统v2.0.3 正式版本 [绿色的]
2006-01-24
CakePHP :: Ajax Demo
2006-01-04
DotArticle 文章管理系统 (asp版) 0.1版
2006-01-05
系统分析师考试论文案例集(第二辑)
2006-01-04
无限菜单之 xml+popup 版(IE5.5+)
2006-01-05
左右侧的树选择节点功能
2006-01-05
从A空间直接下载文件到B空间—RGD 1.5
2006-01-04
skype开发应用程序接口文件(API)中文版
2006-01-10
sajax-0.10
2006-01-04
WebBaker_0.10.0_dev
2006-01-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅