AT+SYSMFG 命令示例
本文档提供使用 AT+SYSMFG 命令操作 manufacturing nvs 用户分区的详细示例。
介绍
概述
manufacturing NVS 分区包含多个命名空间,每个命名空间包含若干键值对,用于存储不同类型的配置信息。常用的命名空间包括:
命名空间 |
描述 |
相关 AT 命令 |
|---|---|---|
|
出厂参数(模组名称、Wi-Fi 配置、UART 配置等) |
参见 出厂参数配置介绍 |
|
SSL 客户端证书 |
|
|
SSL 客户端私钥 |
|
|
SSL 客户端 CA 证书 |
|
|
SSL 服务器证书 |
|
|
SSL 服务器私钥 |
|
|
SSL 服务器 CA 证书 |
|
|
MQTT 客户端证书 |
|
|
MQTT 客户端私钥 |
|
|
MQTT 客户端 CA 证书 |
|
|
HTTPS 客户端证书 |
|
|
HTTPS 客户端私钥 |
|
|
HTTPS 客户端 CA 证书 |
|
|
WPA2-Enterprise 客户端证书 |
|
|
WPA2-Enterprise 客户端私钥 |
|
|
WPA2-Enterprise 客户端 CA 证书 |
|
|
WebSocket 客户端证书 |
|
|
WebSocket 客户端私钥 |
|
|
WebSocket 客户端 CA 证书 |
查询当前固件实际支持的所有命名空间:
命令:
AT+SYSMFG?响应:
+SYSMFG:"factory_param" +SYSMFG:"client_cert" +SYSMFG:"client_key" +SYSMFG:"client_ca" +SYSMFG:"server_cert" +SYSMFG:"server_key" +SYSMFG:"server_ca" ... +SYSMFG:"mqtt_cert" +SYSMFG:"mqtt_key" +SYSMFG:"mqtt_ca" OK
备注
不同芯片和固件版本支持的命名空间可能不同。
本文档中所有示例的命令响应内容仅供参考,实际输出可能因芯片型号、固件版本和配置而异。
命名空间结构
每个命名空间是键值对的集合。不同命名空间的键命名约定不同:
证书相关命名空间(
client_cert、client_key、client_ca、server_cert、server_key、server_ca):使用<base_name>.<index>格式(例如client_cert.0、client_cert.1)来存储多套证书。factory_param命名空间:使用描述性键名(例如module_name、uart_port、country_code)。ble_data命名空间:使用cfg加索引的格式(例如cfg0、cfg1、cfg2)。
数据类型
AT+SYSMFG 命令中的 <type> 参数表示数据类型:
1:u8(8 位无符号整数,范围:0-255,例如:UART 端口号、信道号)
2:i8(8 位有符号整数,范围:-128 至 127,用于有符号配置值)
3:u16(16 位无符号整数,范围:0-65535,例如:GPIO 引脚编号)
4:i16(16 位有符号整数,范围:-32768 至 32767)
5:u32(32 位无符号整数,范围:0-4294967295)
6:i32(32 位有符号整数,范围:-2147483648 至 2147483647,例如:UART 波特率 115200)
7:string(文本字符串,例如:模组名称 “MINI-1”、国家代码 “CN”、低功耗蓝牙服务配置)
8:binary(二进制数据,例如:证书、私钥)
其他重要说明
长度参数说明:响应中的
<length>参数含义因数据类型而异:对于数值类型(类型 1-6):
<length>表示该数值的字符串表示的字符数。例如,i32 类型的波特率值 115200 显示为 6 个字符,因此 length 为 6。对于字符串和二进制类型(类型 7-8):
<length>表示实际的字节数。
二进制数据传输:写入二进制数据(类型 8)时,命令返回
>并等待您发送<value>参数中指定的确切字节数。数据持久化:写入 manufacturing NVS 的数据在设备重启后仍然保留,直到被明确擦除。
偏移读取:您可以使用偏移和长度参数从键中读取部分数据,这对处理大数据块很有用。
编译时与运行时:虽然某些数据(如低功耗蓝牙服务)可以在编译时通过修改源 CSV 文件并重新生成
mfg_nvs.bin进行自定义,但AT+SYSMFG命令允许您在运行时更新某些值,无需重新编译。参考资料:有关非易失性存储 (NVS) 概念和其他 NVS 操作的更多信息,请参考 ESP-IDF NVS 文档。
出厂参数配置
factory_param 命名空间存储设备的基本出厂参数,如 Wi-Fi 配置、UART 配置和模组信息。ESP-AT 在初始化过程中会读取这些参数,它们影响设备的默认运行行为。详情请参考 出厂参数配置介绍。
重要
修改出厂参数后,执行 AT+RST 或 AT+RESTORE 命令以重启设备,使更改生效。
查询所有出厂参数
命令:
AT+SYSMFG=1,"factory_param"响应:
+SYSMFG:"factory_param","version",2 +SYSMFG:"factory_param","module_name",7 +SYSMFG:"factory_param","max_tx_power",2 +SYSMFG:"factory_param","country_code",7 +SYSMFG:"factory_param","start_channel",1 +SYSMFG:"factory_param","channel_num",1 +SYSMFG:"factory_param","uart_port",2 +SYSMFG:"factory_param","uart_baudrate",6 +SYSMFG:"factory_param","uart_tx_pin",6 +SYSMFG:"factory_param","uart_rx_pin",6 +SYSMFG:"factory_param","uart_cts_pin",6 +SYSMFG:"factory_param","uart_rts_pin",6 +SYSMFG:"factory_param","sys_store",1 OK
模组名称操作
读取模组名称:
命令:
AT+SYSMFG=1,"factory_param","module_name"响应:
+SYSMFG:"factory_param","module_name",7,6,MINI-1 OK
写入新的模组名称:
命令:
AT+SYSMFG=2,"factory_param","module_name",7,<name_length>响应:
OK >返回
>后,发送模组名称字符串。例如,发送 “MY-MODULE-01”。数据发送后的响应:
OK
验证配置是否生效:
命令:
AT+SYSMFG=1,"factory_param","module_name"响应:
+SYSMFG:"factory_param","module_name",7,12,MY-MODULE-01 OK模组名称已成功更新为 “MY-MODULE-01”。
UART 配置操作
读取 UART 端口:
命令:
AT+SYSMFG=1,"factory_param","uart_port"响应:
+SYSMFG:"factory_param","uart_port",2,1,1 OK
读取 UART 波特率:
命令:
AT+SYSMFG=1,"factory_param","uart_baudrate"响应:
+SYSMFG:"factory_param","uart_baudrate",6,6,115200 OK
更新 UART TX 引脚:
命令:
AT+SYSMFG=2,"factory_param","uart_tx_pin",6,17响应:
OK备注
重启后,需要切换硬件连接到新引脚或通过新的 UART 配置发送 AT 命令来验证修改是否生效。
最大发射功率操作
读取最大发射功率:
命令:
AT+SYSMFG=1,"factory_param","max_tx_power"响应:
+SYSMFG:"factory_param","max_tx_power",2,2,78 OK
更新最大发射功率:
命令:
AT+SYSMFG=2,"factory_param","max_tx_power",2,60响应:
OK关于可以设置的 Wi-Fi 最大发射功率值,请参考 AT+RFPOWER 命令中
<wifi_power>参数的取值范围。
重启设备使配置生效:
命令:
AT+RST响应:
ready
验证配置是否生效:
命令:
AT+SYSMFG=1,"factory_param","max_tx_power"响应:
+SYSMFG:"factory_param","max_tx_power",2,2,60 OK最大发射功率已成功更新。
使用 AT+RFPOWER 命令进一步验证:
命令:
AT+RFPOWER?响应:
+RFPOWER:60 OK最大发射功率现在为 60 (60 × 0.25 dBm = 15 dBm)。
国家代码操作
读取国家代码:
命令:
AT+SYSMFG=1,"factory_param","country_code"响应:
+SYSMFG:"factory_param","country_code",7,2,CN OK
更新国家代码:
命令:
AT+SYSMFG=2,"factory_param","country_code",7,2响应:
OK >收到
>后,发送国家代码(例如 “US”、”JP”、”EU”)。数据传输后的响应:
OK
重启设备使配置生效:
命令:
AT+RST响应:
ready
验证配置是否生效:
命令:
AT+SYSMFG=1,"factory_param","country_code"响应:
+SYSMFG:"factory_param","country_code",7,2,US OK国家代码已成功更新为 “US”。
更新信道数量为 11(美国标准):
命令:
AT+SYSMFG=2,"factory_param","channel_num",1,11响应:
OK
重启设备使配置生效:
命令:
AT+RST响应:
ready
使用 AT+CWCOUNTRY 命令验证国家码和信道配置:
命令:
AT+CWCOUNTRY?响应:
+CWCOUNTRY:0,"US",1,11 OK响应说明:
0:国家码策略(0 表示使用默认国家码配置)
"US":国家代码
1:起始信道 (start_channel)
11:信道数量 (channel_num)配置已成功生效,设备现在使用美国的国家代码和信道配置。
系统存储模式操作
sys_store 参数控制系统是否将配置更改自动存储到 flash。此参数与 AT+SYSSTORE 命令的功能相关。
读取当前系统存储模式:
命令:
AT+SYSMFG=1,"factory_param","sys_store"响应:
+SYSMFG:"factory_param","sys_store",1,1,1 OK
sys_store的值:
0:不自动存储配置到 flash(相当于AT+SYSSTORE=0)
1:自动存储配置到 flash(相当于AT+SYSSTORE=1,默认值)
更改系统存储模式为不自动存储:
命令:
AT+SYSMFG=2,"factory_param","sys_store",1,0响应:
OK
重启设备使配置生效:
命令:
AT+RST响应:
ready
验证配置是否生效:
命令:
AT+SYSMFG=1,"factory_param","sys_store"响应:
+SYSMFG:"factory_param","sys_store",1,1,0 OK
使用 AT+SYSSTORE 命令进一步验证:
命令:
AT+SYSSTORE?响应:
+SYSSTORE:0 OK系统存储模式已成功更改为不自动存储(
0表示关闭自动存储)。
更改后的影响:
当 sys_store 设置为 0 后,配置更改(如 Wi-Fi 设置或其他支持自动存储的命令)不会自动保存到 flash,重启后会恢复为之前保存的配置。受影响的命令详见 AT+SYSSTORE。
如果需要在 sys_store=0 模式下保存特定配置,可以使用 AT+SYSSTORE 命令临时启用存储,执行配置命令后再关闭。
添加自定义键值对
除了预定义的出厂参数外,您还可以在 factory_param 命名空间中添加自定义键值对来存储应用特定的配置数据。
本示例演示如何添加一个自定义键值对,例如存储设备序列号:
添加自定义字符串类型键值对:
命令:
AT+SYSMFG=2,"factory_param","device_sn",7,16响应:
OK >返回
>后,发送设备序列号(例如 “SN202601050001”)。数据发送后的响应:
OK
读取自定义键值对:
命令:
AT+SYSMFG=1,"factory_param","device_sn"响应:
+SYSMFG:"factory_param","device_sn",7,16,SN202601050001 OK
添加数值类型的自定义键值对:
命令:
AT+SYSMFG=2,"factory_param","hw_version",6,1001响应:
OK这将存储硬件版本号 1001。
查询所有键值对(包括自定义的):
命令:
AT+SYSMFG=1,"factory_param"响应:
+SYSMFG:"factory_param","version",2 +SYSMFG:"factory_param","module_name",7 ... +SYSMFG:"factory_param","device_sn",7 +SYSMFG:"factory_param","hw_version",6 OK
删除自定义键值对:
命令:
AT+SYSMFG=0,"factory_param","device_sn"响应:
OK
备注
自定义键名应避免与预定义的键名冲突(如
module_name、uart_port等)建议使用有意义的键名,便于后续维护
自定义键值对在重启后保持持久化
过多的键值对可能影响性能,建议仅存储必要的配置信息
修改
factory_param中的值后,建议重启设备以确保应用程序正确读取新值
PKI 配置
PKI(公钥基础设施)配置用于创建、管理、分配、存储和撤销数字证书,以及管理公钥加密。ESP-AT 支持为多种功能配置证书,包括 SSL 客户端/服务器、MQTT 客户端、HTTPS 客户端等。所有证书的配置方法完全相同,均通过 AT+SYSMFG 命令操作对应的命名空间实现。更多详情请参考 PKI 配置介绍。
不同功能的命名空间映射:
功能 |
证书/密钥命名空间 |
|---|---|
SSL 客户端 |
|
SSL 服务器 |
|
MQTT 客户端 |
|
HTTPS 客户端 |
|
WebSocket 客户端 |
|
WPA2 Enterprise 客户端 |
|
备注
您可以通过 AT+SYSMFG? 命令查询当前固件支持的所有命名空间,以确认您需要的证书命名空间是否可用。
本节以 SSL 证书为例说明证书配置的完整流程。其他功能的证书配置(如 MQTT、HTTPS)可参照相同方法,仅需根据上表修改对应的命名空间名称即可。
SSL 客户端证书
client_cert、client_key 和 client_ca 命名空间存储用于安全连接的 SSL 证书和密钥。这三个命名空间可以协同工作以实现 SSL 认证(单向或双向认证)。
查询证书信息
读取客户端证书命名空间中的所有键值对:
命令:
AT+SYSMFG=1,"client_cert"响应:
+SYSMFG:"client_cert","client_cert.0",8 +SYSMFG:"client_cert","client_cert.1",8 OK同样,您可以查询 client_key 和 client_ca 命名空间:
AT+SYSMFG=1,"client_key" AT+SYSMFG=1,"client_ca"
读取特定的证书或密钥:
命令:
AT+SYSMFG=1,"client_cert","client_cert.0"响应:
+SYSMFG:"client_cert","client_cert.0",8,1164,<value> OK
配置证书
写入客户端证书:
命令:
AT+SYSMFG=2,"client_cert","client_cert.0",8,1164响应:
OK >返回
>后,发送证书数据(1164 字节)。数据发送完成后,系统返回:OK
写入客户端密钥:
命令:
AT+SYSMFG=2,"client_key","client_key.0",8,<key_length>响应:
OK >返回
>后,发送密钥数据。数据发送完成后,系统返回:OK
写入 CA 证书:
命令:
AT+SYSMFG=2,"client_ca","client_ca.0",8,<ca_length>响应:
OK >返回
>后,发送 CA 证书数据。数据发送完成后,系统返回:OK
使用证书
将客户端证书、密钥(双向认证时还需客户端 CA 证书)写入 manufacturing NVS 分区后,您可以使用它们建立安全的 SSL 连接。以下是示例:
确保证书已写入 manufacturing 分区:
客户端证书存储在
client_cert命名空间客户端密钥存储在
client_key命名空间客户端 CA 证书存储在
client_ca命名空间
配置 SSL 连接使用 manufacturing 分区证书:
命令:
AT+CIPSSLCCONF=3,0,0
响应:
OK
这将配置 SSL 客户端使用 manufacturing 分区中的证书(索引为 0)。
连接到 Wi-Fi:
命令:
AT+CWJAP="your_ssid","your_password"
响应:
OK
建立到服务器的 SSL 连接:
命令:
AT+CIPSTART="SSL","example.com",8883
响应:
CONNECT OK
SSL 连接将使用 manufacturing 分区中的证书进行身份验证。
备注
有关 SSL 配置的更多详细信息,请参阅 AT+CIPSSLCCONF 命令文档。
擦除证书
擦除特定的证书:
命令:
AT+SYSMFG=0,"client_cert","client_cert.0"响应:
OK
擦除命名空间中的所有键值对:
命令:
AT+SYSMFG=0,"client_cert"响应:
OK
您可以使用相同的命令擦除 client_key 和 client_ca 数据。
SSL 服务器证书
server_cert、server_key 和 server_ca 命名空间存储设备作为 SSL 服务器所需的证书和密钥。这三个命名空间可以协同工作以启用安全的服务器端 SSL 连接(单向或双向认证)。
查询证书信息
读取服务器证书命名空间中的所有键:
命令:
AT+SYSMFG=1,"server_cert"响应:
+SYSMFG:"server_cert","server_cert.0",8 +SYSMFG:"server_cert","server_cert.1",8 OK同样,您可以查询 server_key 和 server_ca 命名空间:
AT+SYSMFG=1,"server_key" AT+SYSMFG=1,"server_ca"
读取特定的服务器证书或密钥:
命令:
AT+SYSMFG=1,"server_cert","server_cert.0"响应:
+SYSMFG:"server_cert","server_cert.0",8,<length>,<value> OK命令:
AT+SYSMFG=1,"server_key","server_key.0"响应:
+SYSMFG:"server_key","server_key.0",8,<length>,<value> OK
配置证书
写入服务器证书:
命令:
AT+SYSMFG=2,"server_cert","server_cert.0",8,<cert_length>响应:
OK >返回
>后,发送证书数据。数据传输后的响应:
OK
写入服务器密钥:
命令:
AT+SYSMFG=2,"server_key","server_key.0",8,<key_length>响应:
OK >返回
>后,发送密钥数据。数据传输后的响应:
OK
写入 CA 证书:
命令:
AT+SYSMFG=2,"server_ca","server_ca.0",8,<ca_length>响应:
OK >返回
>后,发送 CA 证书数据。数据传输后的响应:
OK
使用证书
将服务器证书、密钥(双向认证时还需服务器 CA 证书)写入 manufacturing NVS 分区后,您可以基于这些证书创建 SSL 服务器。以下是一个完整的示例:
确保服务器凭证已写入 manufacturing 分区:
服务器证书位于
server_cert命名空间服务器密钥位于
server_key命名空间服务器 CA 证书位于
server_ca命名空间(可选,仅在需要客户端认证时使用)
启用多连接模式:
命令:
AT+CIPMUX=1
响应:
OK
启动 SSL 服务器:
如果只需要服务器单向认证(服务器向客户端提供证书):
命令:
AT+CIPSERVER=1,8883,"SSL"
响应:
OK
如果需要双向认证(服务器和客户端相互验证证书):
命令:
AT+CIPSERVER=1,8883,"SSL",1
响应:
OK
其中最后一个参数
1表示启用 CA 验证,服务器将使用 manufacturing 分区中的 CA 证书验证客户端证书。
设备现在在端口 8883 上监听 SSL 连接,SSL 服务器将自动使用 manufacturing 分区中的服务器证书和密钥。
当客户端连接时,SSL 握手将使用 manufacturing 分区中的服务器证书和密钥进行身份验证。
备注
SSL 服务器会自动从 manufacturing 分区(manufacturing partition)读取
server_cert和server_key命名空间中的证书和密钥,无需额外配置。如果在 AT+CIPSERVER 命令中启用了 CA 验证(
<CA enable>= 1),服务器还会从server_ca命名空间读取 CA 证书来验证客户端证书,实现双向认证。有关 SSL 服务器配置的更多详细信息,请参阅 AT+CIPSERVER 命令文档。
擦除证书
擦除特定的服务器证书:
命令:
AT+SYSMFG=0,"server_cert","server_cert.0"响应:
OK
擦除命名空间中的所有键:
命令:
AT+SYSMFG=0,"server_cert"响应:
OK
您可以使用相同的命令擦除 server_key 和 server_ca 数据。
自定义数据存储
除了预定义的命名空间(如 factory_param、client_cert、server_cert 等)之外,您还可以创建自定义命名空间来存储自己的应用数据。这对于存储需要在重启后保留的少量持久化数据非常有用,例如自定义配置、用户偏好设置或设备特定的参数。
创建和使用自定义命名空间
本示例演示如何创建一个名为 my_app_ca 的自定义命名空间来存储应用特定的证书或配置数据。
创建新命名空间并写入数据:
命令:
AT+SYSMFG=2,"my_app_ca","my_app_ca.0",8,100响应:
OK >返回
>后,发送您的二进制数据(100 字节)。数据发送完成后,系统返回:OK命名空间
my_app_ca现已创建,其中包含一个键my_app_ca.0,存储了您的数据。
查询自定义命名空间:
命令:
AT+SYSMFG=1,"my_app_ca"响应:
+SYSMFG:"my_app_ca","my_app_ca.0",8 OK
从自定义命名空间读取数据:
命令:
AT+SYSMFG=1,"my_app_ca","my_app_ca.0"响应:
+SYSMFG:"my_app_ca","my_app_ca.0",8,100,<data> OK响应包含数据类型(8 表示二进制)、长度(100 字节)和实际数据。
向同一命名空间添加更多键:
命令:
AT+SYSMFG=2,"my_app_ca","my_app_ca.1",7,20响应:
OK >发送数据:
MyCustomConfigValue1响应:
OK
查询命名空间中的所有键:
命令:
AT+SYSMFG=1,"my_app_ca"响应:
+SYSMFG:"my_app_ca","my_app_ca.0",8 +SYSMFG:"my_app_ca","my_app_ca.1",7 OK
创建另一个命名空间存储应用配置参数:
如果您需要存储配置参数(而非证书数据),建议创建单独的命名空间以保持语义清晰。
命令:
AT+SYSMFG=2,"my_app_config","timeout",6,5000响应:
OK这将在
my_app_config命名空间中存储一个 i32 类型的配置值(类型 6),键名为 “timeout”,值为 5000。
读取配置参数:
命令:
AT+SYSMFG=1,"my_app_config","timeout"响应:
+SYSMFG:"my_app_config","timeout",6,4,5000 OK
擦除特定的键:
命令:
AT+SYSMFG=0,"my_app_ca","my_app_ca.1"响应:
OK
擦除整个命名空间:
命令:
AT+SYSMFG=0,"my_app_ca"响应:
OK
备注
自定义命名空间最佳实践:
自定义命名空间可用于存储任何类型的持久化数据
根据需求选择合适的数据类型:数值类型(1-6)用于数字,字符串(7)用于文本,二进制(8)用于证书或二进制数据
建议按用途分离命名空间:例如将证书数据(
my_app_ca)与配置参数(my_app_config)分开存储,便于管理和维护命名空间名称应具有描述性,清楚表明其用途(如
my_app_certs、my_app_settings)键名可以是任意字符串,但建议使用有意义的名称以便识别
所有自定义数据在重启后保持持久化,直到被明确擦除
自定义命名空间独立于系统命名空间,不会影响 AT 固件功能
创建自定义命名空间并存储数据后,可以使用
AT+SYSMFG?查询,在命名空间列表中看到它