获取 Azure Sphere 设备调试输出
开发 IoT 解决方案时,通常需要有权调试设备的输出。 虽然可以通过调试连接到 Visual Studio/Code (来实现此目的, 但也可以从命令行) 实现 ,但可能还需要查看未连接到 Visual Studio/Code 的设备的调试输出。 此类设备可能正在运行长期测试,甚至可能部署到生产环境。 有几个选项可用于访问调试数据:
- 从连接到开发电脑的设备获取调试输出
- 获取未连接到开发电脑的设备的调试输出
- 记录到外部存储
- 日志记录到 Azure
从连接到开发电脑的设备获取调试输出
问题: 使用 Visual Studio/Visual Code 进行调试时如何获取调试输出?
选项:
高级应用程序
Azure Sphere 高级应用程序可以在调试期间使用 Log_Debug API 将带有 printf 样式格式的调试输出发送到附加的电脑。 可以使用 Visual Studio、Visual Studio Code调试窗口或命令行查看此输出。
你可能想要考虑在应用程序中设置调试详细标志,并使用 CMake 编译定义来控制应用程序运行时显示的调试输出量。 在 CMakeLists.txt 文件中,可以创建编译时定义:
add_compile_definitions(DEBUG_FLAG)
然后,在高级应用程序代码中,可以使用 增加或减少应用程序
#ifdef
显示的调试输出量,例如:
#ifdef DEBUG_FLAG
Log_Debug("My Message\n");
#endif
支持实时的应用程序
支持 Azure Sphere 实时的应用程序 (其中一个 M4 核心上运行,) 可以将调试/日志信息写入 专用 M4 仅传输 UART。 这需要 USB/串行适配器(如 FTDI 友元)和 终端仿真器。
Azure Sphere Hello World示例演示如何打印到 M4 调试 UART。
CodeThink 和 MediaTek 还提供了示例应用程序:
调试标志编译时定义也可用于支持实时 (M4) 应用程序。
使用核心间通信将状态从支持实时的应用程序发送到高级应用程序
如果要构建一个结合了高级且支持实时的应用程序的系统,则可能需要使用高级应用程序来记录这两个应用程序的系统状态。 为此,可以使用核心间通信 - Azure Sphere 核心间通信示例 实现了一个简单的接口,用于在支持高级和实时的应用程序之间传递消息。
本 Azure Sphere 学习模块 演示如何使用 Azure Sphere 和 Azure RTOS,结合核心间消息传递模型在核心之间传递自定义消息。
获取未连接到开发电脑的设备的调试输出
问题: 当设备未连接到开发电脑时,如何记录调试输出?
选项:
通过网络或 UART 发送调试输出
当设备连接到开发电脑时获取调试日志信息相当简单。 但是,当设备未连接到电脑时,你可能还需要收集调试/记录信息。 例如,你可能有一组运行长期测试的设备。
如果设备已连接到网络,则可能需要通过网络将调试输出发送到可以收集和分析信息的应用程序。 此 Azure Sphere 库应用程序 演示如何重写默认Log_Debug行为,以通过 UDP 套接字发送和接收该输出。
请注意,用于替代默认的高级别应用程序Log_Debug行为的机制也可用于将调试日志信息发送到其他位置,例如,在某个 Azure Sphere UART 上输出数据。 可以使用此 UART 示例 作为引用,与 UDPDebugLog 库应用程序结合使用,将消息记录到 UART。
将调试输出发送到 Azure IoT 中心/Azure IoT Central
虽然调试输出可用于在发生问题时诊断问题,但存储设备中的遥测/日志信息以供后期处理也很有用。
设置 Azure IoT 中心 或 Azure IoT Central 实例提供了一个终结点,用于发送可用作业务逻辑一部分的设备遥测数据,还可以发送可与遥测/业务数据分开处理的设备状态/日志信息。
日志记录到 Azure 示例演示如何将日志消息转发为IoT 中心遥测数据,并将其存储在 Azure 数据资源管理器 群集中,以便进行高级查询。
Azure IoT 中心
可以将 Azure IoT 中心 实例配置为将数据发送到 Azure 数据库进行存储/分析,你可能还需要筛选消息,这可以通过 EventHub 和 Azure 函数实现。
对于Azure IoT 中心可以将数据发送到 Azure 函数,后者随后可以处理消息。 Azure Functions Azure IoT 中心触发器一文介绍了如何将 Azure 函数链接到Azure IoT 中心实例。
Azure IoT Central
Azure IoT Central 包括将数据持续导出到各种终结点的功能,包括:
- Azure 事件中心
- Azure 服务总线队列
- Azure 服务总线主题
- Azure Blob 存储
- Webhook
WebHook 是创建的 REST API 终结点,可以是 Azure 函数。
请注意,你可能希望根据发送数据的设备 ID 在 Azure 函数中筛选消息,可以使用 Azure 函数中的以下代码获取设备 ID:
public static async Task Run(EventData message, ILogger log)
{
var deviceId=message.SystemProperties["iothub-connection-device-id"];
// Code to filter the messages goes here...
}
Azure IoT 中心 和 Azure IoT Central 支持设备孪生,其中包括IoT 中心/Central 应用程序) 中设置的所需状态 (,以及设备) 报告的状态 (状态。 可以使用 Azure IoT 中心/Central 设备孪生设置所需的日志数据详细程度状态, (增加/减少日志记录频率或日志记录数据) 的丰富性。
Azure IoT 示例演示如何处理设备孪生Desired State
更改。
将数据记录到存储
Azure Sphere 为高级应用程序支持高达 64KB 的 可变存储 , 这可用于保存设置、应用程序状态或其他数据,应用程序开发人员负责将数据序列化/反序列化到可变存储 - Azure Sphere 库包含一 个项目 ,该项目演示如何使用键/值对 (字典) 将状态写入/读取可变存储, (最多 64KB,具体取决于应用程序清单) 的配置方式。
你可能希望将超过 64KB 的日志/状态数据写入某种形式的外部存储,这对于具有间歇性连接或需要存储/检索超过 64KB 的数据的设备可能很有用。
一种选择是添加外部存储,可能使用 SPI 闪存来存储数据 - 此项目 使用 SPI 闪存存储下游设备的无线更新,并且可以对其进行修改,以支持记录 Azure Sphere 应用程序中的遥测/状态数据。