McuManager 0.12.0

McuManager 0.12.0

Brian Giori维护。



McuManager 0.12.0

  • Brian Giori

McuManager iOS

为iOS实现的McuManager协议(也称为Newt Manager (NMP)、Simple Management Protocol (SMP))的可传输方案。

安装

Swift包管理器

在Xcode中,转到文件 → Swift包 → 添加包依赖...并添加https://github.com/JuulLabs-OSS/mcumgr-ios.git

CocoaPods

pod 'McuManager', '~> 0.12.0'

介绍

McuManager是一种应用层协议,用于管理和监控运行Apache Mynewt和Zephyr的微控制器。更具体地说,McuManager实现了空中升级(OTA)固件更新、日志和统计信息收集以及文件系统和配置管理。

命令组

McuManager按照功能划分为命令组。在《mcumgr-ios》中,命令组被称为管理器,并扩展了《McuManager》类。《mcumgr-ios》中实现的管理器(组)包括以下几种:

  • DefaultManager:包含与操作系统相关的命令。这包括任务和内存池统计信息、设备时间读写和设备重置。
  • ImageManager:管理设备上的图像状态并执行图像上传。
  • StatsManager:从设备读取统计信息。
  • ConfigManager:在设备上读写配置值。
  • LogManager:从设备收集日志。
  • CrashManager:在设备上运行崩溃测试。
  • RunTestManager:在设备上运行测试。
  • FileSystemManager:从设备文件系统下载/上传文件。

固件升级

固件升级通常是一个四步骤的过程,使用来自《image》和《default》命令组的命令执行:上传《upload》测试《test》重置《reset》和确认《confirm》。

这个库提供了一个方便的《FirmwareUpgradeManager》用于升级设备上运行的图像。

FirmwareUpgradeManager

《FirmwareUpgradeManager》提供了在设备上执行固件升级的便捷方式。必须使用定义传输方式和设备的《McuMgrTransport》对《FirmwareUpgradeManager》进行初始化。初始化后,一次只能执行一个固件升级。使用《start(data: Data)》方法启动固件升级,可以使用《pause()`暂停、《resume()`恢复》和《cancel()`取消》分别暂停、恢复和取消。

示例

// Initialize the BLE transporter using a scanned peripheral
let bleTransport = McuMgrBleTransport(cbPeripheral)

// Initialize the FirmwareUpgradeManager using the transport and a delegate
let dfuManager = FirmwareUpgradeManager(bleTransport, delegate)

// Start the firmware upgrade with the image data
dfuManager.start(data: imageData)

固件升级模式

McuManager的固件升级可以以多种方式完成。这些不同的升级模式决定了在上传步骤后发送的命令。通过设置mode属性,可以使用FirmwareUpgradeManager来配置这些升级变体。不同的固件升级模式如下:

  • .testAndConfirm:由于该模式能够从错误的固件升级中恢复,因此是执行升级的默认且推荐模式。该模式的处理过程包括上传测试重置确认
  • .confirmOnly:不推荐使用此模式。如果设备无法启动到新映像,则无法恢复,需要重新烧录。该模式的处理过程是上传确认重置
  • .testOnly:如果您想在确认将其作为主引导映像之前对新映像运行测试,则此模式很有用。该模式的处理过程是上传测试重置

固件升级状态

FirmwareUpgradeManager扮演一个简单、主要线性的状态机,由mode确定。随着管理器通过固件升级过程,状态改变通过FirmwareUpgradeDelegateupgradeStateDidChange方法提供。

FirmwareUpgradeManager包含一个附加的状态,即validate,在上传之前执行。在尝试跳过固件升级的某些状态的同时,validate状态检查设备当前映像的状态。例如,如果要升级的映像已经存在于设备的槽位1中,则FirmwareUpgradeManager将跳过上传并直接从validate转到测试(或如果已设置.confirmOnly模式,则转到确认)。如果已上传的映像已经在槽位0中激活并确认,则升级将立即成功。简而言之,validate状态可以轻松重新尝试升级,而无需重新上传映像或手动确定从何处开始。

日志记录

在管理器中设置logDelegate属性,可以访问低级日志,这些日志可以帮助调试应用程序和您的设备。信息将按6个日志级别进行记录,从.debug.error,并且额外包含一个McuMgrLogCategory,该类别标识了源组件。此外,McuMgrBleTransportlogDelegate属性提供了对BLE传输日志的访问。

示例

// Initialize the BLE transporter using a scanned peripheral
let bleTransport = McuMgrBleTransport(cbPeripheral)
bleTransporter.logDelegate = UIApplication.shared.delegate as? McuMgrLogDelegate

// Initialize the DeviceManager using the transport and a delegate
let deviceManager = DeviceManager(bleTransport, delegate)
deviceManager.logDelegate = UIApplication.shared.delegate as? McuMgrLogDelegate

// Send acho
deviceManger.echo("Hello World!", callback)

OSLog 集成

McuMgrLogDelegate 可以轻松与 统一的日志系统 集成。示例可在示例应用程序中的 AppDelegate.swift 中找到。该文件中的一个 McuMgrLogLevel 扩展将日志级别转换为 OSLogType 级别之一。同样,McuMgrLogCategory 扩展将类别转换为 OSLog 类型。

为 McuManager 开发

克隆仓库,安装 pods。

git clone https://github.com/JuulLabs-OSS/mcumgr-ios.git
cd mcumgr-ios/Example
pod install

在 Xcode(或其他 IDE)中打开 mcumgr-ios/Example/Example.xcworkspace。McuManager 的开发 pod 应位于 Pods -> Development Pods -> McuManager