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 的目标。
以下介绍各个字段及其含义:
字段 |
描述 |
|---|---|
|
这是保留的未使用字段,必须始终设置为 0。 |
|
这表示所使用的协议版本,应设置为 0b01 以使用较新的 SMP 传输,其中错误码更详细并会在映射中返回;否则保留为 0b00 以使用旧版 SMP 协议。版本 0b10 和 0b11 保留供将来使用,不应使用。 |
|
|
|
为标志保留;目前尚未定义任何标志,该字段应设置为 0 |
|
|
|
|
|
这是帧序列号。每发送一个请求帧,该编号就加一。响应中的 Sequence Num 应与请求中的一致。 |
|
这是 |
|
这是 |
备注
Data 的内容取决于 OP、Group ID 和 Command ID 的值。
管理 Group ID
SMP 协议支持预定义的公共组,并允许用户定义的组。下表列出了常见组:
十进制 ID |
组描述 |
|---|---|
|
|
|
|
|
|
|
|
|
应用程序/系统日志管理(Zephyr 当前未使用) |
|
运行时测试(Zephyr 未使用) |
|
拆分映像管理(Zephyr 未使用) |
|
测试使应用程序崩溃(Zephyr 未使用) |
|
|
|
|
|
|
|
这是用于定义应用程序特定管理组的基础组。 |
上述组(用户组,即 64 及以上的组除外)的有效载荷始终采用 CBOR 编码。64 及以上的组可以定义自己的数据通信方案。
最小响应
无论发出什么命令,只要请求的另一端有 SMP 客户端,就应发出包含头以及随后 CBOR 映射容器的响应。仅当没有 SMP 服务或设备无响应时,才允许缺少响应。
最小响应 SMP 数据
最小响应为:
{
(str)"err" : {
(str)"group" : (uint)
(str)"rc" : (uint)
}
}
{
(str)"rc" : (int)
}
其中:
“err” -> “group” |
组错误码所属的 |
包含组错误码的索引。仅在使用 SMP 版本 2 且非零(错误状况)时出现。 |
“err” -> “rc” |
“rc” |
|
请注意,在命令成功的情况下,将返回空映射(仅当存在错误状况时才会返回 rc/err,因此如果只返回空映射,或者响应中没有这些字段,则可以认为请求成功。对于 SMP 版本 2,与 SMP 自身相关但不特定于组的错误仍将作为 rc 错误返回,因此 SMP 版本 2 客户端必须能够处理这两种类型的错误。