SMP 协议规范

本文介绍简单管理协议(SMP),MCUmgr 使用该协议向设备传递请求并接收来自设备的响应。

SMP 是一种应用层协议。底层传输层不在本文档的讨论范围内。

备注

此上下文中的 SMP 是指用于 MCUmgr 的 SMP(简单管理协议),它与 Bluetooth 中的 SMP(安全管理协议)无关,但 MCUmgr 有用于 Bluetooth 的 SMP 传输。

帧:封装

每个帧由一个头和数据组成。如果底层传输层支持分片,头中的 Data Length 字段可用于重组。当字段长度超过一个字节时,帧采用“大端序”(网络字节序)编码,其形式如下:

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

Res

Ver

OP

Flags

Data Length

Group ID

Sequence Num

Command ID

Data ...

备注

原始规范指出 SMP 应支持接收“小端序”和“大端序”帧,但实际上 MCUmgr 库被硬编码为始终将“网络”侧视为“大端序”。

数据是可选的;当 Data Length 为零时数据不存在。数据的编码取决于组/ID 的目标。

以下介绍各个字段及其含义:

字段

描述

Res

这是保留的未使用字段,必须始终设置为 0。

Ver (版本)

这表示所使用的协议版本,应设置为 0b01 以使用较新的 SMP 传输,其中错误码更详细并会在映射中返回;否则保留为 0b00 以使用旧版 SMP 协议。版本 0b10 和 0b11 保留供将来使用,不应使用。

OP

mcumgr_op_t 决定信息是写入设备还是从设备请求,以及数据包包含的是对 SMP 服务器的请求还是来自 SMP 服务器的响应。

Flags

为标志保留;目前尚未定义任何标志,该字段应设置为 0

Data Length

Data 字段的长度

Group ID

mcumgr_group_t,有关更多详细信息,请参阅 管理 Group ID。

Sequence Num

这是帧序列号。每发送一个请求帧,该编号就加一。响应中的 Sequence Num 应与请求中的一致。

Command ID

这是 Group 内的命令。

Data

这是 Data Length 大小的数据有效载荷。它是可选的,因为 Data Length 可以设置为零,这意味着头之后没有数据。

备注

Data 的内容取决于 OP、Group ID 和 Command ID 的值。

管理 Group ID

SMP 协议支持预定义的公共组,并允许用户定义的组。下表列出了常见组:

十进制 ID

组描述

0

默认/OS 管理组

1

应用/软件映像管理组

2

统计管理

3

设置(配置)管理组

4

应用程序/系统日志管理(Zephyr 当前未使用)

5

运行时测试(Zephyr 未使用)

6

拆分映像管理(Zephyr 未使用)

7

测试使应用程序崩溃(Zephyr 未使用)

8

文件系统管理

9

Shell 管理

63

Zephyr 管理组

64

这是用于定义应用程序特定管理组的基础组。

上述组(用户组,即 64 及以上的组除外)的有效载荷始终采用 CBOR 编码。64 及以上的组可以定义自己的数据通信方案。

最小响应

无论发出什么命令,只要请求的另一端有 SMP 客户端,就应发出包含头以及随后 CBOR 映射容器的响应。仅当没有 SMP 服务或设备无响应时,才允许缺少响应。

最小响应 SMP 数据

最小响应为:

{
    (str)"err" : {
        (str)"group"    : (uint)
        (str)"rc"       : (uint)
    }
}

其中:

“err” -> “group”

组错误码所属的 mcumgr_group_t 组。仅在使用 SMP 版本 2 且返回错误时出现。

包含组错误码的索引。仅在使用 SMP 版本 2 且非零(错误状况)时出现。

“err” -> “rc”

“rc”

mcumgr_err_t 仅在使用 SMP 版本 1 且非零(错误状况)时出现,或者在使用 SMP 版本 2 时用于 SMP 错误。

请注意,在命令成功的情况下,将返回空映射(仅当存在错误状况时才会返回 rc/err,因此如果只返回空映射,或者响应中没有这些字段,则可以认为请求成功。对于 SMP 版本 2,与 SMP 自身相关但不特定于组的错误仍将作为 rc 错误返回,因此 SMP 版本 2 客户端必须能够处理这两种类型的错误。

Zephyr 支持的管理组规范