Zephyr使用mcumgr

Creative Commons
本作品采用知识共享署名

本文说明zephyr如何使用mcumgr

zephyr提供device管理功能,其功能通过MCUmgr的SMP(Simple Management Protocol )实现,zephyr在device端集成了mcumgr,在host PC端通过mcumgr命令行可以进行device管理,目前主要支援下面几种功能:

  • image管理: DFU用
  • 文件系统管理:读写操作文件
  • OS管理:查看zephyr OS信息
  • 统计信息:查看zephyr static信息
  • log管理: 目前zephyr占不支援log管理
    host PC的mcumgr命令行通过BT或者串口向zephyr device传输数据或命令,zephyr device收到命令后做对应的回应。本文的操作基于host pc为ubuntu 18.04通过串讲通讯进行示例.

安装

host端

使用下面命令安装mcumgr命令行工具

1
go get github.com/apache/mynewt-mcumgr-cli/mcumgr

安装玩后执行

1
mcumgr --help

可以看见对应的子命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mcumgr helps you manage remote devices

Usage:
mcumgr [flags]
mcumgr [command]

Available Commands:
config Read or write a config value on a device
conn Manage mcumgr connection profiles
crash Send a crash command to a device
datetime Manage datetime on a device
echo Send data to a device and display the echoed back data
fs Access files on a device
help Help about any command
image Manage images on a device
interactive Run mcumgr interactive mode (used for COAP only)
log Manage logs on a device
mpstat Read mempool statistics from a device
res Access a CoAP resource on a device
reset Perform a soft reset of a device
run Run test procedures on a device
stat Read statistics from a device
taskstat Read task statistics from a device
version Display the mcumgr version number

device端

在zepyhr应用的prj.conf添加如下配置项,编译后烧写入zephyr device

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置启动mcumgr
CONFIG_MCUMGR=y

# 配置SMP可以通过UART
CONFIG_MCUMGR_SMP_UART=y
# 配置SMP可以通过BT
CONFIG_MCUMGR_SMP_BT=y

# MCUMGR支援image管理
CONFIG_MCUMGR_CMD_IMG_MGMT=y
# MCUMGR支援OS管理
CONFIG_MCUMGR_CMD_OS_MGMT=y
# MCUMGR支援统计信息
CONFIG_MCUMGR_CMD_STAT_MGMT=y
# MCUMGR支援文件系统管理
CONFIG_MCUMGR_CMD_FS_MGMT=y

使用

命令说明

一个典型通过串口的命令如下:

1
mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=115200 image list

–conntype serial: 说明mcumgr SMP走串口
–connstring=/dev/ttyUSB0,baud=115200: 说明使用串口设备是/dev/ttyUSB0,符号率是115200
image list: 子命令,查看image
也可以通过蓝牙进行操作

1
mcumgr --conntype ble --connstring ctlr_name=hci0,peer_name='Zephyr' image list

–conntype ble : mcumgr SMP走蓝牙BLE
–connstring ctlr_name=hci0,peer_name=’Zephyr’ : 使用的BLE设备为hci0
后面的介绍均以串口命令示例,如果想用蓝牙,替换–conntype和–connstring即可

image管理

zephyr的DFU功能主要使用mcumgr的image管理功能完成,在zephyr使用DFU有详细介绍,这里列一下命令:
列出device内image
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image list
将image下载到devie
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image upload
设置下一次启动时的image
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image test
设置当前image为主image
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image confirm
将device上未使用(slot0)的image删除
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image erase

OS管理

zephyr OS管理的命令只有一条用于查看OS状态
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 taskstat
可以看到运行了的zephyr有3个task,可以看到task name,优先级,tid,stack大小,stack使用量

1
2
3
4
    task pri tid  runtime      csw    stksz   stkuse last_checkin next_checkin
idle 15 1 0 0 80 12 0 0
main 0 2 0 0 256 133 0 0
sysworkq 255 0 0 0 512 158 0 0

要获得task信息,编译image时还需要添加如下配置选项

1
2
3
4
CONFIG_THREAD_MONITOR=y
CONFIG_THREAD_STACK_INFO=y
CONFIG_THREAD_NAME=y
CONFIG_INIT_STACKS=y

由于mcumgr port目前还不完善,task name和stksz,stkuse都不能正常显示,之前提交的PR https://github.com/zephyrproject-rtos/mcumgr/pull/2 正在等待merge,之前大家可以自行merge使用

统计信息管理

zephyr有一个stats模块(subsys/stats/),可被用于其它模块进行统计,zephyr的mcumgr stats port实现会收集这些统计信息送个host,代码实例可以参考samples/subsys/mgmt/mcumgr/smp_svr,这里不做分析,是说明mcumgr命令行的使用
列出支援的统计信息列表
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 stat list
可以看见

1
2
stat groups:
smp_svr_stats

显示指定模块的统计信息
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 stat smp_svr_stats
可以看到

1
2
stat group: smp_svr_stats
1286 s0

文件系统管理

文件系统可以通过主机向zephyr device上传和下载文件,前提是device必须支援文件系统,例如配置nffs

1
2
3
4
5
# 加入Flash文件系统
CONFIG_FLASH=y
CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_NFFS=y
CONFIG_FS_NFFS_FLASH_DEV_NAME="NRF_FLASH_DRV_NAME"

上传文件
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 fs upload ./ver /nffs/upver
上面命令是上传本地文件ver到device的/nffs/为upver
下载文件
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 fs download /nffs/upver downver
上面命令是下载device的/nffs/upver为本地的downver
注意:无论上传还是下载,device的文件地址必须是device上fs的全路径。

其它命令

除了上面命令外,目前zephyr device还支援下面两个命令:
echo检查device mcumgr回应:下面命令如果device在线会回应hello
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 echo hello
重启device:
mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 reset

mcumgr配置管理

每次下mcumgr命令都加上–conntype serial –connstring=/dev/ttyUSB0,baud=115200是不是觉得很麻烦,mcumgr提供config profile解决该问题:
添加conn profile serial0:
mcumgr conn add serial0 type=serial connstring=”/dev/ttyUSB0,baud=115200”
查看image(等同于mcumgr –conntype serial –connstring=/dev/ttyUSB0,baud=115200 image list):
mcumgr image list -c serial0
查看conn profile:
mcumgr conn show
将看到

1
2
Connection profiles: 
serial0: type=serial, connstring='/dev/ttyUSB0,baud=115200'

删除profile serial0:
mcumgr conn delete serial0

参考

https://docs.zephyrproject.org/latest/guides/device_mgmt/index.html
https://github.com/apache/mynewt-mcumgr
https://github.com/apache/mynewt-mcumgr-cli