[SECS/GEM研究] (五) SECS-II 是什么
SECS/GEM 协议栈开发笔记 · 第 5 篇基于代码库Libsecs一个 C 实现的 SEMI 协议栈说在前面由于工作的原因本人早些年开发了一套SEMI标准的协议栈用于公司的SECS标准实现为了防止经验遗忘特写下本专辑以免后续忘记。前面几篇聊了SECS-I/HSMS分别来自标准SEMI-E4和SEMI-E37这俩标准其实都是规定如何把消息可靠的送给通讯的对方。那么消息是什么之前一直用SxFy指代真正的业务消息却没解释SxFy到底是啥、括号里那串东西又是什么结构。这一篇就来讨论下消息内部看看 SECS-IISECS-II其实就是SECS协议的消息体标准来自SEMI-E5。SECS-I / HSMS管的数据是怎么运SECS-II 管的是货长啥样。我个人觉得这一层才是整个协议栈里最该花篇幅的——因为设备跟工厂所有对话内容最终都落在这套数据类型上。一、SECS-II 是内容层一句话定位SECS-I 和 HSMS 把消息当不透明的字节流搬来搬去SECS-II 则定义了这些字节流的语法——什么类型、几个元素、怎么嵌套。它不规定你该发什么业务消息那是以后的 GEM 层干的它只规定数据的最小单元长什么样。这个最小单元在 SECS-II 里叫Data Item数据项。这是SECS协议中的最小单元。二、12 种数据类型ItemSECS-II 把数据归成十来种基础类型一般来说其中常用的有 12 种。我把它列成一张表format byte 那列就是它在线上真正的身份证号E5 标准定的类型含义format byte例子LList容器可嵌套0x00L ...BBinary字节串0x20B 0x01 0x02BOOLEAN布尔0x24BOOLEAN 1AASCII字符串0x40A OKI1/I2/I4/I8有符号整数1/2/4/8 字节0x64/0x68/0x70/0x60I4 -100U1/U2/U4/U8无符号整数1/2/4/8 字节0xA4/0xA8/0xB0/0xA0U2 500F4/F8浮点4/8 字节0x90/0x80F8 3.14159标准里其实呢还有个 JIS8那是一个日文旧字符集现在基本没人用了我在我的协议栈中也没去实现有兴趣的可以去阅读SEMI-E5标准文献细心的人这里能看出规律I 系列 format 高字节是 0x6xU 是 0xAxF 是 0x8x/0x9xA/B/Boolean 落在 0x0x~0x4x 档。我想这不是巧合——E5 把类型 每个元素占几字节编码进了一个字节。具体哪几位代表啥我建议直接翻 E5 原文档至于你要说为什么这样定义那我也不知道这是之前的半导体专家标准组织决定的。很多人第一次看 S1F1 / S6F11 这种编号以为是哪家设备厂的内部代号其实完全是 SEMI 标准拍板的跟厂家无关。三、一个 Item 具体是怎么个结构光看类型名不够得知道它在网线上到底几个字节。一个 Item 的线格式就三段[ format byte ] [ length 字段 ] [ 数据体 ]重点在 length 字段——它是可变长的这是 SECS-II 一个很聪明的设计format byte 的低 2 位表示长度字段本身占几个字节1、2 或 3 字节长度 ≤ 255 用 1 字节长度就够了超过 255自动升到 2 字节最多 65535再大就 3 字节。长度这里其实比较搞混我在我的协议栈里面写L::toByteArray()时会先算长度0xff 就把长度字节数加 10xffff 再加 1最后把FORMAT_CODE | 长度字节数写进 format byte再按字节数吐出长度最后递归写子项。如下伪代码思路intnoOfLengthBytes1;if(len0xffff)noOfLengthBytes;// 升到 3 字节if(len0xff)noOfLengthBytes;// 升到 2 字节//1. 写 format byte//2. 写 length 字段1/2/3 字节按 len 大小//3. 递归写子项字节这种设计带来很大的好处一条消息无论多长接收端看一眼 format byte 的低 2 位就知道后面要读几个长度字节、数据有多长完全自描述不用提前约定上限。四、List 嵌套一条消息就是一棵树12 种类型里只有LList是容器它可以装任意 Item包括别的 L。这就让 SECS-II 能表达任意复杂的层级结构——按照数据结构来讲一条消息本质是一棵Item 树。我在代码里面实现L这个类值类型就是std::vectorItemPtrItem 的智能指针数组所以L能add()任意子项子项还能是另一个L。所以可以无限制的嵌套。最终行成一颗可以有任意节点的Item树,这颗树还可以用16进制完整描述。举个真实结构的例子一台设备上报当前状态可能是这样一棵树L (根) ├── A RUNNING ← 状态字符串 ├── U1 1 ← 某开关量 ├── F4 98.6 ← 温度 └── L (子列表) ├── U2 500 ← 产量 └── U2 3 ← 报警数这就是 SECS-II 表达复杂数据的全部秘密用 L 把基础类型一层层包起来。没有 JSON 那种花括号全靠 List 的层层嵌套。一开始不习惯看多了 SML第六节就顺了。五、SxFy 编号到底怎么读回到开头那个SxFy。S Stream流F Function功能。它俩合起来唯一标识这是条什么消息。StreamS—— 主题分类。SEMI 给每个数字段分配了大致主题常用的Stream主题S1设备状态、在线识别、通信建立S1F1/S1F2、S1F13/S1F14S2远程命令、时间、设备信息S5报警AlarmS6事件与报告Collection Event / ReportS7配方Process RecipeS9通信异常 / 错误消息S10终端服务TerminalS11/S12设备控制ControlFunctionF—— 具体操作而它的奇偶性有个标准规定的规矩这个标准是强制性的必须遵循奇数 Function primary主动发起 / 询问偶数 Function reply应答比如 S1F1 是设备问你在吗primaryhost 回 S1F2 “在我是 host”replyS5F1 设备报报警来了host 回 S5F2 “收到”。这个的好处也显而易见看编号就能猜出谁问谁答。再回想第三篇讲的W-bit消息头 stream 字节最高位置 1 表示我这条要你回正好跟奇数询问呼应——primary 消息一般带 W-bitreply 不带。六、SML让人能读的文本表示字节流人眼看不懂调试会疯。SECS-II 配套了一个文本表示法叫SMLSECS Message Language把那棵树写成带尖括号的嵌套文本。上节那棵树的 SML 长这样L[4] A RUNNING U1 1 F4 98.6 L[2] U2 500 U2 3 L[4]表示这是个含 4 个子项的 ListA RUNNING是 ASCII 串U1 1是无符号 1 字节整数。一眼就能看出结构排错时比抓包里的十六进制友好多了。七、小结SECS-IIE5这一层记住这几句它是内容层定义数据的最小单元 Item 和消息结构不关心怎么运12 种基础类型L/A/B/Boolean/I1-8/U1-8/F4/F8每种一个 format byte 身份证Item 线格式 format byte低 2 位标长度字段几字节 可变长长度 数据完全自描述靠 L 嵌套表达任意复杂结构一条消息就是一棵 Item 树SxFy 里 S 是主题、F 是操作F 奇数是询问、偶数是应答跟 W-bit 呼应SML 是消息的文本表示libsecs 支持 Item 树与 SML 双向转换。下一篇聊 SML 更细的用法以及多块multi-block拆分那点事——前面说过 HSMS 一条消息多大都能一次发完但 SECS-II 自己还有一套大消息拆成多块传输的机制跟 SECS-I 那种 254 字节硬砍不是一回事下篇捋清楚。本人不是 SEMI 专家上面这些也是当年啃 E5 文档一点点试出来的哪里理解有偏差评论区直接拍我。

