Zephyr使用mcumgr

本文说明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命令行工具

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

安装玩后执行

mcumgr --help

可以看见对应的子命令

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

# 配置启动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

使用 链接到标题

命令说明 链接到标题

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

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 也可以通过蓝牙进行操作

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使用量

      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时还需要添加如下配置选项

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 可以看见

stat groups:
    smp_svr_stats

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

stat group: smp_svr_stats
      1286 s0

文件系统管理 链接到标题

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

# 加入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 将看到

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