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
确定。随着管理器通过固件升级过程,状态改变通过FirmwareUpgradeDelegate
的upgradeStateDidChange
方法提供。
FirmwareUpgradeManager
包含一个附加的状态,即validate
,在上传
之前执行。在尝试跳过固件升级的某些状态的同时,validate
状态检查设备当前映像的状态。例如,如果要升级的映像已经存在于设备的槽位1中,则FirmwareUpgradeManager
将跳过上传
并直接从validate
转到测试
(或如果已设置.confirmOnly
模式,则转到确认
)。如果已上传的映像已经在槽位0中激活并确认,则升级将立即成功。简而言之,validate
状态可以轻松重新尝试升级,而无需重新上传映像或手动确定从何处开始。
日志记录
在管理器中设置logDelegate
属性,可以访问低级日志,这些日志可以帮助调试应用程序和您的设备。信息将按6个日志级别进行记录,从.debug
到.error
,并且额外包含一个McuMgrLogCategory
,该类别标识了源组件。此外,McuMgrBleTransport
的logDelegate
属性提供了对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
。