相关新闻

2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望

2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望

2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望 一、芯片层:算力密度与能效比的军备竞赛 2026 年上半年的边缘 AI 芯片市场,呈现出三条清晰的技术路线并行演进的态势。第一条是以 NVIDIA Jetson Orin 系列为代…

2026/10/14 7:24:37 阅读更多 →
2026年AI论文写作工具全景测评与使用指南

2026年AI论文写作工具全景测评与使用指南

1. 2026届AI论文助手全景观察过去三年间,AI论文写作工具经历了从简单语法检查到全流程智能辅助的跃迁。根据Nature最新调研,83%的研究者已在论文创作中至少使用过一种AI工具,这个数字在研究生群体中高达97%。2026年最显著的变化是工具开始深度…

2026/10/14 7:24:37 阅读更多 →
ChinaJoy首日开启,NetMarvel精彩亮相!

ChinaJoy首日开启,NetMarvel精彩亮相!

2026 ChinaJoy已正式拉开帷幕!从展台交流到深度沟通,NetMarvel与来自全球游戏生态的行业伙伴相聚现场,共话移动增长趋势与出海新机遇。三大展台专属福利同步放送——🎁 100%中奖刮刮卡,独家好礼等你来拿💰 …

2026/10/12 10:39:58 阅读更多 →

