2. FDO协议架构:协议栈、实体角色与工作流程

聊FDO之前,我先说说自己的感受。第一次看FDO规范时,说实话有点懵——协议栈好几层,实体角色好几个,流程还分阶段。但真正动手做项目后才发现,这东西设计得其实挺巧妙。今天我就把FDO的骨架给你拆开讲清楚。

2.1 FDO协议栈:分层解耦的设计哲学

FDO协议栈分四层,从上到下分别是:应用层、传输层、安全层和物理层。我习惯把它理解成「洋葱结构」——每一层只关心自己的事,层与层之间通过标准接口通信。

核心思想:FDO不绑定任何特定传输协议或安全算法。你可以今天用MQTT,明天换CoAP,后天改HTTPS——只要每层接口不变,上层代码几乎不用动。

下面这张图是我自己画的协议栈结构,你看一眼就能明白各层的关系:

FDO协议栈分层架构 应用层(Application Layer) 设备初始化指令、所有权转移指令、状态查询指令 传输层(Transport Layer) MQTT / CoAP / HTTP / WebSocket / 自定义协议 安全层(Security Layer) TLS 1.3 / DTLS / OSCORE / 数字签名验证 物理层(Physical Layer) 以太网 / Wi-Fi / BLE / Zigbee / LoRa / 串口 各层通过标准API解耦,替换底层不影响上层业务逻辑

每层的作用我简单说一下:

  • 应用层:定义设备初始化、所有权转移、状态查询等业务指令。说白了就是「设备该干什么」。
  • 传输层:负责消息的可靠投递。你可以选MQTT做长连接,也可以用HTTP做短连接——看场景。
  • 安全层:保证通信的机密性和完整性。TLS是标配,但资源受限设备可以用DTLS或OSCORE。
  • 物理层:最底层,管数据怎么在线上跑。以太网、Wi-Fi、BLE都行。

我的经验:做智能家居网关项目时,我们一开始用MQTT+TCP,后来客户要求支持低功耗蓝牙设备。因为FDO协议栈是分层的,我们只改了物理层和传输层,应用层代码一行没动。这就是分层设计的好处。

2.2 FDO实体角色:三个核心参与者

FDO定义了三个实体角色:设备(Device)、所有者(Owner)和服务商(Service Provider)。我刚开始学的时候总觉得「所有者」和「服务商」分不清,后来用一句话就记住了:设备是谁买的,谁就是所有者;设备连到谁的平台,谁就是服务商。

角色 英文 核心职责 典型代表
设备 Device 出厂时预置凭证,等待被初始化 传感器、网关、智能锁
所有者 Owner 购买设备后,执行所有权转移 企业IT部门、个人用户
服务商 Service Provider 提供设备管理平台和业务服务 阿里云IoT、AWS IoT Core

这三个角色之间的关系,我用一张流程图来展示:

FDO实体角色关系图 设备(Device) 预置凭证,等待初始化 所有者(Owner) 执行所有权转移 服务商(SP) 提供管理平台 设备→所有者:所有权转移(TO0/TO1/TO2协议) 设备→服务商:设备注册与数据上报 所有者→服务商:授权委托(虚线表示可选)

注意:所有者和服务商可以是同一实体,也可以是不同实体。比如你买了一个智能插座,你自己就是所有者,同时你也可以自己搭建服务器当服务商。但大多数情况下,普通用户会把管理权委托给云平台。

2.3 FDO工作流程:三阶段搞定设备初始化

FDO的工作流程分三个阶段:TO0(所有权预登记)、TO1(所有权转移)和TO2(所有权确认)。我当年第一次看这三个阶段时,觉得名字起得真绕。后来我换了个角度理解:TO0是「打招呼」,TO1是「握手」,TO2是「签字画押」。

2.3.1 TO0阶段:设备先「报到」

设备上电后,第一件事就是找服务商报到。它会发送自己的设备凭证(比如公钥哈希),服务商验证后把设备信息登记到待转移列表里。这个阶段不涉及所有权变更,只是让服务商知道「有个设备来了」。

关键点:TO0阶段设备和服务商之间不需要建立安全通道。设备只发送公开信息,不涉及私密数据。我见过有人在这个阶段就上TLS,其实没必要——浪费资源。

2.3.2 TO1阶段:所有者「认领」设备

所有者通过服务商平台发起所有权转移请求。服务商验证所有者身份后,把设备的连接信息(比如IP地址、端口)告诉所有者。然后所有者和设备直接建立安全连接,交换所有权凭证。

这个阶段我踩过坑。有一次在TO1阶段,设备返回的凭证格式不对,所有者解析失败。查了半天才发现是设备固件里把凭证的字节序搞反了。所以我的建议是:TO1阶段的凭证交换一定要做格式校验。

2.3.3 TO2阶段:最终确认

TO2是最后一个阶段。所有者和设备互相确认所有权转移完成,设备更新本地状态为「已归属」,所有者保存设备的最终凭证。至此,设备正式归所有者管理。

我把三个阶段的核心差异整理成了一张表:

阶段 参与方 核心动作 安全要求
TO0 设备 → 服务商 设备登记,发送公开凭证 无(公开信息)
TO1 所有者 ↔ 设备 凭证交换,建立信任 必须加密+签名
TO2 所有者 ↔ 设备 最终确认,状态更新 必须加密+签名

下面这张流程图把三个阶段串起来了:

FDO三阶段工作流程 阶段一:TO0 — 所有权预登记 设备上电 → 发送公开凭证 → 服务商登记到待转移列表 安全要求:无(仅公开信息) 阶段二:TO1 — 所有权转移 所有者发起请求 → 服务商转发设备信息 → 凭证交换 安全要求:TLS/DTLS加密 + 数字签名验证 阶段三:TO2 — 所有权确认 双方确认转移完成 → 设备更新状态 → 所有者保存凭证 安全要求:TLS/DTLS加密 + 数字签名验证 三个阶段必须按顺序执行,不可跳过或颠倒

避坑指南:我曾经在TO2阶段遇到过设备断电导致状态不一致的问题。设备确认了所有权转移,但还没来得及更新本地状态就断电了。解决方案是在TO2阶段加入「两阶段提交」逻辑——先写日志再更新状态,断电恢复后根据日志回放。