最新新闻

SQLite+FTS5+BM25构建AI上下文感知能力

SQLite+FTS5+BM25构建AI上下文感知能力

1. “context-mode”到底是什么?别被术语唬住,它本质是让AI真正“听懂上下文”的工程化开关最近在好几个技术群里看到有人问:“context-mode开了没?”、“这个插件依赖context-mode,但文档里根本没说怎么配”&#xff…

2026/10/14 7:24:38 阅读更多 →
不写代码也能搭:AI自动化工作流拆解与实操复盘

不写代码也能搭:AI自动化工作流拆解与实操复盘

我一直觉得,很多非程序员朋友把“AI 自动化工作流”想成了只有工程师才能碰的东西。自己试过一轮之后我反而发现,搭一套能用的 AI 自动化工作流,最核心的难点根本不是写代码,而是怎么把手上那堆乱糟糟的活拆成一条清晰的任务流水线…

2026/10/14 7:24:38 阅读更多 →
游戏研发暑期实习笔试复盘:C++、图形学与算法建模全解析

游戏研发暑期实习笔试复盘:C++、图形学与算法建模全解析

2020年4月11日晚上19:00到21:30,我参加了某游戏大厂的游戏研发暑期实习笔试。2.5小时,没有休息,客观题加四道编程题,考到后面脑子确实有点发木。这不是我第一次接触游戏岗的笔试,但那场题覆盖面很典型,横跨…

2026/10/14 7:23:38 阅读更多 →
dnSpy 实战指南:C# 反编译、IL 编辑与调试技巧

dnSpy 实战指南:C# 反编译、IL 编辑与调试技巧

简介:dnSpy是C#开发与逆向工程中常用的开源反编译工具,面向需要阅读、调试或改造.NET程序集的开发者、安全分析人员与逆向研究者。它不仅能将DLL/EXE反编译为接近原始的C#代码,还内置调试器和代码编辑能力,可在反编译结果中设置断…

2026/10/14 7:23:38 阅读更多 →
PS5串流全攻略:AnyPS5让游戏无处不在

PS5串流全攻略:AnyPS5让游戏无处不在

“AnyPS5”这个标题我第一次看到的时候,第一反应是——又有人在折腾PS5模拟器。深入了解之后发现事情比这有意思得多:它不是让PC去模拟PS5,而是让PS5本身“无处不在”,把客厅里那台只能连电视玩游戏的主机,变成一台可以…

2026/10/14 7:23:38 阅读更多 →
微信小程序洗衣O2O系统架构与实现详解

微信小程序洗衣O2O系统架构与实现详解

1. 项目概述这个洗衣小程序源码系统是我去年为一个本地连锁洗衣品牌开发的O2O解决方案,核心目标是打通线上营销、预约与线下服务的全流程。系统上线后帮助客户将订单量提升了47%,客户留存率提高了32%。现在我把这套经过实战检验的解决方案的架构思路和关…

2026/10/14 7:23:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →